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

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

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

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

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

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

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

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

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

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

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

Метаданные файловой системы всегда кэшируются. Таким образом, чтобы сохранить все изменения метаданных на диске, файл необходимо либо очистить, либо открыть с помощью FILE_FLAG_WRITE_THROUGH.