Windows 中的系统文件缓存使用了 RAM 的哪一部分?

What part of the RAM is used by the system file cache in Windows?

根据关于 the page cache and this answer 的一般概念,系统文件缓存基本上使用所有其他进程未使用的 RAM。据我所知,Linux.

中的页面缓存就是这种情况

由于 "free RAM" 的概念在 Windows 中有点模糊,我的问题是,系统文件缓存使用 RAM 的哪一部分?比如任务管理器里的"Available RAM"是一样的吗?

是的,文件缓存使用的 RAM 本质上是任务管理器中显示为可用的 RAM。但不完全是。我将详细介绍并解释如何更精确地测量它。

文件缓存不是任务管理器中进程列表中列出的进程。然而,从 Vista 开始,它的内存就像一个进程一样被管理。因此,我将解释一些进程的内存管理,文件缓存是一个特例。

在Windows中,进程使用的RAM本质上有两种状态:"Active"和"Standby":

  • "Active" RAM 在任务管理器和资源监视器中显示为 "In Use"。它也是任务管理器中每个进程显示的 RAM。
  • "Standby" RAM 在资源监视器中全局可见,对于每个进程 RAMMap

"Standby" + "Free" 内存就是任务管理器中所谓的"Available"。 "Free" RAM 在 Windows 中趋于接近 0,但您可以有意义地考虑备用 RAM 也是免费的。

备用内存被认为是"not used for a while by the process"。它是 RAM 的一部分,将用于为需要它的进程提供新内存。但它仍然属于进程,如果所属进程突然访问它(系统认为不太可能),则可以直接使用它。

因此文件缓存有 "Active" RAM 和 "Standby" RAM。 "Active" RAM 在某种程度上是最近访问的数据的缓存。 "Standby" RAM 是刚才访问过的数据的缓存。文件缓存的 "Active" RAM 通常比较小。文件缓存的备用 RAM 通常是您计算机的所有 RAM:总 RAM - 所有进程的活动 RAM。实际上,其他进程很少有备用 RAM,因为如果您经常使用磁盘 I/O,它往往会进入文件缓存。

这是 RAMMap 为执行大量 I/O 和计算的繁忙服务器显示的信息:

文件缓存是名为 "Mapped file" 的第二行。看到这 32 GB 的大部分要么在其他进程的 Active 部分,要么在文件缓存的 Standby 部分。

所以最后,是的,文件缓存使用的 RAM 本质上是任务管理器中显示为可用的 RAM。如果你想更确定地测量,你可以使用RAMMap。

您的回答不完全正确。

文件缓存,也称为系统缓存,描述了一系列 虚拟地址 ,它有一个由 MmSystemCacheWs 跟踪的物理工作集,并且工作集是系统上所有映射文件物理页的子集

系统缓存是一系列虚拟地址,因此是指向映射文件页面的 PTE。映射的文件页面由创建映射的进程引入或由系统缓存管理器引入以响应文件读取。

文件缓存响应读取所需的现有页面成为系统工作集的一部分。如果映射文件中的页面不存在,则将其调入并成为系统工作集的一部分。当页面在多个工作集中(即系统和进程或进程和另一个进程)时,它被认为在 VMMap 等程序的共享工作集中。

实际映射的文件页面本身由一个节对象控制,每个文件一个,数据控制区域(用于文件)和文件的子节对象,以及文件的段对象,原型 PTE 用于文件。这些在进程第一次为文件创建映射对象时创建,或者系统缓存管理器第一次为文件创建映射对象(部分对象)时创建,因为它需要访问文件以响应文件 IO 操作由进程执行。

当系统缓存管理器需要从文件中读取时,它一次映射文件的 256KiB 视图,并在 VACB 对象中跟踪视图。进程映射文件的可变视图,通常是整个文件的大小,并在进程 VAD 中跟踪此视图。映射视图的行为只是简单地填充 PTE 以指向包含文件的物理页面,这些物理页面通过查看文件中该范围的原型 PTE 并查看它包含的内容,如果原型 PTE不指向物理页,初始化PTE指向原型PTE而不是它指向的页,PTE保持无效,读取时逐页按需解决此故障视图实际执行。

VACB 跟踪缓存管理器打开的文件的 256KiB 视图以及该视图的虚拟地址范围,它描述了为该虚拟地址范围提供服务的 64 个 PTE 的范围。没有虚拟外部碎片或页面 table 外部碎片,因为所有视图的大小都相同,并且没有物理外部碎片,因为视图中的所有页面都是 4KiB。选择 256KiB 是因为如果它更小,就会有太多的 VACB 对象(64 倍,占用 space),如果它更大,实际上会有很多来自读取的内部碎片因此虚拟地址污染很大,而且 VACB 使用虚拟地址的低位来存储当前正在该范围内执行的 I/O 操作的数量,因此 VACB 大小必须增加几位,否则它将能够处理更少的并发 I/O 操作。

如果视图是整个文件的大小,很快就会有很多虚拟地址污染,因为它会在读取的每个文件的整体中进行映射,而文件映射应该是为了故意将整个文件视图映射到其虚拟地址 space 的用户进程,期望访问整个文件。还会有很多虚拟外部碎片,因为视图大小不同。

至于 executable 图像,它们分别映射到单独的原型 PTE 和单独的物理页面、单独的控制区域、单独的段和子段对象到文件的数据文件映射。该进程将映像映射进来,但是内核也将ntoskrnl.exehal.dll的映像映射到,然后驱动程序映像在系统PTE工作集上。