📌 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

Механизм работает через:

  1. Установка виртуального адреса
  2. Привязка к файлу (inode)
  3. Страница загружается в Page Table при обращении (Page Fault)
  4. Изменения синхронизируются (через 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

  • Требует выравнивания и учёта системной страницы

  • Не всегда эффективно на небольших файлах