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 に答える