Ручная запись грязной области mmap - PullRequest
2 голосов
/ 08 декабря 2011

Я ищу mmap область файла, внесите изменения, а затем либо msync(MS_INVALIDATE) их, чтобы изменения в памяти были потеряны, либо, если мне нравятся изменения, msync(MS_SYNC), чтобы записать ихобратно к базовому хранилищу.

msync manpage говорит следующее о MS_INVALIDATE:

Когда указано MS_INVALIDATE, msync () должен сделать недействительнымвсе кэшированные копии сопоставленных данных, которые несовместимы с постоянными местами хранения, так что последующие ссылки должны получать данные, которые когда-либо соответствовали постоянным местам хранения между вызовом msync () и первой последующей ссылкой на данные в памяти.

Создается впечатление, что MS_INVALIDATE следует сбросить, чтобы вернуть память обратно в состояние в хранилище.Однако изменения, похоже, уже достигли устройства к тому времени, когда я звоню msync.

  1. Могу ли я задержать или предотвратить автоматическую запись данных обратно на устройство?
  2. Можно ли работать только с обратной записью вручную?

Примечания

  • Размер основного хранилища может составлять несколько ТБ.

1 Ответ

0 голосов
/ 08 декабря 2011

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

В современной системе издержки производительности должны быть незначительными:

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