Мой вопрос: когда мы создаем отображение анонимной памяти, какой файл отображается в адресное пространство процесса.
Файла нет.
Я знаю, что анонимное сопоставление гарантированно будет заполнено нулями. Значит, это файл / 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
и друзья).