#c #linux #mmap
#c #linux #mmap
Вопрос:
Предположим, я:
open
доступный только для чтения файлF
длинойN
в байт из процессаA
mmap
он доступенfd
только для чтения (PROT_READ
) иMAP_SHARED
mlock
возвращенный диапазон памяти.- переход в бесконечный цикл.
Насколько я понимаю, данные из файла теперь являются резидентными и поддерживаются 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()
.