Mmap - mmap - Wikipedia
В вычисление, mmap (2)
это POSIX -соответствующий Unix системный вызов который отображает файлы или устройства в память. Это метод файл с отображением памяти Ввод / вывод. Он реализует пейджинг по запросу потому что содержимое файла не считывается с диска напрямую и изначально вообще не использует физическую оперативную память. Фактическое чтение с диска выполняется в "ленивый "способом, после доступа к определенному месту. Когда память больше не нужна, важно munmap (2)
указатели на него. Информацией о защите можно управлять с помощью mprotect (2)
, и особый режим может быть применен с помощью madvise (2)
.
В Linux, macOS и BSD, mmap
может создавать несколько типов сопоставлений. Другие операционные системы могут поддерживать только их подмножество, например, общие сопоставления могут оказаться непрактичными в операционной системе без глобального VFS или кеш ввода-вывода.
История
Первоначальный дизайн файлов с отображением памяти возник из ТОП-20 Операционная система. mmap
и связанные системные вызовы были разработаны как часть Распространение программного обеспечения Беркли (BSD) версия Unix. Их API уже был описан в Системном руководстве 4.2BSD, хотя он не был реализован ни в этом выпуске, ни в 4.3BSD.[1] Sun Microsystems реализовали этот самый API в своих SunOS Операционная система. Разработчики BSD в U.C. Беркли попросил Sun пожертвовать его реализацию, но эти переговоры так и не привели к передаче кода; 4.3BSD-Reno поставлялась вместо этого с реализацией, основанной на системе виртуальной памяти Мах.[2]
Файловая поддержка и анонимность
Сопоставление с файловой поддержкой отображает область процесса виртуальная память в файлы; т.е. чтение этих областей памяти приводит к чтению файла. Это тип сопоставления по умолчанию.
Анонимное отображение отображает область виртуальной памяти процесса, не поддерживаемую никаким файлом. Содержимое инициализируется нулем.[3] В этом отношении анонимное сопоставление похоже на маллок
, и используется в некоторых маллок (3)
реализации для определенных распределений. Однако анонимные сопоставления не являются частью стандарта POSIX, хотя они реализованы почти во всех операционных системах MAP_ANONYMOUS
и MAP_ANON
флаги.
Видимость памяти
Если отображение общий (в MAP_SHARED
установлен флаг), то он сохраняется через вилка (2) системный вызов. Это означает, что записи в отображаемую область в одном процессе сразу же видны во всех связанных (родительских, дочерних или родственных) процессах. Если отображение общий и поддерживается файлом (не MAP_ANONYMOUS
) базовый файловый носитель гарантированно будет записан только после того, как он будет msync (2) 'ed.
Если отображение частный (в MAP_PRIVATE
установлен флаг), изменения не будут видны другим процессам и не будут записаны в файл.
Процесс чтения или записи в базовый файл не всегда будет видеть те же данные, что и процесс, который сопоставил файл, поскольку сегмент файла копируется в ОЗУ и периодически сбрасывается на диск. Синхронизацию можно принудительно выполнить с помощью msync
системный вызов.
Файлы mmap (2) могут значительно снизить накладные расходы памяти для приложений, обращающихся к одному и тому же файлу; они могут совместно использовать область памяти, которую охватывает файл, вместо того, чтобы загружать файл для каждого приложения, которому требуется доступ к нему. Это означает, что mmap (2) иногда используется для Межпроцессного взаимодействия (МПК). На современном операционные системы, mmap (2) обычно предпочтительнее Система V МПК Общая память средство.
Основное различие между разделяемой памятью System V (shmem) и вводом-выводом с отображением памяти (mmap) заключается в том, что разделяемая память SystemV является постоянной: если она явно не удалена процессом, она хранится в памяти и остается доступной до завершения работы системы. Память mmap не является постоянной между выполнениями приложения (если она не поддерживается файлом).
Пример использования на языке программирования C
#включают <sys/types.h>#включают <sys/mman.h>#включают <err.h>#включают <fcntl.h>#включают <stdio.h>#включают <stdlib.h>#включают <string.h>#включают <unistd.h>/ * Не работает в OS X, так как вы не можете использовать mmap поверх / dev / zero * /int главный(пустота){ const char str1[] = "строка 1"; const char ул2[] = "строка 2"; pid_t парпид = Getpid(), ребенок; int fd = -1; char *анон, *нуль; если ((fd = открыто("/ dev / zero", O_RDWR, 0)) == -1) ошибаться(1, "открыто"); анон = (char*)mmap(НОЛЬ, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); нуль = (char*)mmap(НОЛЬ, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); если (анон == MAP_FAILED || нуль == MAP_FAILED) ошибка(1, "либо ММАП"); strcpy(анон, str1); strcpy(нуль, str1); printf("PID% d: танонимный% s, без поддержки% s п", парпид, анон, нуль); выключатель ((ребенок = вилка())) { дело -1: ошибаться(1, "вилка"); / * НЕ ДОСТУПЕН * / дело 0: ребенок = Getpid(); printf("PID% d: танонимный% s, без поддержки% s п", ребенок, анон, нуль); спать(3); printf("PID% d: танонимный% s, без поддержки% s п", ребенок, анон, нуль); munmap(анон, 4096); munmap(нуль, 4096); Закрыть(fd); возвращаться EXIT_SUCCESS; } спать(2); strcpy(анон, ул2); strcpy(нуль, ул2); printf("PID% d: танонимный% s, без поддержки% s п", парпид, анон, нуль); munmap(анон, 4096); munmap(нуль, 4096); Закрыть(fd); возвращаться EXIT_SUCCESS;}
образец вывода:
PID 22475: анонимная строка 1, строка с нулевым резервом 1 PID 22476: анонимная строка 1, строка с нулевым резервом 1 PID 22475: анонимная строка 2, строка с нулевым резервом 2 PID 22476: анонимная строка 2, строка с нулевым резервом 2
Смотрите также
- Виртуальная память когда адресного пространства больше, чем физической памяти
- Пейджинг для реализации виртуальной памяти
- Кеш страницы для механизма кэширования диска, используемого mmap
- Пейджинг по запросу для схемы реализованной mmap
Рекомендации
- ^ Уильям Джой; Эрик Купер; Роберт Фабри; Сэмюэл Леффлер; Кирк МакКусик; Дэвид Мошер (1983). 4.2 Руководство по системе BSD (PDF) (Отчет). Группа исследования компьютерных систем, Калифорнийский университет в Беркли.
- ^ МакКьюзик, Маршалл Кирк (1999). «Двадцать лет Berkeley Unix: от владения AT&T до свободно распространяемого». Открытые источники: голоса революции открытого исходного кода. О'Рейли.
- ^ "mmap (2) - страница руководства Linux".
дальнейшее чтение
- Описание из стандарта POSIX
- Отличия:
- Windows
- MapViewOfFile Функция win32 в некоторой степени эквивалентна mmap.
- Еще пример исходного кода:
- SharedHashFile, Хеш-таблица с общей памятью с открытым исходным кодом, реализованная с помощью mmap ().