Поскольку вы не указали никаких подробностей, я предполагаю, что вас интересует поведение Unix-подобных систем.
Фактически open()
системный вызов создает только дескриптор файла, который затем может использоваться либо mmap()
, либо read()
.
Оба ввода-вывода с отображением памяти и стандартного ввода-вывода для внутреннего доступа к файлам на диске через кеш страницы, буфер, в котором файлы кэшируются, чтобы сократить количество операций ввода-вывода.
Стандартный подход ввода-вывода (с использованием write()
и read()
) включает в себя выполнение системного вызова, который затем копирует данные из кеша страницы (или если вы пишете) в буфер, выбранный приложением. В дополнение к этому для не последовательного доступа требуется другой системный вызов lseek()
. Системные вызовы являются дорогостоящими и копируют данные.
Когда файл имеет карту памяти, обычно область памяти в адресном пространстве процесса отображается непосредственно в кеш страницы, так что все считывания и записи уже загруженных данных могут выполняться без дополнительной задержки (без системных вызовов, без копирования данных). Только когда приложение пытается получить доступ к области файлов, которая еще не загружена, возникает ошибка страницы, и ядро загружает требуемые данные (целую страницу) с диска.
EDIT: Я вижу, что я также должен объяснить память paging. На большинстве современных архитектур существует физическая память, которая является реальным аппаратным обеспечением и виртуальной памятью, которая создает адресные пространства для процессов. Ядро решает, как адреса в виртуальной памяти сопоставляются с адресами в физической памяти. Самая маленькая единица - это страница памяти (обычно, но не всегда 4K). Это не должно быть сопоставление 1: 1, например, все страницы виртуальной памяти могут отображаться на один и тот же физический адрес.
В области ввода-вывода с отображением в память адресного пространства приложения и кеша страницы ядра сопоставляется с той же областью физической памяти, поэтому программа может напрямую обращаться к кешу страницы.
спасибо за ответ, но у меня мало сомнений в этом ............ 1. Что означает отображение здесь точно? 2. В I/O с отображением памяти, где происходит чтение и запись, то есть в кеше страницы или в адресном пространстве процесса? –