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