Согласно Википедии (что может быть не так)
Когда выполняется системный вызов fork (), создается копия всех страниц, соответствующих родительскому процессу, загружаемая ОС в отдельную область памяти для дочернего процесса. Но это не нужно в определенных случаях. Рассмотрим случай, когда дочерний процесс выполняет
exec
системный вызов "" (который используется для выполнения любого исполняемого файла из программы на C) или завершается очень скоро послеfork()
. Когда дочерний элемент требуется просто для выполнения команды для родительского процесса, нет необходимости копировать страницы родительского процесса, поскольку онexec
заменяет адресное пространство процесса, который его вызвал, командой, которая должна быть выполнена.В таких случаях используется метод, называемый копирование при записи (COW). С помощью этой техники, когда происходит разветвление, страницы родительского процесса не копируются для дочернего процесса. Вместо этого страницы распределяются между дочерним и родительским процессами. Всякий раз, когда процесс (родительский или дочерний) изменяет страницу, для этого процесса (родительского или дочернего), который выполнил изменение, создается отдельная копия только этой конкретной страницы. Этот процесс будет использовать вновь скопированную страницу, а не общую страницу во всех будущих ссылках. Другой процесс (тот, который не изменял общую страницу) продолжает использовать оригинальную копию страницы (которая больше не является общей). Этот метод называется копированием при записи, поскольку страница копируется, когда какой-либо процесс записывает на нее.
Кажется, что когда один из процессов пытается записать на страницу, новая копия страницы выделяется и присваивается процессу, который вызвал ошибку страницы. Исходная страница впоследствии помечается как доступная для записи.
Мой вопрос: что произойдет, если fork()
get вызывается несколько раз, прежде чем какой-либо процесс попытается записать на общую страницу?
pmap -XX PID
или cat /proc/PID/smap
.