Windows 何时决定从工作集中拉出页面?

Windows 何时决定从工作集中拉出页面?

我正在使用 SysInternals 的 RAMMap 工具查看物理内存的分布情况。分布情况(见下图)显示

  1. 可用(清零)内存列表中有 1.7 GB
  2. 工作集列表中有 1.2 GB
  3. 待机列表中有 550 MB
  4. 已修改列表中有 125 MB

    在此处输入图片描述

我理解,当进程需要内存时,Windows 会按照空闲(清零)-> 待机-> 已修改的顺序在列表中搜索内存。因此,只要我们有空闲页面框架,所有内容都应该在工作集列表或空闲列表中。

  1. 这个假设正确吗?
  2. 如果是这样,为什么我们在“已修改”列表中看到 125 MB 的页面?
  3. 一般来说,即使还有可用内存,Windows 何时会决定将页面从工作集列表拉出到已修改/待机列表?

我正在使用 Windows 7,安装了 4.0 GB 的 RAM,其中 3.5 GB 可用。

答案1

  1. 否。如果要从磁盘读取页面,或者从内核模式分配页面,则首先检查空闲列表,然后检查清零列表。如果不从磁盘读取页面,则首先检查清零列表,然后检查空闲列表(如果从空闲列表分配页面,则在故障进程看到页面之前,页面将在线清零)。在这两种情况下,接下来检查备用列表。我不认为修改列表曾经用于解决页面错误(除了软错误,这些错误已解决到修改列表上的页面)...因为必须先将页面写入磁盘,然后才能将其分配给其他用途...因此,不妨等待修改页面写入器执行其常规操作,然后页面将显示在备用列表中。

1a. “只要我们有空闲的页面框架,所有内容就应该在工作集列表或空闲列表中。” 不。备用列表被视为“可用”,但直到有人需要该 RAM 时,其页面才会用于两种不同类型的缓存。

第二个问题(愚蠢的自动列表格式总是从“1”开始):这相当多。您是否删除了页面文件?

第三个问题:首先,请记住,每个进程都有一个工作集列表,而不仅仅是一个。每个进程都有自己的“限制”。当强制执行限制时(如果有足够的可用 RAM,则不会),进程必须为其在新页面中发生故障而放弃一个页面。还有一个工作集回收过程,它试图缩小长时间空闲的进程。

当进程丢失页面时,如果该页面在工作集中时被“修改”类型的操作数触碰过,则该页面将进入修改列表,否则将进入待命列表。如果该进程在将页面分配给其他用途或进程之前对该页面发生故障,则可以将其带回进程工作集,而无需将其写入磁盘。(这是“软”页面故障的常见示例。)通过这种方式,这些列表形成了一种对所有进程工作集的通用系统范围扩展。但待命列表中的所有内容仍算作“可用”内存的一部分,因为它可以立即被任何其他进程使用 - 无需写入磁盘。

从 Vista 开始,出现了一个新概念,称为内存优先级。待机列表中优先级较低的页面可以重新分配,供新的主动文件缓存 SuperFetch 使用。但这不会占用任何“可用”内存,因为它们仍在待机列表中。(旧的反应性缓存仍然存在;它曾经是系统工作集的一部分;从 Windows 7 开始,它有自己的缓存。)

这只是冰山一角。Windows 内部原理有 200 页,足够写成一本小书了。但如果你真的想理解这些内容,那就真的没有替代品了。

相关内容