mmap
замечательно, если у вас есть несколько процессов, обращающихся к данным только для чтения из одного и того же файла, что типично для серверных систем, которые я пишу. mmap
позволяет всем этим процессам совместно использовать одни и те же страницы физической памяти, экономя много памяти.
mmap
также позволяет операционной системе оптимизировать операции подкачки. Например, рассмотрим две программы; программа, A
которая читает 1MB
файл в буфер, создаваемый с помощью malloc
, и программа B, которая mmaps
хранит файл размером 1 МБ в памяти. Если операционная система должна выгрузить часть A
памяти, она должна записать содержимое буфера для замены, прежде чем она сможет повторно использовать память. В этом B
случае любые немодифицированные mmap
d-страницы могут быть немедленно использованы повторно, поскольку ОС знает, как восстановить их из существующего файла, из которого они были mmap
извлечены. (ОС может определить, какие страницы не изменены, изначально пометив доступные для записи mmap
«d» страницы как «только для чтения» и обнаружив ошибки сегмента , аналогично стратегии « Копировать при записи» ).
mmap
также полезно для межпроцессного взаимодействия . Вы можете mmap
сделать файл доступным для чтения / записи в процессах, которые должны взаимодействовать, а затем использовать примитивы синхронизации в mmap'd
регионе (для этого и предназначен MAP_HASSEMAPHORE
флаг).
Одно место mmap
может быть неудобным, если вам нужно работать с очень большими файлами на 32-битной машине. Это потому, mmap
что нужно найти непрерывный блок адресов в адресном пространстве вашего процесса, который достаточно велик, чтобы соответствовать всему диапазону отображаемого файла. Это может стать проблемой, если ваше адресное пространство становится фрагментированным, когда у вас может быть 2 ГБ свободного адресного пространства, но ни один из его отдельных диапазонов не может соответствовать отображению файла 1 ГБ. В этом случае вам, возможно, придется отобразить файл более мелкими порциями, чем вы хотели бы, чтобы он подходил.
Другая потенциальная неловкость mmap
в качестве замены для чтения / записи заключается в том, что вы должны начать отображение на смещениях размера страницы. Если вы просто хотите получить данные со смещением, X
вам нужно исправить это смещение, чтобы оно было совместимо с mmap
.
И , наконец, чтение / запись является единственным способом вы можете работать с некоторыми типами файлов. mmap
не может быть использовано на таких вещах, как трубы и тт .