Клиент хотел использовать флаги
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 можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.