在Windows上禁用或清除页面缓存

13

我猜Windows有类似Linux页面缓存的概念,用于存储从磁盘中读取的数据,例如文件、可执行文件和动态库。我想知道是否有可能禁用这样的缓存,或者至少清除/刷新它。


1
你的意思是指以编程方式打开文件还是针对整个Windows设置?请查看以下链接获取更多信息:http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa364218.aspx - Simon Mourier
可能是清除文件缓存以重复性能测试的重复问题。 - snemarch
1个回答

23

在 Windows 下,这被称为 待机列表。你可以全局清空它,或者只针对一个卷或一个文件句柄。

全局清空
你可以使用微软 Technet 上的一个 现成程序,选择 EmptyEmpty Standby List

编程方式,您可以使用未记录的 NtSetSystemInformation 函数来实现相同的操作,详细信息请参见 239行。这是一个执行与前面提到的程序相同操作的程序,其中有其他功能。

只针对一个文件句柄
使用带有 FILE_FLAG_NO_BUFFERING 的文件打开:文档说得不准确,因为它说是你打开文件时没有缓冲,但所有版本的 Windows(从 Windows 98 到 Windows 8)的真正可观察行为是它仅仅丢弃该文件的完整缓存内容(对于每个人!),并且不会通过使用该句柄的读取重建缓存。

只针对一个完整卷
一个卷句柄只是一个文件句柄(有点特殊,但仍然是),因此假设您有适当的权限打开卷句柄,则可以针对整个卷执行相同操作。

另外,正如 这里 的答案中指出的那样,似乎有一种功能 / 错误(功能-错误?)即使在没有适当权限的情况下,也允许您使一个卷的缓存无效,仅通过尝试以不共享写入方式打开它,在最近的一个 Windows 版本下至少可以这样做。
当任何有效写入成功时会发生这种情况很有道理,因为您可能会更改文件系统内部数据(因此它是一种功能),但显然当打开卷失败时它也起作用(这是一个错误)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接