Сколько дисковой активности вызвано IRP_MJ_QUERY_INFORMATION?
Вызов IRP_MJ_QUERY_INFORMATION генерируется такими функциями, как WinF GetFileInformationByHandle или режим ядра ZwQueryInformationFile.
Может ли кто-нибудь объяснить мне, что на самом деле происходит с этим звонком? Предполагая, что у меня есть традиционный магнитный накопитель 7200 об / мин.
Я знаю, что большая часть задержек при чтении с магнитных вращающихся приводов связана с временем поиска, но вызовы IRP_MJ_QUERY_INFORMATION кажутся очень быстрыми в моем приложении. Я проверил содержимое кеша предварительной выборки и не смог увидеть там файл, который он запрашивает. Я предполагаю, что это кэшируется где-то в памяти, так как звонки многочисленны, но разрешаются очень быстро, и я не вижу большой активности HDD (хотя я могу ошибаться). Что на самом деле происходит в этих ситуациях? Кэшируется ли файл где-то еще Windows? Если так, как я могу это увидеть?
Я знаю, что кеш жесткого диска тоже есть, но, насколько я понимаю, он больше похож на буфер для упреждающего чтения и т. Д.
Редактировать: я читал эту статью на MSDN, и она предполагает, что "метаданные файловой системы всегда кэшируются". Я предполагаю, что это означает, что если вы откроете файл и внесете в него изменения, метаданные, такие как "Дата последнего изменения", выиграют не будет записан на диск, пока вы не очистите буфер файлов. В моем случае я запрашиваю файл, поэтому мне не нужно вносить какие-либо изменения в метаданные. Кеширует ли Windows метаданные после первого запроса информации, сделанной моей программой?
1 ответ
Все зависит от файловой системы и вида извлекаемой информации. Давайте поговорим о NTFS.:)
Когда файл открывается, большая часть информации, содержащейся в записи каталога и в записи файла для файла, кэшируется в структуре данных (называемой FCB), которая связана с дескриптором.
Когда вызывается IRP_MJ_QUERY_INFORMATION, эта информация копируется из FCB в буфер пользователя. Однако такие вещи, как получение тегов повторного анализа, требуют возврата к исходной записи файла и считывания этой информации. Большую часть времени эта запись находится в кеше (так как она открывается при открытии самого файла).