我猜Windows有类似Linux页面缓存的概念,用于存储从磁盘中读取的数据,例如文件、可执行文件和动态库。我想知道是否有可能禁用这样的缓存,或者至少清除/刷新它。
在 Windows 下,这被称为 待机列表。你可以全局清空它,或者只针对一个卷或一个文件句柄。
全局清空
你可以使用微软 Technet 上的一个 现成程序,选择 Empty
→ Empty Standby List
编程方式,您可以使用未记录的 NtSetSystemInformation
函数来实现相同的操作,详细信息请参见 239行。这是一个执行与前面提到的程序相同操作的程序,其中有其他功能。
只针对一个文件句柄
使用带有 FILE_FLAG_NO_BUFFERING
的文件打开:文档说得不准确,因为它说是你打开文件时没有缓冲,但所有版本的 Windows(从 Windows 98 到 Windows 8)的真正可观察行为是它仅仅丢弃该文件的完整缓存内容(对于每个人!),并且不会通过使用该句柄的读取重建缓存。
只针对一个完整卷
一个卷句柄只是一个文件句柄(有点特殊,但仍然是),因此假设您有适当的权限打开卷句柄,则可以针对整个卷执行相同操作。
另外,正如 这里 的答案中指出的那样,似乎有一种功能 / 错误(功能-错误?)即使在没有适当权限的情况下,也允许您使一个卷的缓存无效,仅通过尝试以不共享写入方式打开它,在最近的一个 Windows 版本下至少可以这样做。
当任何有效写入成功时会发生这种情况很有道理,因为您可能会更改文件系统内部数据(因此它是一种功能),但显然当打开卷失败时它也起作用(这是一个错误)。