Общие сведения о файлах с отображением в память

Я начал читать о вводе-выводе с отображением памяти, и у меня возникли некоторые трудности с пониманием концепций

Вот что я понял до сих пор:

У каждого процесса есть виртуальное адресное пространство. Файлам с отображением памяти выделяется определенный диапазон адресов в виртуальном адресном пространстве, который отображается на тот же адрес в физической памяти. Таким образом, все записи, которые выполняет контроллер диска в памяти (через DMA), будут отражаться в процессе без какого-либо дополнительного копирования. (В случае файла без отображения памяти ЦП должен будет скопировать содержимое в буфер процесса).

Мои сомнения:

  • Я правильно понимаю?

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


person Chander Shivdasani    schedule 11.09.2013    source источник
comment
Удаляю теги Java и NIO; это вообще не похоже на Java.   -  person chrylis -cautiouslyoptimistic-    schedule 12.09.2013


Ответы (1)


Сама подсистема памяти не имеет никакого представления о «файлах», которые являются концепцией ОС, и были некоторые операционные системы который вообще не использовал файлы. Вы близки, но немного не совсем понимаете, как работает mmap.

У каждого процесса действительно есть свое собственное виртуальное адресное пространство, которое может иметь очень мало общего с физической памятью (многие виртуальные адресные пространства вообще не связаны с какой-либо памятью, а виртуальная память, которая выгружена, не имеет никакого отношения к ней). физическая память). Система использует своего рода таблицы поиска (называемые таблицы дескрипторов на x86), которые определяют, какие диапазоны виртуальных адресов соответствуют какому физическому адресу диапазоны. Виртуальная память, которая не является «резидентной» (выгружена, mmapвыложена, но не загружена), имеет запись «отсутствует».

Всякий раз, когда программа пытается получить доступ к этой памяти, ЦП вызывает сбой страницы, который говорит ОС найти где-нибудь подходящее содержимое и загрузить его в физическую память. В случае подкачки содержимое загружается из файла подкачки или раздела; в случае mmap они загружаются откуда-то в файловой системе.

Механизм их загрузки в физическую память и обновления таблицы дескрипторов может быть разным. То, что вы описываете, - это DMA, который позволяет контроллеру накопителя копировать содержимое непосредственно в блок физической памяти, и ввод-вывод с нулевым копированием, который представляет собой метод, при котором ОС просто создает новое отображение дескриптора, сообщающее процессору о «телепорте». "область физической памяти в адресное пространство программы. Ни то, ни другое технически не требуется для mmap (ОС может загрузить файл «вручную» и скопировать его в новый буфер для программы, и это может произойти в ситуации чтения-копирования-обновления), но современные системы делают это так, как вы описали. .

Физическая память не обязательно должна быть непрерывной. Когда вызывается POSIX-версия mmap, ОС выделяет length байтов для отображения, но благодаря виртуальной памяти эти байты могут быть разделены между несколькими блоками и отображены вместе процессором.

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

person chrylis -cautiouslyoptimistic-    schedule 11.09.2013