Введение
Карта памяти. Системный вызов, соответствующий стандарту POSIX.
В вычислительной технике mmap(2) — это системный вызов Unix, соответствующий стандарту POSIX, который отображает файлы или устройства в память. Это метод ввода-вывода файлов с использованием отображения в память. Он реализует страничную подкачку, поскольку содержимое файла не считывается с диска немедленно и изначально не использует физическую оперативную память. Фактическое чтение с диска выполняется после доступа к конкретному местоположению в ленивом режиме. После того, как отображение больше не требуется, указатели должны быть отсоединены с помощью munmap(2). Информацию о защите — например, пометку отображаемых областей как исполняемых — можно управлять с помощью mprotect(2), а специальную обработку можно применить с помощью madvise(2). В Linux, macOS и BSD mmap может создавать различные типы отображений. Другие операционные системы могут поддерживать лишь их подмножество; например, общие отображения могут быть непрактичны в операционной системе без глобальной VFS или кэша ввода-вывода.
История
Первоначальная концепция файлов, отображаемых в память, возникла в операционной системе TOPS 20. Системные вызовы mmap и связанные с ними были разработаны как часть версии Unix, известной как Berkeley Software Distribution (BSD). Их API уже был описан в руководстве 4.2BSD System Manual, хотя он и не был реализован ни в этом релизе, ни в 4.3BSD. Однако компания Sun Microsystems реализовала этот API в своей операционной системе SunOS. Разработчики BSD из Калифорнийского университета в Беркли безуспешно обратились к Sun с просьбой передать свою реализацию; вместо этого 4.3BSD Reno был выпущен с реализацией, основанной на системе виртуальной памяти Mach.
Защищенный файлом и анонимный
Файловое отображение связывает область виртуальной памяти процесса с файлами; то есть, чтение этих областей памяти приводит к чтению файла. Это отображение является типом по умолчанию. Анонимное отображение связывает область виртуальной памяти процесса, не связанную ни с каким файлом. Содержимое инициализируется нулями. В этом плане анонимное отображение аналогично malloc и используется в некоторых реализациях malloc для определенных выделений памяти, особенно больших. Анонимные отображения не входят в стандарт POSIX, но реализованы почти во всех операционных системах с помощью флагов MAP_ANONYMOUS и MAP_ANON.
Видимость памяти
Если отображение общее (установлен флаг MAP SHARED), то оно сохраняется при создании нового процесса (с помощью системного вызова fork(2)). Следовательно, записи в отображённой области в одном процессе немедленно становятся видны во всех связанных (родительских, дочерних или родственных) процессах. Если отображение общее и связано с файлом (а не MAP ANONYMOUS), то гарантируется, что базовый файл будет записан на диск только после вызова системного вызова msync(2). Напротив, если отображение приватное (установлен флаг MAP PRIVATE), изменения не будут видны другим процессам и не будут записаны в файл. Процесс, читающий или записывающий в базовый файл, не всегда увидит те же данные, что и другой процесс, который отобразил этот файл, поскольку сегменты файла копируются в оперативную память и периодически сбрасываются на диск. Синхронизацию можно принудительно выполнить с помощью вызова msync(2). Использование mmap для файлов может значительно снизить накладные расходы памяти для приложений, обращающихся к одному и тому же файлу; они могут совместно использовать область памяти, занимаемую файлом, вместо загрузки файла для каждого приложения, которому требуется доступ. Это означает, что mmap(2) иногда используется для межпроцессного взаимодействия (IPC). В современных операционных системах mmap(2) обычно предпочтительнее механизма разделяемой памяти System V IPC. Основное различие между разделяемой памятью System V (shmem) и памятью, отображённой в память (mmap), заключается в том, что разделяемая память System V является постоянной: если она явно не удалена процессом, она остаётся в памяти и доступна до тех пор, пока система не будет выключена. Память, отображённая с помощью mmap, не является постоянной между запусками приложений (если она не связана с файлом).
Использование в реализации баз данных
Системный вызов mmap использовался в различных реализациях баз данных как альтернатива реализации пула буферов, однако это привело к возникновению иного набора проблем, которые можно было бы разумно решить только с помощью пула буферов.