тот же файл mmap, та же физическая память?

#c #linux #mmap

#c #linux #mmap

Вопрос:

Предположим, я:

  1. open доступный только для чтения файл F длиной N в байт из процесса A
  2. mmap он доступен fd только для чтения ( PROT_READ ) и MAP_SHARED
  3. mlock возвращенный диапазон памяти.
  4. переход в бесконечный цикл.

Насколько я понимаю, данные из файла теперь являются резидентными и поддерживаются N байтами страниц физической памяти из-за mlock . Производительность чтения диапазона памяти должна быть такой же, как у обычной памяти, выделенной, скажем, malloc .

Теперь, если я создам второй процесс, B пока процесс A все еще запущен, и выполню точно такие же шаги из process B , будут ли N байты страниц физической памяти, которые поддерживают файл mmaped, такими же физическими страницами из process A ?

То есть будут ли A и B совместно использовать N байты физической памяти? Или они будут использовать 2*N байты физической памяти?

Комментарии:

1. В принципе, да. Смотрите vmtouch команду, которая делает это намеренно.

2.@IwillnotexistIdonotexist Вы пытаетесь сказать, что другие процессы вызываются mmap непреднамеренно?

3. @MaximEgorushkin Нет, я говорю, что vmtouch -l намеренно 1) open() ‘s, 2) mmap() s, 3) mlock() s и 4) «переходит в бесконечный цикл» / ожидает бесконечно, точно так, как описано OP, именно для одного из эффектов, о которых интересовался OP: разрешения другим процессам использовать эту память, зная, что она была предварительно загружена.

4. @IwillnotexistIdonotexist Теперь для меня это имеет смысл, спасибо.

Ответ №1:

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

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

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

Ответ №2:

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

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