Кэширование файлов Windows


По умолчанию Windows кэширует файловые данные, которые считываются с дисков и записываются на диски. Это означает, что операции чтения считывают файловые данные из области системной памяти, известной как системный файловый кэш, а не с физического диска. Соответственно, операции записи записывают файловые данные в системный файловый кэш, а не на диск, и этот тип кэша называется кэшем обратной записи.

Кэширование происходит под руководством диспетчера кэша, который работает непрерывно во время работы Windows. Файловые данные в системном файловом кэше записываются на диск с интервалами, определяемыми операционной системой, и память, ранее используемая этими файловыми данными, освобождается — это называется очисткой кэша. Политика задержки записи данных в файл и удержания их в кэше до тех пор, пока кэш не будет очищен, называется ленивой записью, и она запускается диспетчером кэша через определенный интервал времени. Время, в течение которого блок данных файла сбрасывается, частично зависит от времени, в течение которого он был сохранен в кэше, и от времени, прошедшего с момента последнего доступа к данным в операции чтения. Это гарантирует, что часто считываемые файловые данные будут оставаться доступными в системном файловом кэше в течение максимального периода времени.

Этот процесс кэширования данных файла показан на следующем рисунке.

процесс кэширования файловых данных

Как показано сплошными стрелками на рисунке выше, область данных размером 256 КБ считывается в "слот" кэша размером 256 КБ в системном адресном пространстве, когда она впервые запрашивается диспетчером кэша во время операции чтения файла. Затем процесс в пользовательском режиме копирует данные в этом слоте в свое собственное адресное пространство. Когда процесс завершает свой доступ к данным, он записывает измененные данные обратно в тот же слот в системном кэше, как показано пунктирной стрелкой между адресным пространством процесса и системным кэшем. Когда диспетчер кэша определяет, что данные больше не будут нужны в течение определенного периода времени, он записывает измененные данные обратно в файл на диске, как показано пунктирной стрелкой между системным кэшем и диском.

Степень повышения производительности ввода-вывода, обеспечиваемая кэшированием файловых данных, зависит от размера считываемого или записываемого блока файловых данных. При чтении и записи больших блоков файловых данных более вероятно, что для завершения операции ввода-вывода потребуются операции чтения и записи с диска. Производительность ввода-вывода будет все больше ухудшаться по мере увеличения числа операций такого рода.

В таких ситуациях кэширование можно отключить. Это делается во время открытия файла путем передачи FILE_FLAG_NO_BUFFERING в качестве значения для параметра dwFlagsAndAttributes CreateFile. Когда кэширование отключено, все операции чтения и записи напрямую обращаются к физическому диску. Однако метаданные файла все еще могут быть кэшированы. Чтобы сбросить метаданные на диск, используйте функцию FlushFileBuffers.

Частота, с которой происходит промывка, является важным фактором, который уравновешивает производительность системы с надежностью системы. Если система слишком часто очищает кэш, то количество больших операций записи, выполняемых при промывке, значительно снизит производительность системы. Если система не сбрасывается достаточно часто, то вероятность того, что либо системная память будет истощена кэшем, либо внезапный сбой системы (например, потеря питания компьютера) произойдет до сброса, выше. В последнем случае кэшированные данные будут потеряны.

Чтобы гарантировать, что происходит правильное количество промывки, диспетчер кэша каждую секунду порождает процесс, называемый ленивым писателем. Процесс lazy writer ставит в очередь одну восьмую страниц, которые не были сброшены в последнее время для записи на диск. Он постоянно пересматривает объем сбрасываемых данных для оптимальной производительности системы, и если требуется записать больше данных, он ставит их в очередь. Ленивые авторы не сбрасывают временные файлы, поскольку предполагается, что они будут удалены приложением или системой.

Некоторые приложения, такие как программное обеспечение для проверки вирусов, требуют, чтобы их операции записи были немедленно сброшены на диск; Windows предоставляет эту возможность через кэширование записи. Процесс включает сквозное кэширование записи для определенной операции ввода-вывода, передавая флаг FILE_FLAG_WRITE_THROUGH в свой вызов CreateFile. При включенном сквозном кэшировании данные по-прежнему записываются в кэш, но диспетчер кэша немедленно записывает данные на диск, а не вызывает задержку при использовании ленивого записывающего устройства. Процесс также может принудительно сбросить файл, который он открыл, вызвав функцию FlushFileBuffers.

Метаданные файловой системы всегда кэшируются. Поэтому, чтобы сохранить любые изменения метаданных на диске, файл должен быть либо сброшен, либо открыт с помощью FILE_FLAG_WRITE_THROUGH.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, windows, файл, кэширование, файловая система




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Кэширование, ленивая загрузка и слабые ссылки на C#
Восстановление сайта из вебархива
Интеграция безопасности в DevOps: советы по включению