对IRP_MJ_QUERY_INFORMATION的调用由Win32的GetFileInformationByHandle或内核模式ZwQueryInformationFile等函数生成。
有人可以向我解释这次电话实际发生了什么吗?假设我有一个传统的7200RPM磁存储硬盘。
我知道从磁性旋转驱动器读取时的很多延迟是由于寻道时间,但IRP_MJ_QUERY_INFORMATION调用在我的应用程序中似乎非常快。我检查了预取缓存的内容,我看不到它在那里查询的文件。我猜它被缓存在内存中,因为调用很多但很快就解决了,我没有看到很多硬盘活动(虽然我可能是错的)。在这些情况下实际发生了什么?该文件是否被Windows缓存在其他位置?如果是这样,我怎么能看到它?
我知道还有一个硬盘缓存,但我的理解是,它更像是预读缓冲区等。
编辑:我正在阅读有关MSDN的this文章,它建议“文件系统元数据始终被缓存。”,我假设这意味着如果您打开文件并对其进行修改,元数据如在刷新文件缓冲区之前,“上次修改日期”不会提交到磁盘。就我而言,我正在查询文件,因此我不需要对元数据进行任何更改。 Windows是否在第一次查询我的程序生成的信息后缓存元数据?
答案 0 :(得分:1)
这一切都取决于所涉及的文件系统和检索的信息种类。我们来谈谈NTFS。 :)
当打开文件时,目录条目和文件的文件记录中包含的大部分信息都缓存在与句柄关联的数据结构(称为FCB)中。
当调用IRP_MJ_QUERY_INFORMATION时,此信息将从FCB复制到用户缓冲区中。但是,检索重新分析标记之类的内容需要返回到原始文件记录并读取该信息。大多数情况下,该记录驻留在缓存中(因为它在文件本身打开时被访问)。