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


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

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

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

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

Улучшение величины быстродействия ввода - вывода (I/O) данных, предложенных для кэширования, зависят от размера блока данных файла предназначенных для чтения или записи. Когда читаются и пишутся большие блоки файловых данных, гораздо лучше, чтобы чтение с диска и запись на диск должны обязательно заканчивать операцию ввода/вывода. Быстродействие ввода - вывода (I/O) данных должно все в большей степени уменьшаться, поскольку происходят операции ввода/вывода этого рода.

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

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

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

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

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

Назад в оглавление
На главную страницу

Hosted by uCoz