В чем разница между вызовом mmap () для файла на диске до или после разветвления? - PullRequest
3 голосов
/ 26 апреля 2019

Я работал над пониманием того, как mmap () работает с файлами на диске, и в основном получаю его, но у меня все еще есть этот вопрос.

В ситуации с основным процессом, который разветвляетсякуча рабочих дочерних процессов и файл-база данных mmapped db, доступная только для чтения, имеет ли значение, если mmaps происходят в главном процессе перед вилками или в дочерних процессах?

Насколько я понимаю, если этопроисходит в главном процессе до разветвления, затем в таблице страниц памяти всем отображаемым страницам задается настройка для сбоя страницы при их чтении, запускающая ядро ​​для загрузки страницы с диска (или из кеша страниц)), и после разветвления одно дочернее чтение страницы будет означать, что страница находится в mmap и готова для чтения другими детьми, не вызывая основной ошибки страницы.

Но если mmap происходит в дочерних процессах послеРазделяют ли другие работающие дети возможность делиться этими загруженными страницами - все ли они в действительности используютэто же базовый ммап?Или каждый рабочий ребенок должен вызывать ошибку страницы и загружать каждую страницу самостоятельно?

1 Ответ

2 голосов
/ 26 апреля 2019

Нет разницы в активности сбоя страницы.Карта страницы файла является глобальной для ОС, она говорит, находится ли конкретная страница в ОЗУ или нет.PTE каждого процесса, которому сопоставлен файл, указывает на эту общую структуру данных.Будет ошибка страницы только для первого процесса, который пытается получить доступ к странице, которой нет в оперативной памяти.Это приведет к его чтению, и другие процессы, пытающиеся получить доступ к той же странице, смогут использовать эту оперативную память.

Одно из различий между двумя сценариями заключается в том, являются ли виртуальные адреса, назначенные сопоставленному блоку,тот же самый.Если вы вызовете mmap перед разветвлением, адрес будет скопирован во все дочерние элементы.Если вы позвоните mmap после разветвления, они могут получить разные адреса.Использование одного и того же адреса во всех процессах позволяет вам передавать указатели в отображенный блок между процессами, если вы хотите.Вы можете иметь указатели между объектами в блоке.Если они не все по одному адресу, вам нужно использовать смещения, и все процессы должны будут добавить смещения к базовому адресу.

...