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