根据关于the page cache和this answer的一般概念,系统文件缓存实际上使用了所有其他进程未使用的RAM。据我所知,这是Linux中页面缓存的情况。
由于“空闲RAM”的概念在Windows中有点模糊,我的问题是,系统文件缓存使用RAM的哪一部分?例如,与任务管理器中的“可用RAM”相同吗?
答案 0 :(得分:1)
你的回答不完全正确。
文件缓存,也称为系统缓存,描述了一系列虚拟地址,它有一个由MmSystemCacheWs
跟踪的物理工作集,该工作集是一个 em>系统上所有映射文件物理页的子集。
系统缓存是一系列虚拟地址,也就是指向映射文件页面的 PTE。映射文件页由创建映射的进程引入,或由系统缓存管理器引入以响应文件读取。
文件缓存响应读取所需的现有页面成为系统工作集的一部分。如果映射文件中的页面不存在,则将其调入并成为系统工作集的一部分。当一个页面在多个工作集中(即系统和一个进程或进程和另一个进程)时,它被认为是在 VMMap 等程序的共享工作集中。
实际映射的文件页面本身由一个节对象控制,每个文件一个,一个数据控制区(用于文件)和文件的子节对象,以及文件的带有原型 PTE 的段对象。这些在进程第一次为文件创建映射对象时创建,或者系统缓存管理器第一次为文件创建映射对象(节对象),因为它需要访问文件以响应文件 IO 操作由进程执行。
当系统缓存管理器需要读取文件时,它一次映射文件的 256KiB 视图,并在 VACB 对象中跟踪视图。进程映射文件的变量视图,通常是整个文件的大小,并在进程 VAD 中跟踪此视图。映射视图的行为只是简单地填充 PTE 以指向包含已驻留的文件的物理页面,方法是查看文件中该范围的原型 PTE 并查看它包含的内容,如果原型 PTE不指向物理页,初始化PTE指向原型PTE而不是它指向的页,PTE无效,当从视图实际执行。
VACB 跟踪缓存管理器已打开的 256KiB 文件视图以及该视图的虚拟地址范围,该范围描述了为该虚拟地址范围提供服务的 64 个 PTE 的范围。没有虚拟外部碎片或页表外部碎片,因为所有视图的大小相同,也没有物理外部碎片,因为视图中的所有页面都是 4KiB。选择 256KiB 是因为如果它更小,就会有太多的 VACB 对象(64 倍,占用空间),如果它更大,实际上会有很多来自读取的内部碎片,因此会有大量的虚拟对象地址污染,而且 VACB 使用虚拟地址的低位来存储当前在该范围内执行的 I/O 操作的数量,因此 VACB 大小必须增加几位,否则会能够处理更少的并发 I/O 操作。
如果视图是整个文件的大小,那么很快就会有很多虚拟地址污染,因为它会映射到读取的每个文件的整体中,而文件映射应该是针对用户进程的它有意将整个文件视图映射到其虚拟地址空间,期望访问整个文件。还会有很多虚拟的外部碎片,因为视图的大小不一样。
对于可执行映像,它们分别通过单独的原型PTE和单独的物理页、单独的控制区、单独的段和子节对象分别映射到文件的数据文件映射中。该进程将映像映射到其中,但内核也将 ntoskrnl.exe
、hal.dll
的映像映射到 large pages 中,然后驱动程序映像位于系统 PTE 工作集上。
答案 1 :(得分:0)
是的,文件高速缓存使用的RAM本质上是在任务管理器中显示为可用的RAM。但不完全是。我将详细介绍如何更精确地对其进行测量。
文件缓存不是任务管理器中进程列表中列出的进程。但是,从Vista开始,它的内存就像一个进程一样进行管理。因此,我将解释一些用于进程的内存管理,文件缓存是一种特殊情况。
在Windows中,进程使用的RAM本质上具有两个状态:“活动”和“备用”:
“待机” +“可用” RAM在任务管理器中称为“可用”。在Windows中,“可用” RAM趋于接近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。