1

对 IRP_MJ_QUERY_INFORMATION 的调用由 Win32 的 GetFileInformationByHandle 或内核模式 ZwQueryInformationFile 等函数生成。

有人可以向我解释这个电话实际发生了什么吗?假设我有一个传统的 7200RPM 磁存储 HDD。

我知道从磁性旋转驱动器读取时的许多延迟是由于寻道时间造成的,但 IRP_MJ_QUERY_INFORMATION 调用在我的应用程序中似乎非常快。我检查了预取缓存的内容,但在其中看不到它正在查询的文件。我猜它被缓存在内存中的某个地方,因为调用很多,但解决得很快,而且我没有看到太多的 HDD 活动(尽管我可能是错的)。在这些情况下实际上会发生什么?文件是否被 Windows 缓存在其他地方?如果是这样,我怎么能看到它?

我知道也有一个 HDD 缓存,但我的理解是它更像是用于预读等的缓冲区。

编辑:我在 MSDN 上阅读了这篇文章,它建议“始终缓存文件系统元数据。”,我假设这意味着如果您打开文件并对其进行修改,诸如“上次修改日期”之类的元数据将不会在刷新文件缓冲区之前,不会将其提交到磁盘。就我而言,我正在查询一个文件,因此我不需要对元数据进行任何更改。在我的程序第一次查询信息后,Windows 是否缓存元数据?

4

1 回答 1

1

这完全取决于所涉及的文件系统和检索的信息类型。让我们谈谈NTFS。:)

打开文件时,目录条目和文件记录中包含的大部分信息都缓存在与句柄关联的数据结构(称为 FCB)中。

当调用 IRP_MJ_QUERY_INFORMATION 时,此信息会从 FCB 复制到用户的缓冲区中。然而,诸如检索重解析标签之类的事情需要返回到原始文件记录并读取该信息。大多数情况下,该记录驻留在缓存中(因为它在文件本身打开时被访问)。

于 2012-11-28T20:48:33.573 回答