Здравствуйте, watchmaker, Вы писали:
W>Интерес сугубо теоретический? 
И теоретический и практический. ОС — FreeBSD либо NetBSD. Файловая система — ну тут уже от меня не зависит. Скорей всего новомодный (или уже не новомодный) ZFS.
W>Зачем ОС что-то блокировать? Один процесс вызвал msync, а другой изменил записываемые данные? Разумным будет считать, что это обычная гонка в программе.
Ну не совсем гонка. С одной стороны хочется гарантировать, что в процессе сброса грязных страниц на диск никакой другой поток не "подпортит" их, перезаписав какую-то часть данных, с другой стороны не хочется полностью блокировать процесс записи в память потоками, когда один из них сбрасывает страницы на диск. Раз уж механизм mmap имеет полный контроль над участком памяти в которую отображается файл, то был уверен, что на время копирования в кэш ОС ну или там в буфер контроллера, какая-то блокировка все-же выставляется.
W>Если программе важна блокировка, то она сама должна создать какой-то мьютекс (или что-то ещё), и с его помощью реализовать вариант 1, 2 или 3.
Да, если действительно mmap никак не ограничивает процесс записи в память, то да, наверно надо смотреть в сторону fcntl(F_SETLKW) либо что-то свое делать.
W>Так что в этом месте я бы тоже ожидал любой подставы 
Еще один довод в пользу своего решения. Вообще интересно, хранилища вроде MySQL или Oracle, ну или NoSQL решения какие-нибудь, mmap используют или свой менеджер с прямой записью в файл?