Mmap тот же файл, та же физическая память? - PullRequest
1 голос
/ 27 марта 2019

Предположим, что I:

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

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

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

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

0 голосов
/ 27 марта 2019

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

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

...