mmap

редактировать

В вычислении, mmap(2)является POSIX - совместимая Unix системного вызова, который отображает файлы или устройства в память. Это метод ввода-вывода файлов с отображением в память. Он реализует подкачку по запросу, поскольку содержимое файла не считывается с диска напрямую и изначально вообще не использует физическую ОЗУ. Фактическое чтение с диска выполняется " ленивым " способом после обращения к определенному месту. После того, как память больше не нужна, важно munmap(2)указать на нее указатели. Информацией о защите можно управлять с помощью mprotect(2), а с помощью можно обеспечить особую обработку madvise(2).

В Linux, MacOS и BSDs, mmapможно создать несколько типов отображений. Другие операционные системы могут поддерживать только их часть; например, общие сопоставления могут оказаться непрактичными в операционной системе без глобальной VFS или кэша ввода-вывода.

СОДЕРЖАНИЕ

  • 1 История
  • 2 Файловая поддержка и анонимность
  • 3 Видимость памяти
  • 4 Пример использования на языке программирования C
  • 5 См. Также
  • 6 Ссылки
  • 7 Дальнейшее чтение

История

Первоначальный дизайн файлов с отображением в память пришел из операционной системы TOPS-20. mmapи соответствующие системные вызовы были разработаны как часть версии Unix для распространения программного обеспечения Berkeley (BSD). Их API уже был описан в Системном руководстве 4.2BSD, хотя он не был реализован ни в этом выпуске, ни в 4.3BSD. Однако Sun Microsystems реализовала именно этот API в своей операционной системе SunOS. Разработчики BSD из Калифорнийского университета в Беркли попросили Sun пожертвовать свою реализацию, но эти переговоры так и не привели к передаче кода; Вместо этого 4.3BSD-Reno поставлялась с реализацией, основанной на системе виртуальной памяти Mach.

Файловая поддержка и анонимность

Отображение на основе файлов отображает область виртуальной памяти процесса на файлы; т.е. чтение этих областей памяти приводит к чтению файла. Это тип сопоставления по умолчанию.

Анонимное сопоставление отображает область виртуальной памяти процесса, не поддерживаемую никаким файлом. Содержимое инициализируется нулем. В этом отношении анонимное сопоставление аналогично malloc и используется в некоторых malloc(3)реализациях для определенных распределений. Однако анонимные отображения не являются частью стандарта POSIX, хотя реализуется практически во всех операционных системах со стороны MAP_ANONYMOUSи MAP_ANONфлагов.

Видимость памяти

Если отображение является общим (установлен MAP_SHAREDфлаг), то оно сохраняется при системном вызове fork (2). Это означает, что записи в отображаемую область в одном процессе немедленно видны во всех связанных (родительских, дочерних или родственных) процессах. Если отображение является общим и поддерживается файлом (а не MAP_ANONYMOUS), базовый файловый носитель гарантированно будет записан только после того, как он будет обработан msync (2).

Если отображение является частным (установлен MAP_PRIVATEфлаг), изменения не будут видны другим процессам и не будут записаны в файл.

Процесс чтения или записи в базовый файл не всегда будет видеть те же данные, что и процесс, который сопоставил файл, поскольку сегмент файла копируется в ОЗУ и периодически сбрасывается на диск. Синхронизацию можно принудительно выполнить с помощью msyncсистемного вызова.

Файлы mmap (2) могут значительно снизить накладные расходы памяти для приложений, обращающихся к одному и тому же файлу; они могут совместно использовать область памяти, которую охватывает файл, вместо того, чтобы загружать файл для каждого приложения, которому требуется доступ к нему. Это означает, что mmap (2) иногда используется для межпроцессного взаимодействия (IPC). В современных операционных системах mmap (2) обычно предпочтительнее, чем средство Shared Memory System V IPC.

Основное различие между разделяемой памятью System V (shmem) и вводом-выводом с отображением памяти (mmap) заключается в том, что разделяемая память System V является постоянной: если она явно не удалена процессом, она сохраняется в памяти и остается доступной до тех пор, пока система не будет выключена.. Память mmap не сохраняется между выполнениями приложения (если она не поддерживается файлом).

Пример использования на языке программирования C

#include lt;sys/types.hgt; #include lt;sys/mman.hgt; #include lt;err.hgt; #include lt;fcntl.hgt; #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;string.hgt; #include lt;unistd.hgt; /* This example shows how an mmap of /dev/zero is equivalent to using anonymous memory (MAP_ANON) not connected to any file. N.B. MAP_ANONYMOUS or MAP_ANON are supported by most UNIX versions, removing the original purpose of /dev/zero. */ /* Does not work on OS X or macOS, where you can't mmap over /dev/zero */ int main(void) { const char str1[] = "string 1"; const char str2[] = "string 2"; pid_t parpid = getpid(), childpid; int fd = -1; char *anon, *zero; if ((fd = open("/dev/zero", O_RDWR, 0)) == -1) err(1, "open"); anon = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); zero = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (anon == MAP_FAILED || zero == MAP_FAILED) errx(1, "either mmap"); strcpy(anon, str1); strcpy(zero, str1); printf("PID %d:\tanonymous %s, zero-backed %s\n", parpid, anon, zero); switch ((childpid = fork())) { case -1: err(1, "fork"); /* NOTREACHED */ case 0: childpid = getpid(); printf("PID %d:\tanonymous %s, zero-backed %s\n", childpid, anon, zero); sleep(3); printf("PID %d:\tanonymous %s, zero-backed %s\n", childpid, anon, zero); munmap(anon, 4096); munmap(zero, 4096); close(fd); return EXIT_SUCCESS; } sleep(2); strcpy(anon, str2); strcpy(zero, str2); printf("PID %d:\tanonymous %s, zero-backed %s\n", parpid, anon, zero); munmap(anon, 4096); munmap(zero, 4096); close(fd); return EXIT_SUCCESS; }

образец вывода:

PID 22475: anonymous string 1, zero-backed string 1 PID 22476: anonymous string 1, zero-backed string 1 PID 22475: anonymous string 2, zero-backed string 2 PID 22476: anonymous string 2, zero-backed string 2

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

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

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

Последняя правка сделана 2023-12-31 10:54:58
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте