3

根据关于页面缓存的一般概念和这个答案 ,系统文件缓存基本上使用了任何其他进程未使用的所有 RAM。据我所知,这就是 Linux 中页面缓存的情况。

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

4

2 回答 2

3

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

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

在 Windows 中,进程使用的 RAM 基本上有两种状态:“活动”和“待机”:

  • “活动”RAM 在任务管理器和资源监视器中显示为“使用中”。它也是任务管理器中每个进程显示的 RAM。
  • “备用”RAM 在资源监视器中全局可见,并且对于每个带有RAMMap的进程都是可见的。

“待机”+“空闲”内存就是任务管理器中所谓的“可用”内存。“可用”RAM 在 Windows 中往往接近 0,但您可以有意义地认为备用 RAM 也是免费的。

备用 RAM 被认为是“有一段时间没有被进程使用”。它是 RAM 的一部分,用于为需要它的进程提供新内存。但它仍然属于进程,如果拥有进程突然访问它(系统认为不太可能),它可以直接使用。

因此,文件缓存具有“活动”RAM 和“备用”RAM。“活动” RAM 在某种程度上是最近访问数据的缓存。“备用”RAM 是前段时间访问数据的缓存。文件缓存的“活动”RAM 通常相对较小。文件缓存的备用 RAM 通常是计算机的所有 RAM: 总 RAM - 所有进程的活动 RAM。实际上,其他进程很少有备用 RAM,因为如果您进行大量磁盘 I/O,它往往会进入文件缓存。

这是 RAMMap 为执行大量 I/O 和计算的繁忙服务器显示的信息: 在此处输入图像描述

文件缓存是称为“映射文件”的第二行。看到大部分 32 GB 要么在其他进程的 Active 部分,要么在文件缓存的 Standby 部分。

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

于 2018-11-14T11:27:21.703 回答
1

你的回答并不完全正确。

文件缓存,也称为系统缓存,描述了一个虚拟地址的范围,它有一个物理工作集被 追踪MmSystemCacheWs,而该工作集是系统上所有映射文件物理页的子集。

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

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

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

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

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

如果视图是文件的整个大小,很快就会有很多虚拟地址污染,因为它会映射到整个读取的每个文件,并且文件映射应该用于有意映射的用户进程一个完整的文件视图到它的虚拟地址空间,期望整个文件被访问。还会有很多虚拟的外部碎片,因为视图的大小不同。

对于可执行映像,它们分别以单独的原型 PTE 和单独的物理页、单独的控制区、单独的段和分段对象映射到文件的数据文件映射中。该进程将映像映射到其中,但内核也将映像映射到大页面ntoskrnl.exe中,然后驱动程序映像位于系统 PTE 工作集上。hal.dll

于 2021-03-24T19:14:18.033 回答