Существует два основных варианта использования этой функции.
Во-первых, вы можете разделить память между процессами, которые могут взаимодействовать через общие страницы.Фактически, разделяемая память является одной из самых простых форм IPC.
Но общие страницы только для чтения могут также использоваться, чтобы избежать бесполезного дублирования: в большинстве случаев код программы не изменяется после ее загрузки в память, поэтому ее страницы памяти могут использоваться всеми процессами.которые запускают эту программу.Очевидно, только общий код , страницы памяти, содержащие стек, кучу и вообще данные (или, если вы предпочитаете, состояние) программы, не передаются.
Этот трюк улучшен с помощью «копирования при записи».Код исполняемых файлов обычно не изменяется при запуске, но есть программы, которые на самом деле самоизменяются (они были довольно распространены в прошлом, когда большая часть разработки все еще выполнялась в сборке);для поддержки этого материала операционная система выполняет общий доступ только для чтения, как описано выше, но, если она обнаруживает запись на одной из совместно используемых страниц, она отключает общий доступ для такой страницы, создавая ее независимую копию и позволяя программе писатьтам.
Этот прием особенно полезен в ситуациях, когда существует высокая вероятность того, что данные не изменятся, но это может произойти.
Другой случай, в котором этот метод может быть использован, - это когда процесс разветвляется: вместо копирования каждой страницы памяти (что совершенно бесполезно, если дочерний процесс немедленно выполняет exec
), новый процесс делится сродительский все свои страницы памяти в режиме копирования при записи, что позволяет быстро создать процесс, все еще "подделывая" "классическое" поведение вилки.