📌 Memory Map mmap
Memory Map mmap — механизм отображения содержимого файла или устройства непосредственно в адресное пространство процесса. Позволяет работать с файлами как с массивами в памяти, минуя вызовы read()/write().
🧠 Как работает
Системный вызов mmap()
выделяет участок виртуальной памяти, который ассоциируется с файлом или устройством. Доступ к содержимому файла происходит через обычные операции с памятью (указатели).
Основные флаги:
MAP_SHARED
/MAP_PRIVATE
— общий/приватный доступPROT_READ
,PROT_WRITE
,PROT_EXEC
— права доступаMAP_ANONYMOUS
— отображение без файла (обычно для malloc)MAP_LOCKED
— блокировка в RAM (без свопа)MAP_HUGETLB
— использование HugePages
Механизм работает через:
- Установка виртуального адреса
- Привязка к файлу (inode)
- Страница загружается в Page Table при обращении (Page Fault)
- Изменения синхронизируются (через
msync()
или приmunmap()
)
⚙️ Где применяется
Контекст | Применение |
---|---|
Shared Memory | Межпроцессное взаимодействие (IPC) |
File IO | Быстрая обработка больших файлов |
Executable Loader | Загрузка ELF, секции .text/.data/.bss |
Dynamic Linking | Отображение .so-библиотек в память |
JIT Compiler | Генерация кода во время выполнения |
Kernel | Управление отображениями через vm_area |
💻 Пример (C, mmap файла)
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int fd = open("data.bin", O_RDONLY);
char *map = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
// Теперь map[0] содержит байт из файла
munmap(map, 4096);
close(fd);
✅ Преимущества
-
Высокая производительность (минует копирование и Syscall)
-
Общая память между процессами
-
Удобство работы с файлами как с массивами
❌ Недостатки
-
Более сложное управление (особенно при изменении размеров)
-
Ошибки могут привести к Segfault
-
Требует выравнивания и учёта системной страницы
-
Не всегда эффективно на небольших файлах