Флаги кэширования функции CreateFile
октября 12 2009 by admin in Обязательный материалFILE_FLAG_NO_BUFFERING Этот флаг указывает, что доступ к файлу должен производиться без буферизации данных. Для повышения производительности система кэширует данные, посылаемые и получаемые с дисковых устройств. Обычно этот флаг не устанавливается, и менеджер кэша держит в памяти последние фрагменты информации из дисковых файлов, к которым производилось обращение. Поэтому, если из файла считана последовательность байтов и затем вы считываете следующие данные, скорей всего они находятся в памяти, и к диску будет произведено одно обращение, а не два, что заметно повысит производительность. Однако это означает, что некоторые данные из файла дублируются в памяти, так как менеджер кэша имеет свой буфер, а вызываемая вами функция чтения (например, ReaclFile) копирует часть данных из буфера менеджера кэша в собственный буфер.
Буферизуя данные, менеджер кэша производит упреждающее чтение, так что данные, которые вам, вероятно, потребуется считать, уже в памяти. Еще раз: считывание из файла большего числа байтов, чем это необходимо в текущий момент, повышает скорость. Потенциально это может привести к излишней трате памяти, когда повторного чтения из того же файла не производится. (Подробнее об упреждающем чтении мы поговорим при обсуждении флагов FILE_FLAG_SEQUENTIAL_SCAN и FILE_FLAG_RANDOM_ACCESS.)
Устанавливая флаг FILE_FLAG_NO_BUFFERING, вы указываете менеджеру кэша, что он не должен буферизовать данные, и за это отвечаете вы сами. Установка этого флага иногда способна повысить скорость и оптимизировать использование памяти вашим приложением.
FILE_FLAG_SEQUENTIAL_SCAN и FILE_FLAG_RANDOM_ACCESS Эти флаги могут быть полезны только при использовании буферизации. Оба игнорируются, если установлен флаг FILE_FLAG_NO_BUFFERING.
Если установлен флаг FILE_FLAG_SEQUENTIAL_SCAN, система предполагает, что осуществляется последовательный доступ к файлу. Когда вы считываете данные из файла, система на самом деле считывает больший объем данных, чем вы запросили. Это позволяет сократить число обращений к жесткому диску и ускоряет работу приложения. Если же вы выполняете непосредственное позиционирование в файле, система тратит немного лишнего времени и памяти. В целом это нормально, но если такие операции выполняются часто, лучше установить флаг FILE_FLAG_RANDOM_ACCESS, который указывает, что система не должна считывать лишние данные из файла.
Для работы с файлом менеджер кэша должен поддерживать некоторые внутренние структуры данных для файла, и чем больше файл, тем больше требуется таких структур данных. При работе с очень большим файлом менеджер кэша может оказаться неспособным выделить нужный объем памяти для внутренних структур данных и не сможет открыть файл. При работе с очень большими файлами устанавливайте флаг FILE_FLAG_NO_BUFFERING.
FILE_FLAG_WRITE_THROUGH Это последний из флагов, связанных с кэшем. Он запрещает промежуточное кэширование при операциях записи файлов, снижая потенциальный риск потери данных. Если этот флаг установлен, все изменения в файле записываются прямо на диск. При этом система продолжает поддерживать внутренний кэш данных файла, и операции чтения файла используют кэшированные данные (если они есть), а не выполняются напрямую с диском. Когда этот флаг применяется для открытия файла, расположенного на сетевом сервере, возврат управления из функции Windows, записывающей данные, в вызывающий поток происходит только после записи данных на диск сервера.
Это все о флагах, управляющих буферами при обмене данными с файлами. Теперь обсудим оставшиеся флаги.