2012-04-20 2 views
0

Я пытаюсь понять ММАП и получил следующую ссылку, чтобы прочитать:
http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-filesПонимание отображения файла

Я понимаю, текст в целом, и это имеет смысл для меня. Но в конце есть абзац, который я действительно не понимаю, или это не подходит для моего понимания.

Табличные записи таблицы только для чтения не означают, что отображение читается только, это всего лишь трюк с ядром для обмена физической памятью до последнего момента. Вы можете видеть, как «частный» является немного неправильным, пока вы не вспомните, что оно относится только к обновлениям. Следствием этого проекта является то, что виртуальная страница, которая отображает файл в частном порядке, видит изменения, внесенные в файл другими программами , пока страница была прочитана только с. Как только копирование происходит, изменения других людей больше не видны. Это поведение не гарантируется ядром, но это то, что вы получаете в x86 и имеет смысл с точки зрения API. Напротив, общее сопоставление просто отображается на кеш страницы, и все. Обновления видны другим процессам и заканчиваются на диске. Наконец, если приведенное выше отображение было доступно только для чтения, ошибки страницы вызывали бы ошибку сегментации вместо копирования при записи.

Следующая строка не подходит для меня. Я не вижу смысла.

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

Это частный. Таким образом, он не может видеть изменения другими!

И, наконец, если отображаемое выше изображение было только для чтения, ошибки страницы вызывали бы ошибку сегментации вместо копирования при записи.

Не знаю, что означает автор. Является ли их флаг «MAP_READ_ONLY»? До тех пор, пока не произойдет запись, каждый указатель с виртуальных страниц программ на страницы-таблицы-записи в кеше страницы составляет только для чтения.

Помогите мне понять эти две строки? Благодаря

Update
Кажется, он получил его, с некоторой помощью.

Последствием этого проекта является то, что виртуальная страница, которая отображает файл в частном порядке, видит изменения, внесенные в файл другими программами, если только страница была прочитана.

Хотя отображение является приватным, виртуальная страница действительно может видеть изменения другими, пока она не изменяет страницу. Модификация становится является частной и виден только на виртуальной странице программы записи.

И, наконец, если отображаемое выше изображение было только для чтения, ошибки страницы вызывали бы ошибку сегментации вместо копирования при записи.

Мне сказали, что сами страницы также могут иметь разрешения (чтение/запись/выполнение).

Скажите, если я ошибаюсь.

ответ

1

Этот фрагмент:

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

Сообщает вам, что ядро ​​немного обманывает во имя оптимизации. Даже если вы попросили приватное сопоставление, ядро ​​сначала даст вам общий доступ. Затем, если вы напишете страницу, она станет частной.

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

Мне сказали, что сами страницы также могут иметь разрешения (чтение/запись/выполнение).

Конечно, они могут. Вы должны спросить разрешения, которые вы хотите, когда вы первоначально намереваетесь сопоставить файл, на самом деле: третий аргумент mmap, который будет состоять из PROT_READ, PROT_WRITE, PROT_EXEC и PROT_NONE.

+0

Спасибо! Понял. – Peter

Смежные вопросы