Здравствуйте, valuea, Вы писали:
V>Ну задачка очень простая. Файл содержит две вресии данных и заголовок, который определяет какая версия данных является актуальной.
Ну то есть обычный
shadow paging?
V>Версии данных по очереди периодически обновляются и указатель в заголовке переключается на новую актуальную версию. Соответсвенно если в первую очередь изменится указатель на версию данных, а во время записи данных произойдет ошибка, соответственно указатель будет указывать на версию с ошибочными данными, и определить эту ситуацию никак нельзя,
Погоди-ка. Так ты всё-таки хочешь чтобы программа переживала внезапные сбои вроде пропадания электроэнергии, kernel panic, выхода из строя разного оборудования, вот это вот всё?
Просто при нормальной работе системы никакие msync для решения твоей задачи не нужны. Достаточно просто сначала записать данные в новую область, поставить memory barrier (если архитектура требует), и сделать вторую запись по переключению версии. А ОС сама позаботится об том, чтобы на диске оказалось потом те же данные что и в памяти, и что бы другие процессы при чтении получали непротиворечивую информацию независимо от того, успела произойти запись на диск или нет.
То есть управление порядком записи на диск нужно лишь для повышения вероятности, что после сбоя ОС (вроде внезапной перезагрузки) там окажется консинстентная структура. Если с этим нужно бороться, то да, синхронная синхронизация будет нужна.
V> CRC не вычислить — объем данных слишком большой.
Тогда, отвечая на твой предыдущий вопрос, MAP_NOSYNC совсем не нужен. Во-первых, если данных много, то и сбрасывать их стоит начинать пораньше — даже если не вызывать явно синхронную синхронизацию, то хотя бы позволить ОС заняться этим в свободное время. Во-вторых, если данных совсем много, то MAP_NOSYNC будет их стараться накапливать в памяти, что может вытеснить, скажем, другие полезные страницы и просадить производительность (а комбинация FreeBSD+ftruncate+MAP_NOSYNC вообще способна подвесить систему на несколько часов при неудачном стечении обстоятельств).