【问题标题】:How does Windows give 4GB address space each to multiple processes when the total memory it can access is also limited to 4GB当 Windows 可以访问的总内存也限制为 4GB 时,Windows 如何将 4GB 地址空间分配给多个进程
【发布时间】:2012-09-08 20:23:10
【问题描述】:

Windows 如何为多个进程分别分配 4GB 地址空间 当它可以访问的总内存也被限制为 4GB 时。

我在 Windows 内存管理中找到的上述问题的解决方案 (作者:Pankaj Garg)

解决方案:

为了实现这一点,Windows 使用 x86 处理器(386 和 以上)称为分页。分页允许软件使用不同的 内存地址(称为逻辑地址)比物理内存 地址。处理器的分页单元将此逻辑地址转换为 物理地址透明。这允许在 系统拥有自己的 4GB 逻辑地址空间。

谁能帮助我以更简单的形式理解它?

【问题讨论】:

    标签: windows memory-management process operating-system virtual-address-space


    【解决方案1】:

    基本思想是您的物理 RAM 有限。一旦它填满,你就开始在硬盘上存储东西。当一个进程请求当前在磁盘上的数据,或者请求新的内存时,您通过将其传输到磁盘从 RAM 中踢出一个页面,然后将您实际需要的数据分页。

    操作系统维护一个称为page table 的数据结构,以跟踪哪些逻辑地址对应于当前物理内存中的数据以及磁盘上的哪些内容。

    每个进程都有自己的虚拟地址空间,并使用该空间内的逻辑地址进行操作。操作系统负责将给定进程和逻辑地址的请求转换为磁盘上的物理地址/位置。它还负责防止进程访问属于其他进程的内存。

    当进程请求当前不在物理内存中的数据时,会触发page fault。发生这种情况时,操作系统会选择一个页面移动到磁盘(如果物理内存已满)。有几个page replacement algorithms 用于选择要退出的页面。

    【讨论】:

    • 很抱歉提出了这个非常老的问题,但是如果程序需要的数据只有一部分在 RAM 上,其余的在硬盘上,它还能运行吗?
    【解决方案2】:

    错误的原始假设是“当它可以访问的总内存也被限制为 4GB 时”。这是不真实的,操作系统可以访问的总内存没有那么有限。

    32 位代码可以访问的 32 位地址存在限制。它是 (1 ABCD、App2 - ABEF、App3 - ABCF。应用程序看到 4,但操作系统管理 6。

    32 位平面内存模型的限制并不意味着整个操作系统都受到相同的限制。

    【讨论】:

      【解决方案3】:

      Windows 使用一种称为虚拟内存的技术。每个进程都有自己的内存。这样做的原因之一是出于安全原因,禁止访问其他进程的内存。

      正如您所指出的,分配的虚拟内存可以大于实际的物理内存。这就是分页过程发挥作用的地方。我对内存管理和微架构的了解有点生疏,所以我不想发布任何错误,但我建议阅读http://en.wikipedia.org/wiki/Virtual_memory

      如果您对更多文献感兴趣,我建议您阅读“结构化计算机组织 – Tannenbaum”

      【讨论】:

        【解决方案4】:

        虚拟地址空间不是 RAM。这是一个地址空间。每个page(页面大小取决于系统)都可以取消映射(页面无处可访问。它不存在),映射到文件(页面不可直接访问,其内容存储在磁盘),映射到 RAM(即您可以实际访问的页面)。

        映射到 RAM 的页面可以是可交换的或固定的。固定页面永远不会被换出到磁盘。可交换页面与磁盘上的某个区域相关联,并且可以写入该区域以释放它们正在使用的 RAM。

        映射到 RAM 的页面也可以是只读、只写、读写。如果它们是可写的,它们可能是直接可写的或写时复制的。

        多个页面(在同一地址空间内和跨不同地址空间)可以被相同地映射。这就是两个独立进程如何访问内存中相同数据的方式(这可能发生在每个进程的不同地址)。

        在现代操作系统中,每个进程都有自己的地址空间。在 32 位操作系统上,每个进程都有 4GiB 的地址空间。在 64 位操作系统上,32 位进程仍然只有 4GiB(4 GB 字节)的地址空间,但 64 位进程可能有更多。通常它们有 18 EiB(18 个 exabinary 字节,即 18,874,368 TiB)。

        地址空间的大小完全独立于 RAM 内存的数量和实际分配的空间数量。在具有 1 GB RAM 的机器上,您可以拥有 100 个进程,每个进程具有 18 EiB 的地址空间。事实上,自从典型的机器只有几兆字节或 RAM 时,Windows 就一直为每个进程提供 4GiB 的地址空间。

        【讨论】:

          【解决方案5】:

          假设上下文是 32 位系统:

          除了http://en.wikipedia.org/wiki/Virtual_memory,不过内核给每个进程的内存抽象是4GB,一个进程实际上可以使用的远小于4GB,因为在每个进程中内核也映射在了大部分的page中过程。通常在 NT 系统中 4GB 中,2GB 被内核使用,而在 *nix 系统中,1GB 被内核使用。

          【讨论】:

          • 补充:在 32 位 Windows 中有一个 3GB 的选项(内核虚拟空间 1GB,用户虚拟空间 3GB)。
          【解决方案6】:

          很久以前,我在以 Windows 为案例研究的操作系统课程中读到了这篇文章。我给出的数字可能不准确,但它们可以让你对幕后发生的事情有一个不错的了解。据我所知:

          在 windows 中使用的内存模型是Demand Paging。在 Intel 上,页面大小为 4k。最初,当您运行一个程序时,每个 4K 页面仅从您的程序加载 4 个页面。这意味着总共分配了 16k 的内存。程序可能更大,但没有必要一次将整个程序加载到内存中。其中一些页面是数据页面,即在变量和数据结构所在的位置可读取/可写入。而另一个是包含可执行代码的代码页,即代码段。 IP 设置为代码段的第一条指令,程序在分配了 4GB 的印象下开始执行。

          当需要更多页面,即您请求更多内存(数据段)或您的程序进一步执行并需要其他可执行指令(代码段)时,Windows 检查是否有足够的可用内存量。如果是,则这些页面被加载并映射到进程的地址空间。如果没有太多可用内存,则 Windows 会检查哪些页面已经有一段时间没有使用(这对所有进程运行,而不仅仅是调用进程)。当它找到这样的页面时,它会将它们移动到 Paging 文件以释放内存空间并加载请求的页面。

          如果有时您的程序从某个已加载的 dll 调用代码,则窗口只是将这些页面映射到您的进程的地址空间。无需再次加载这些页面,因为它们已经在内存中可用。从而避免重复并节省空间。

          所以理论上进程使用的内存比可用内存多,它们可以使用 4GB 内存,但实际上一次只加载进程的一部分。

          (如果你觉得有用,请标记我的答案)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-04
            • 1970-01-01
            • 2023-03-23
            • 2012-07-02
            • 1970-01-01
            • 2012-07-01
            • 2011-10-20
            相关资源
            最近更新 更多