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