существует"Узнайте о технологии нулевого копирования в одной статье, мы представили零拷贝技术
Принцип, и мы знаем, чтоmmap
Это также реализация технологии нулевого копирования. В этой статье мы в основном знакомимmmap
принцип.
Во-первых, традиционное чтение документов
Вообще говоря, изменение содержимого файла требует следующих трех шагов:
- Считайте содержимое файла в память.
- Измените содержимое памяти.
- Запишите данные из памяти в файл.
Процесс показан на рисунке 1:
Если вы используете код для реализации вышеуказанного процесса, код выглядит следующим образом:
read(fd, buf, 1024); // 读取文件的内容到buf
... // 修改buf的内容
write(fd, buf, 1024); // 把buf的内容写入到文件
Как видно из рисунка 1,页缓存(page cache)
Является средним слоем при чтении и записи файлов, ядро использует页缓存
Связан с блоком данных файла. Поэтому, когда приложение читает и записывает файл, фактическая операция页缓存
.
2. Используйте mmap для чтения и записи файлов
Из традиционного процесса чтения и записи файлов мы можем обнаружить, что есть место для оптимизации: если вы можете читать и писать прямо в пользовательском пространстве页缓存
, то можно избежать页缓存
Процесс копирования данных в буферы пользовательского пространства.
Итак, существует ли такая технология, которая может достичь вышеупомянутого? Ответ да, этоmmap
.
использоватьmmap
Системный вызов может отображать (привязывать) адрес виртуальной памяти пользовательского пространства к файлу, а операции чтения и записи для сопоставленного адреса виртуальной памяти такие же, как операции чтения и записи для файла. Принцип показан на рисунке 2:
Как мы упоминали ранее, чтение и запись файлов должны проходить через页缓存
,такmmap
Это файл, который отображается页缓存
, а не сам файл на диске. так какmmap
файл отображается页缓存
, значит проблема синхронизации, т.е.页缓存
Когда данные будут синхронизированы на диск.
Ядро Linux не активноmmap
нанесен на карту页缓存
Синхронизируется с диском, но требует активного запуска пользователем. Синхронизироватьmmap
Существует 4 случая отображения памяти на диск:
- перечислить
msync
Функция активно выполняет синхронизацию данных (активна). - перечислить
munmap
Когда функция отменяет сопоставление файла (активно). - Когда процесс завершается (пассивный).
- Когда система выключается (пассивная).
3. Как использовать ммап
Ниже мы расскажем, как использоватьmmap
,mmap
Прототип функции выглядит следующим образом:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
Давайте представимmmap
Назначение каждого параметра функции:
-
addr
: указывает отображаемый адрес виртуальной памяти, для которого можно установить значение NULL, чтобы позволить ядру Linux автоматически выбирать соответствующий адрес виртуальной памяти. -
length
: Длина карты. -
prot
: Режим защиты отображаемой памяти, необязательные значения следующие:-
PROT_EXEC
: может быть выполнено.
-
PROT_READ
: Можно прочитать. -
PROT_WRITE
: Можно написать. -
PROT_NONE
: Не доступный.
-
-
flags
: Указывает тип сопоставления.Часто используемые необязательные значения:-
MAP_FIXED
: использовать указанный начальный адрес виртуальной памяти для сопоставления.
-
MAP_SHARED
: Совместное использование пространства сопоставления со всеми другими процессами, которые сопоставляются с этим файлом (может быть реализована общая память). -
MAP_PRIVATE
: создать частное пространство сопоставления с копированием при записи. -
MAP_LOCKED
: Блокирует страницы в отображаемой области, чтобы предотвратить их выгрузку из памяти. - ...
-
-
fd
: Дескриптор файла для сопоставления. -
offset
: Смещение файла (откуда начать сопоставление в файле).
Введениеmmap
После прототипа функции мы теперь познакомимся с тем, как ее использовать, на простом примере.mmap
:
int fd = open(filepath, O_RDWR, 0644); // 打开文件
void *addr = mmap(NULL, 8192, PROT_WRITE, MAP_SHARED, fd, 4096); // 对文件进行映射
В приведенном выше примере мы сначала передаемopen
функция, чтобы открыть файл для чтения и записи, затем передатьmmap
Функция отображает файл следующим образом:
-
addr
Параметр имеет значение NULL, что означает, что операционная система автоматически выбирает соответствующий адрес виртуальной памяти для сопоставления. -
length
Установка параметра на 8192 означает, что отображаемая область имеет размер 2 страницы памяти (одна страница памяти имеет размер 4 КБ). -
prot
параметр установлен наPROT_WRITE
Указывает, что отображаемая область памяти доступна для чтения и записи. -
flags
параметр установлен наMAP_SHARED
Указывает общую область сопоставления. -
fd
Параметр задает дескриптор открытого файла. -
offset
Параметр установлен на 4096, чтобы начать сопоставление с 4096 в файле.
mmap
Функция вернет сопоставленный адрес памяти, мы можем читать и записывать файл через этот адрес памяти. Мы показываем структуру приведенного выше примера в ядре на рисунке 3:
4. Резюме
Эта статья в основном знакомитmmap
Принцип и использование, благодаря этой статье мы можем узнать, использоватьmmap
При чтении и записи файлов количество копий памяти может быть уменьшено, а количество системных вызовов уменьшено, что повышает эффективность операций чтения и записи файлов.
Так как ядро активно не синхронизируетсяmmap
Данные в отображенной области памяти, поэтому потеря данных может произойти в некоторых особых случаях (например, при сбое питания). Во избежание потери данных используйтеmmap
может быть активно вызван, когда это уместноmsync
функция синхронизации данных в отображаемой области памяти.