Re[3]: msync(MS_SYNC)
От: andrey.desman  
Дата: 27.04.16 21:37
Оценка:
Здравствуйте, valuea, Вы писали:

V>Ну не совсем гонка. С одной стороны хочется гарантировать, что в процессе сброса грязных страниц на диск никакой другой поток не "подпортит" их, перезаписав какую-то часть данных, с другой стороны не хочется полностью блокировать процесс записи в память потоками, когда один из них сбрасывает страницы на диск. Раз уж механизм mmap имеет полный контроль над участком памяти в которую отображается файл, то был уверен, что на время копирования в кэш ОС ну или там в буфер контроллера, какая-то блокировка все-же выставляется.


Не скажу про BSD, но скорее всего будет так жк как в линуксе.
А в линуксе, твой ммап — это и есть кэш ОС. То есть никакого копирования не происходит. И у механизма mmap нет никакого контроля над записью в эту память. Отправка данных на диск — обычный DMA из этих же самых страниц. Вполне возможно, что диск не получит изменения, сделанные в окне после msync, но до DMA, так как они весьма вероятно останутся в кэше процессора, но возможно, что получит, кто его знает...

W>>Если программе важна блокировка, то она сама должна создать какой-то мьютекс (или что-то ещё), и с его помощью реализовать вариант 1, 2 или 3.

V>Да, если действительно mmap никак не ограничивает процесс записи в память, то да, наверно надо смотреть в сторону fcntl(F_SETLKW) либо что-то свое делать.

Никак. Надо делать свои блокировки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.