В какой файл отображается анонимное отображение памяти в linux? - PullRequest
0 голосов
/ 29 мая 2020

Мой вопрос: когда мы создаем отображение анонимной памяти , какой файл отображается в адресное пространство процесса. Я знаю, что анонимное отображение гарантированно будет заполнено нулями. Значит, это файл / dev / zero ? Насколько я понимаю, межпроцессное взаимодействие невозможно до тех пор, пока не появится какой-либо файл, который отображается в адресных пространствах участвующих процессов ... будь то файл в tmpfs или в обычной файловой системе. Я новичок в Inter Process Communication, если вы обнаружите какой-либо изъян в моем понимании, исправьте его.

Ответы [ 2 ]

1 голос
/ 30 мая 2020

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

Файла нет.

Я знаю, что анонимное сопоставление гарантированно будет заполнено нулями. Значит, это файл / dev / zero?

Нет.

Исторически, однако, флаг MAP_ANONYMOUS является более новым изобретением, чем сам mmap. До этого, если вы хотели, чтобы кусок памяти был заполнен нулями и не поддерживался никаким обычным файлом, вы действительно открывали /dev/zero и отображали его. ОС обрабатывала это как особый случай и фактически давала вам анонимное сопоставление; разные процессы, создающие сопоставления /dev/zero, не видели бы данные друг друга, даже если бы они использовали MAP_SHARED. Я считаю, что флаг MAP_ANONYMOUS был введен, чтобы упростить этот процесс и избежать дополнительных системных вызовов для открытия и закрытия /dev/zero.

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

Ну, это не так; MAP_ANONYMOUS | MAP_SHARED - контрпример к этому. Если ваш процесс создает сопоставление с MAP_ANONYMOUS | MAP_SHARED, то любые дочерние элементы, созданные с помощью fork() после этой точки (и их дочерние элементы и т. Д.), Унаследуют сопоставление, и память будет совместно использоваться всеми ими и родителем. Любая запись в эту память любым из этих процессов будет видна всем из них.

Это означает, что вы можете использовать это только для IP C между «связанными» процессами, потомками общего предка, который создал отображение (если нет хитрых приемов, о которых я не знаю, чтобы предоставить доступ к несвязанным процессам). Отображение фактического файла (кроме /dev/zero) не имеет этого ограничения.

И, конечно же, есть другие механизмы IP C, которые вообще не задействуют файлы, например, разделяемая память POSIX (shmget и друзья).

1 голос
/ 29 мая 2020

От man mmap:

MAP_ANONYMOUS

Сопоставление не поддерживается никаким файлом; [...]

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

...