Понимание MMAP


10

Я шел через документацию по ТСМУ здесь и пытался реализовать его с помощью этого

У меня есть несколько сомнений относительно его реализации.

  1. Предоставляет ли MMAP сопоставление файла и возвращает указатель этого местоположения в физической памяти или возвращает адрес таблицы сопоставления? и он также выделяет и блокирует пространство для этого файла?

  2. Как только файл сохраняется в этом месте в памяти, он остается там до вызова munmap?

  3. Файл даже перемещается в память или это просто таблица сопоставления, которая служит перенаправлением, и файл фактически находится в виртуальной памяти (на диске)?

  4. Предполагая, что он перемещен в память, могут ли другие процессы получить доступ к этому пространству для чтения данных, если у них есть адрес?


2
Вы не реализуете, mmap но используете его
Старынкевич,

Ответы:


13

Отвечая на вещи по порядку:

  1. Он возвращает указатель на местоположение в виртуальной памяти, и адресное пространство виртуальной памяти выделяется, но файл никак не блокируется, если вы явно не заблокируете его (также обратите внимание, что блокировка памяти не является блокировкой области в файл). Эффективная реализация ттар () на самом деле возможна только с практической точки зрения из - за страничными и виртуальную память ( в противном случае потребовался бы чтение всего региона в память , прежде чем на Завершают вызовы).
  2. Не совсем, это связано с следующим ответом, поэтому я расскажу об этом там.
  3. Вроде. В большинстве случаев на самом деле происходит то, что mmap () предоставляет доступ к данным при копировании при записи в кэш страницы. В результате применяются обычные ограничения кеша на время жизни данных (если системе требуется пространство, страницы могут быть удалены (или сброшены на диск, если они загрязнены) из кеша и требуют повторного сбоя.
  4. Нет, из-за того, как работает виртуальная память. Каждый процесс имеет свое собственное виртуальное адресное пространство со своими собственными виртуальными сопоставлениями. Каждая программа, которая хочет передавать данные, должна будет вызывать mmap () для одного и того же файла (или сегмента общей памяти), и все они должны использовать MAP_SHAREDфлаг.

Стоит отметить, что mmap () не только работает с файлами, вы также можете делать с ним другие вещи, такие как:

  • Непосредственное отображение памяти устройства (если у вас достаточно прав). Это фактически используется во многих встроенных системах, чтобы избежать необходимости писать драйверы режима ядра для нового оборудования.
  • Карта сегментов общей памяти.
  • Явная карта огромных страниц.
  • Выделите память, которую вы можете затем вызвать madvise (2) (что, в свою очередь, позволяет вам делать полезные вещи, такие как предотвращение копирования данных в дочерний процесс на fork (2) или пометка данных для KSM (функция дедупликации памяти Linux)).

Спасибо за такой подробный ответ. Просто пояснение по пункту 1. Если я попытаюсь получить доступ к возвращенному адресу виртуальной памяти. Сначала он проходит через карту адресов, созданную для процесса, а затем перенаправляется в фактическое местоположение - это может быть диск, кэш или память. Во-вторых, если включен флаг MAP_SHARED и таблица для обоих процессов возвращает одинаковое значение для физического адреса, тогда файл можно поделиться?
Джон

1. Да, он будет использовать таблицу сопоставления виртуальной памяти. 2. Адрес в каждом процессе не имеет значения, просто тот факт, что они сопоставили одну и ту же область одного и того же файла с помощью MAP_SHARED.
Остин Хеммельгарн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.