32 位 Windows 中的内存管理

32 位 Windows 中的内存管理

在 32 位系统中,4GB 虚拟地址空间是用于整个操作系统还是用于单个进程?

如果它适用于整个操作系统,那么操作系统是否会欺骗每个进程,使其拥有自己的 4GB 地址空间?

当一个进程启动时,它会利用所有的虚拟地址空间吗?这就是我们所说的提交或保留虚拟地址吗?

我们如何才能知道一个进程需要多少虚拟地址空间?如果一个进程需要的虚拟地址超过 3 GB(扩展用户模式系统),该怎么办?

答案1

在 32 位系统中,4GB 虚拟地址空间是用于整个操作系统还是用于单个进程?

每个进程都有自己的 4GB 虚拟地址空间,其中 2GB 用于内核空间。在 32 位 Windows 中,您可以使用LARGEADDRESSAWARE随着/3GB启动选项将内核空间减少到 1GB

操作系统将获得更宽的地址总线聚丙烯酰胺凝胶电泳所以它实际上可以寻址超过 4GB 的 RAM。

如果它适用于整个操作系统,那么操作系统是否会欺骗每个进程,使其拥有自己的 4GB 地址空间?

这根本就不是愚弄。虚拟地址 != 物理地址。无论物理 RAM 的数量如何,每个进程始终都有自己的 4GB 地址空间,这样它就不会弄乱其他进程的数据。即使只有 128MB RAM,您仍然有 4GB 地址空间。这是因为 32 位程序中的指针始终是 32 位宽。地址空间不仅用于 RAM,还用于 MMIO 设备,并且进程还可以将文件直接映射到其地址空间

如果系统有超过 4GB 的 RAM,那么该进程可以使用异戊烯醇将更高的地址映射到 4GB 窗口,以便它可以访问所有可用内存。或者它也可以创建多个进程,例如Adobe Premiere CS4为了利用超过单个进程的内存限制

当一个进程启动时,它会利用所有的虚拟地址空间吗?这就是我们所说的提交或保留虚拟地址吗?

进程有 2-4GB 的地址空间,但当然这取决于进程需要多少内存。如果进程请求的内存多于可用内存,但实际上没有写入该区域,那么它实际上并没有消耗任何内存。这称为过度承诺并且是Linux 中允许但是 Windows不允许您分配超过总 RAM + 可用页面文件的数量

我们如何才能知道一个进程需要多少虚拟地址空间?如果一个进程需要的虚拟地址超过 3 GB(扩展用户模式系统),该怎么办?

虚拟地址空间始终为 2/3/4 GB,除非您更改为具有超过 32 位虚拟地址的体系结构,否则您无法拥有更多。需要超过 3GB 的 RAM 是另一个问题。在这种情况下,有几种解决方案

  • 在 64 位 Windows 中使用 运行该进程LARGEADDRESSAWARE,在这种情况下它可以访问 4GB 内存
  • 使用多个流程,如上面的 Premiere CS4 示例
  • 使用异戊烯醇正如刚才提到的
  • 重写算法,使其使用更少的内存,如果你有源代码
  • 使用 64 位版本的程序

如果我在 32 位 Windows 上运行 3 个进程,每个进程的设计要求是 1 GB RAM。2GB RAM 系统上会出现内存分配问题吗?

通常不会有问题,因为其中一些可以移动到页面文件。但当然会慢很多

如果不是,Windows 如何实现这一点?进程的所有虚拟地址空间是否都分配了物理内存中的物理地址,还是一种惰性分配,即仅在访问该虚拟地址时才进行映射?

整个虚拟地址是不是映射线性地作为一大块进入物理地址空间。内存被映射到页面因此,进程的地址空间中会有很多未定义的地址,如下所示

分页表

此外,一些物理页面将出现在多个虚拟地址空间中,以便进程可以共享其数据。一些标记为只读的共享页面在写入时也会自动被克隆以节省内存。这称为写时复制

您需要先阅读有关虚拟内存的内容

答案2

每个进程都会创建一个 4 GB 的虚拟地址空间,由操作系统和进程共享。操作系统决定边界(对于所有进程都是固定的)。
操作系统存在于每个虚拟地址空间中。
换句话说“进程确实有自己的 4GB 地址空间”但必须与操作系统共享,并且不能读取、写入或执行内核拥有的虚拟内存部分。

如果我在 32 位 Windows 上运行 3 个进程,每个进程的设计要求是 1 GB RAM。2GB RAM 系统上是否存在内存分配问题。如果没有,Windows 如何实现这一点?

用户进程无权要求驻留的物理内存(即不能交换出去)。
由于虚拟内存方案使用交换(使用页面文件或大容量存储设备上的交换空间),因此通常情况下,在物理内存小于虚拟大小的情况下运行多个 4 GB 虚拟地址空间的进程不会出现问题。

如果进程产生大量内存需求并且没有足够的物理内存和交换空间,则可能会出现内存不足(又称 OOM)的情况。

进程的所有虚拟地址空间是否都分配了物理内存中的物理地址,或者它是一种惰性分配,即仅在访问该虚拟地址时才进行映射?

从来没有要求整个程序必须分配物理内存并加载到内存中。进程
的物理内存映射基于需求。
进程仅在实际执行时才需要驻留在内存中,并且至少无论其大小如何,只有程序计数器寄存器当前引用的一页代码和任何数据引用的页面必须实际驻留。

所以是的“惰性分配,仅在访问虚拟地址时才进行映射”,又称为需求分页。

答案3

不,这不是开玩笑,整个操作系统最多只有 4GB 的 RAM。

您可以启用 PAE,有时如果可行,Windows 可以识别超过 4GB 的空间。但仍然远不及 64 位操作系统。

相关内容