Поскольку вы не предоставили подробностей, я предполагаю, что вас интересует поведение Unix-подобных систем.
На самом деле системный вызов open()
только создает файловый дескриптор, который затем может использоваться как mmap()
или read()
.
Как ввод-вывод с отображением памяти, так и стандартный ввод-вывод внутренне обращаются к файлам на диске через кэш страниц, буфер, в котором кэшируются файлы, чтобы уменьшить количество операций ввода-вывода.
Стандартный подход ввода-вывода (с использованием write()
и read()
) включает выполнение системного вызова, который затем копирует данные из (или, если вы пишете) кэша страниц в буфер, выбранный приложением. В дополнение к этому непоследовательный доступ требует другого системного вызова lseek()
. Системные вызовы дороги, как и копирование данных.
Когда файл отображается в память, обычно область памяти в адресном пространстве процесса отображается непосредственно в кеш страниц, так что все операции чтения и записи уже загруженных данных могут выполняться без дополнительной задержки (без системных вызовов, без копирования данных). Только когда приложение пытается получить доступ к области файла, которая еще не загружена, возникает ошибка страницы, и ядро загружает необходимые данные (всю страницу) с диска.
EDIT: я вижу, что мне также нужно объяснить пейджинг памяти. В большинстве современных архитектур есть физическая память, которая является реальной частью оборудования, и виртуальная память, которая создает адресные пространства для процессов. Ядро решает, как адреса в виртуальной памяти сопоставляются с адресами в физической памяти. Наименьшая единица — это страница памяти (обычно, но не всегда 4К). Это не обязательно должно быть сопоставление 1:1, например, все страницы виртуальной памяти могут быть сопоставлены с одним и тем же физическим адресом.
В отображенном на память вводе-выводе часть адресного пространства приложения и кеш страниц ядра отображаются в одну и ту же область физической памяти, поэтому программа может напрямую обращаться к кешу страниц.
person
Paweł Dziepak
schedule
07.10.2012