Итак, что происходит, когда 2 программы отображают один и тот же файл? Есть ли 2 таблицы в таблице страниц, по одной для каждой программы?
В современных операционных системах каждый процесс имеет свою собственную таблицу страниц для своей памяти, которая может указывать на страницы физической памяти, разделяемой другими процессами пользователя и ядра.
С MAP_SHARED
это сопоставление является общим: обновления для отображения видны другим процессам, которые сопоставляют этот файл и переносятся в основной файл. Фактически, файл не может быть обновлен до вызова msync (2) или munmap().
Это кажется очень интересным, но есть многочисленные предостережения:
Фактические страницы mmapped обоих процессов для того же файла могут находиться по одному адресу или по другому адресу в каждом процессе, сохраняя указатели в этом , общая память может не позволить другому процессу использовать их, поскольку они могут указывать на непоследовательные адреса.
Реализация может использовать одни и те же страницы физической памяти для обоих сопоставлений или нет: по причинам подложек (стратегии кэширования, вне чтения синхронизации ...), даже если это одна и та же физическая память, изменения, сделанные одним процессом его память может не сразу отражаться в памяти другого процесса.
Таким образом, модификация может или не может быть видимым для других процессов mmapping файл и не читать его через read
или FILE*
потока API.
Если один из процессов вызывает msync()
, изменения должны быть видны на все карты и все еще непрочитанные части файла, имея в виде, что FILE*
потокового API, возможно буферном некоторые данные во внутренних неразделенных буферах: модификации в эта область не будет отражена.
Заключение: рискованно и ненадежно использовать эти механизмы для реализации взаимодействия между процессами. Поведение может зависеть от специфических характеристик системы, таких как стратегии ОС, архитектуры процессора и кэша, тип используемой ОЗУ, тактовая частота и кто знает, что еще. Безопаснее полагаться на проверенные API, которые действительно могут быть реализованы с использованием mmapped-памяти, но только в том случае, если известно, что она обеспечивает правильную семантику.
Каждая программа имеет отдельную конфигурацию MMU. Просто одна и та же страница отображается в обоих процессах. – fuz
Когда один процесс пытается записать, записывает ли он в основную память (ОЗУ) или непосредственно в файл (жесткий диск)? – Lee
@Lee: 'man mmap: MAP_SHARED Поделитесь этим сопоставлением. Обновления сопоставления видны другим процессам, которые отображают этот файл и переносятся в основной файл. Файл не может быть фактически обновлен до вызова msync (2) или munmap(). – EOF