пятница, 21 августа 2020 г.

Об использовании FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING для проецируемых в память файлов

Это перевод On using FILE_FLAG_WRITE_THROUGH and FILE_FLAG_NO_BUFFERING for memory-mapped files. Автор: Реймонд Чен.

Клиент хотел использовать флаги FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING для проецируемого в память файла (memory-mapped file), основываясь на этом руководстве в документации для функции CreateFile:
По этой причине флаг FILE_FLAG_WRITE_THROUGH часто используется совместно с флагом FILE_FLAG_NO_BUFFERING в качестве замены для вызова функции FlushFileBuffers после каждой записи, что может привести к ненужным потерям производительности. Совместное использование этих флагов позволяет избежать штрафов.
Клиент был обеспокоен тем, повлияет ли такая комбинация флагов на согласованность данных.

На самом деле, проблемы с согласованностью данных у клиента будут ещё до того, как он начнёт беспокоиться об этих флагах.

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

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

Сохранилась ли страница 1Сохранилась ли страница 2
НетНет
ДаНет
НетДа
ДаДа

Вот тебе и целостность данных.

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

Обычно при проектировании системы согласованности вы задаёте определенный порядок, в котором данные должны быть записаны на диск. Например, вы можете решить записать новые данные на диск, а затем, когда данные успешно записаны, вы запишете новые метаданные (скажем, путём обновления индекса) - в результате чего новые данные станут активными значениями, а старые данные станут игнорироваться. Именно подобные алгоритмы могут использовать преимущества указанных флагов сквозной записи и буферизации.

Дополнительная болтовня: использование FILE_FLAG_NO_BUFFERING для проецируемого в память файла, на самом деле, бесполезно. Флаг "без буферизации" означает, что записи идут прямо на диск - без кэширования в памяти. Но ведь весь смысл отображаемого в память файла состоит в том, что он должен быть кэширован в памяти!

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.