3

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

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

解决方案:

为了实现这一点,Windows 使用 x86 处理器(386 及更高版本)称为分页的功能。分页允许软件使用与物理内存地址不同的内存地址(称为逻辑地址)。处理器的分页单元透明地将这个逻辑地址转换为物理地址。这允许系统中的每个进程都有自己的 4GB 逻辑地址空间。

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

4

6 回答 6

6

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

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

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

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

于 2012-09-16T08:22:33.967 回答
3

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

32 位代码可以访问的 32 位地址存在限制。它是 (1 << 32),即 4 GB。然而,这只是同时访问的数量。想象一下操作系统有卡 A、B、...、F,而应用程序一次只能访问四个。App1 可能会看到ABCDABEFApp2-,App3- ABCF。应用程序看到 4,但操作系统管理 6。

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

于 2012-09-16T08:30:52.537 回答
2

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

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

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

于 2012-09-16T08:20:26.937 回答
1

虚拟地址空间不是 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 的地址空间。

于 2012-09-16T11:29:11.457 回答
0

假设上下文是 32 位系统:

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

于 2012-09-16T08:35:17.823 回答
0

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

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

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

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

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

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

于 2013-08-21T06:13:27.610 回答