Учебники

Отображение памяти

Системный вызов mmap () обеспечивает отображение в виртуальном адресном пространстве вызывающего процесса, который отображает файлы или устройства в память. Это двух типов –

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

Анонимное сопоставление – это сопоставление отображает область виртуальной памяти процесса без поддержки какого-либо файла. Содержимое инициализируется до нуля. Это отображение похоже на динамическое выделение памяти (malloc ()) и используется в некоторых реализациях malloc () для определенных распределений.

Память в одном отображении процесса может использоваться совместно с отображениями в других процессах. Это можно сделать двумя способами –

  • Когда два процесса отображают одну и ту же область файла, они совместно используют одни и те же страницы физической памяти.

  • Если дочерний процесс создан, он наследует сопоставления родительского объекта, и эти сопоставления ссылаются на те же страницы физической памяти, что и родительский. При любом изменении данных в дочернем процессе будут созданы разные страницы для дочернего процесса.

Когда два процесса отображают одну и ту же область файла, они совместно используют одни и те же страницы физической памяти.

Если дочерний процесс создан, он наследует сопоставления родительского объекта, и эти сопоставления ссылаются на те же страницы физической памяти, что и родительский. При любом изменении данных в дочернем процессе будут созданы разные страницы для дочернего процесса.

Когда два или более процессов совместно используют одни и те же страницы, каждый процесс может видеть изменения содержимого страницы, сделанные другими процессами, в зависимости от типа отображения. Тип отображения может быть частным или общим –

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

Общее сопоставление (MAP_SHARED) – изменения содержимого этого сопоставления видны другим процессам, и сопоставление переносится в базовый файл.

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

Приведенный выше системный вызов возвращает начальный адрес сопоставления в случае успеха или MAP_FAILED в случае ошибки.

Виртуальный адрес addr может быть либо задан пользователем, либо сгенерирован ядром (после передачи addr как NULL). Указанная длина поля требует размера отображения в байтах. Поле prot указывает значения защиты памяти, такие как PROT_NONE, PROT_READ, PROT_WRITE, PROT_EXEC, предназначенные для областей, к которым нельзя получить доступ, прочитать, записать или выполнить соответственно. Это значение может быть одинарным (PROT_NONE) или ORd с любым из трех флагов (последние 3). Флаги поля указывают тип отображения либо либо MAP_PRIVATE, либо MAP_SHARED. Поле «fd» указывает дескриптор файла, идентифицирующий файл, который должен быть отображен, а поле «смещение» подразумевает начальную точку файла, если необходимо отобразить весь файл, смещение должно быть равно нулю.

#include <sys/mman.h>

int munmap(void *addr, size_t length);

Приведенный выше системный вызов возвращает 0 в случае успеха или -1 в случае ошибки.

Системный вызов munmap, выполняет сопоставление уже отображенной области памяти. Поля addr указывают начальный адрес отображения, а длина указывает размер в байтах сопоставления, которое должно быть отображено. Как правило, сопоставление и снятие сопоставления было бы для всех отображаемых областей. Если это должно быть иначе, то это должно быть или сжато или разделено на две части. Если адрес не имеет отображений, этот вызов не будет иметь никакого эффекта, и вызов вернет 0 (успех).

Давайте рассмотрим пример –

Шаг 1 – Запишите в файл буквенно-цифровые символы, как показано ниже –

0 1 2 25 26 27 28 29 30 31 32 33 34 35 36 37 38 59 60 61
В С Z 0 1 2 3 4 5 6 7 8 9 б с Икс Y Z

Шаг 2 – отобразить содержимое файла в память с помощью системного вызова mmap (). Это вернет начальный адрес после сопоставления в памяти.

Шаг 3 – Доступ к содержимому файла с использованием нотации массива (можно также получить доступ с нотацией указателя), поскольку не читает дорогой системный вызов read (). Используя отображение памяти, избегайте многократного копирования между пользовательским пространством, буферами пространства ядра и буферным кешем.

Шаг 4 – Повторяйте чтение содержимого файла, пока пользователь не введет «-1» (означает конец доступа).

Шаг 5 – Выполните действия по очистке, т. Е. Отключите отображенную область памяти (munmap ()), закройте файл и удалите файл.