Сама подсистема памяти не имеет никакого представления о «файлах», которые являются концепцией ОС, и были некоторые операционные системы который вообще не использовал файлы. Вы близки, но немного не совсем понимаете, как работает mmap
.
У каждого процесса действительно есть свое собственное виртуальное адресное пространство, которое может иметь очень мало общего с физической памятью (многие виртуальные адресные пространства вообще не связаны с какой-либо памятью, а виртуальная память, которая выгружена, не имеет никакого отношения к ней). физическая память). Система использует своего рода таблицы поиска (называемые таблицы дескрипторов на x86), которые определяют, какие диапазоны виртуальных адресов соответствуют какому физическому адресу диапазоны. Виртуальная память, которая не является «резидентной» (выгружена, mmap
выложена, но не загружена), имеет запись «отсутствует».
Всякий раз, когда программа пытается получить доступ к этой памяти, ЦП вызывает сбой страницы, который говорит ОС найти где-нибудь подходящее содержимое и загрузить его в физическую память. В случае подкачки содержимое загружается из файла подкачки или раздела; в случае mmap
они загружаются откуда-то в файловой системе.
Механизм их загрузки в физическую память и обновления таблицы дескрипторов может быть разным. То, что вы описываете, - это DMA, который позволяет контроллеру накопителя копировать содержимое непосредственно в блок физической памяти, и ввод-вывод с нулевым копированием, который представляет собой метод, при котором ОС просто создает новое отображение дескриптора, сообщающее процессору о «телепорте». "область физической памяти в адресное пространство программы. Ни то, ни другое технически не требуется для mmap
(ОС может загрузить файл «вручную» и скопировать его в новый буфер для программы, и это может произойти в ситуации чтения-копирования-обновления), но современные системы делают это так, как вы описали. .
Физическая память не обязательно должна быть непрерывной. Когда вызывается POSIX-версия mmap
, ОС выделяет length
байтов для отображения, но благодаря виртуальной памяти эти байты могут быть разделены между несколькими блоками и отображены вместе процессором.
Если несколько процессов пытаются mmap
один и тот же файл, поведение ОС зависит от того, доступен ли доступ только для чтения или чтения / записи; копии, доступные только для чтения, могут использоваться многими процессами (например, фактическим исполняемым кодом; вот почему, хотя в Chrome могут быть запущены десятки процессов, двоичный файл Chrome находится в памяти только один раз).
person
chrylis -cautiouslyoptimistic-
schedule
11.09.2013