2016-01-30 3 views
1

Я пытаюсь понять, как работает mmap, глядя на man mmap.Как работает mmap, когда 2 программы отображают один и тот же файл

Как я понимаю, это добавляет отображение в таблицу страниц, отображающей между файлом и виртуальным адресом (который является адрес, который дается void *addr)

Итак, что же происходит, когда 2 программы карты те же файл? Есть ли 2 таблицы в таблице страниц, по одной для каждой программы?

+0

Каждая программа имеет отдельную конфигурацию MMU. Просто одна и та же страница отображается в обоих процессах. – fuz

+0

Когда один процесс пытается записать, записывает ли он в основную память (ОЗУ) или непосредственно в файл (жесткий диск)? – Lee

+0

@Lee: 'man mmap: MAP_SHARED Поделитесь этим сопоставлением. Обновления сопоставления видны другим процессам, которые отображают этот файл и переносятся в основной файл. Файл не может быть фактически обновлен до вызова msync (2) или munmap(). – EOF

ответ

2

Итак, что происходит, когда 2 программы отображают один и тот же файл? Есть ли 2 таблицы в таблице страниц, по одной для каждой программы?

В современных операционных системах каждый процесс имеет свою собственную таблицу страниц для своей памяти, которая может указывать на страницы физической памяти, разделяемой другими процессами пользователя и ядра.

С MAP_SHARED это сопоставление является общим: обновления для отображения видны другим процессам, которые сопоставляют этот файл и переносятся в основной файл. Фактически, файл не может быть обновлен до вызова msync (2) или munmap().

Это кажется очень интересным, но есть многочисленные предостережения:

  • Фактические страницы mmapped обоих процессов для того же файла могут находиться по одному адресу или по другому адресу в каждом процессе, сохраняя указатели в этом , общая память может не позволить другому процессу использовать их, поскольку они могут указывать на непоследовательные адреса.

  • Реализация может использовать одни и те же страницы физической памяти для обоих сопоставлений или нет: по причинам подложек (стратегии кэширования, вне чтения синхронизации ...), даже если это одна и та же физическая память, изменения, сделанные одним процессом его память может не сразу отражаться в памяти другого процесса.

Таким образом, модификация может или не может быть видимым для других процессов mmapping файл и не читать его через read или FILE* потока API.

Если один из процессов вызывает msync(), изменения должны быть видны на все карты и все еще непрочитанные части файла, имея в виде, что FILE* потокового API, возможно буферном некоторые данные во внутренних неразделенных буферах: модификации в эта область не будет отражена.

Заключение: рискованно и ненадежно использовать эти механизмы для реализации взаимодействия между процессами. Поведение может зависеть от специфических характеристик системы, таких как стратегии ОС, архитектуры процессора и кэша, тип используемой ОЗУ, тактовая частота и кто знает, что еще. Безопаснее полагаться на проверенные API, которые действительно могут быть реализованы с использованием mmapped-памяти, но только в том случае, если известно, что она обеспечивает правильную семантику.

1

Реальная реализация системы отличается. При риске чрезмерного упрощения (и опускания пейджинга здесь):

A mmap будет отображать физические кадры страницы в файл.

Итак, что происходит, когда 2 программы отображают один и тот же файл? Есть ли 2 таблицы в таблице страниц, по одной для каждой программы?

Если два процесса (P и Q) отображаются в один и тот же файл, то P и Q будут иметь собственную таблицу страниц; каждая таблица страниц будет иметь сопоставление ввода с одним и тем же физическим кадром страницы (который может быть сопоставлен с разными адресами в пределах P и Q).

Смежные вопросы