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

Смотрите также

Рекомендации

  1. ^ Уильям Джой; Эрик Купер; Роберт Фабри; Сэмюэл Леффлер; Кирк МакКусик; Дэвид Мошер (1983). 4.2 Руководство по системе BSD (PDF) (Отчет). Группа исследования компьютерных систем, Калифорнийский университет в Беркли.
  2. ^ МакКьюзик, Маршалл Кирк (1999). «Двадцать лет Berkeley Unix: от владения AT&T до свободно распространяемого». Открытые источники: голоса революции открытого исходного кода. О'Рейли.
  3. ^ "mmap (2) - страница руководства Linux".

дальнейшее чтение