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