Здравствуйте, valuea, Вы писали:
V>Господа, есть несколько потоков, которые пишут в memmapped файл. По заверешнию записи, каждый поток скидивает измненения на диск, посредсвом msync(MS_SYNC). И тут у меня возникли сомнения относительно производительности, поэтому хотел бы уточнить варианты реализации механизма блокировок в функции msync.
С одной стороны про производительность сомнения, с другой стороны ни названия ОС, ни тип файловой системы не указан. Интерес сугубо теоретический? :)
V>1. На все время выполнения msync блокируется все адресное пространство полностью (то есть все потоки, которые пытаются выполнить запись данных в отображемый участок памяти блокируются до заверешния msync) V>2. На все время выполнения msync блокируются только измененные страницы памяти, подлежащие сбросу на диск. V>3. Блокируются только измененные сплошные последовательности страниц памяти, подлежащие сбросу на диск, причем блокируются только на время выполнения сброса на диск данной последовательности страниц V>4. Какой-либо еще вариант...
Зачем ОС что-то блокировать? Один процесс вызвал msync, а другой изменил записываемые данные? Разумным будет считать, что это обычная гонка в программе. И что это не совсем задача mmap заниматься синхронизацией таких вещей. Если программе важна блокировка, то она сама должна создать какой-то мьютекс (или что-то ещё), и с его помощью реализовать вариант 1, 2 или 3.
Иначе, можно считать, что ничего никогда не блокируется: один поток может успеть записать новые данные в страницу прямо перед её сбросом, другой поток может записать данные в страницу сразу же после её сброса, сделав её тут же снова грязной.
V>Ну и кроме того, msync "сам себя" блокирует? То есть допустим, вызов msync для 0-ой страницы файла в одном потоке, будет дожидаться завершения выполнения msync в другом потоке с диапазоном 1-N страниц?
Да легко. Опять же в зависимости от ОС и ФС.
Про ext3 с data=ordered даже говорят, что msync может ждать завершения записи других файлов в системе, с которыми работают совсем другие программы. Так что в этом месте я бы тоже ожидал любой подставы :)