Jak Copy-on-Write w fork () obsługuje wiele widelców?
Według wikipedii (co może być błędne)
Gdy wywoływane jest wywołanie systemowe fork (), tworzona jest kopia wszystkich stron odpowiadających procesowi nadrzędnemu, ładowana do oddzielnej lokalizacji pamięci przez system operacyjny dla procesu potomnego. Ale w niektórych przypadkach nie jest to konieczne. Rozważmy przypadek, gdy dziecko wykonuje wywołanie systemowe „exec” (które jest używane do wykonywania dowolnego pliku wykonywalnego z poziomu programu C) lub kończy działanie zaraz po fork (). Gdy dziecko jest potrzebne tylko do wykonania polecenia dla procesu macierzystego, nie ma potrzeby kopiowania stron procesu nadrzędnego, ponieważ exec zastępuje przestrzeń adresową procesu, który go wywołał, poleceniem, które ma zostać wykonane.
W takich przypadkach używana jest technika zwana kopiowaniem przy zapisie (COW). Dzięki tej technice, gdy pojawia się widelec, strony procesu macierzystego nie są kopiowane dla procesu potomnego. Zamiast tego strony są współużytkowane przez dziecko i proces macierzysty. Gdy proces (rodzic lub dziecko) modyfikuje stronę, dla tego procesu (rodzica lub dziecka), która dokonała modyfikacji, tworzona jest osobna kopia tej konkretnej strony. Ten proces będzie następnie wykorzystywał nowo skopiowaną stronę, a nie udostępnioną we wszystkich przyszłych odniesieniach. Drugi proces (ten, który nie zmodyfikował udostępnionej strony) nadal korzysta z oryginalnej kopii strony (która nie jest już udostępniana). Ta technika jest nazywana kopiowaniem podczas zapisu, ponieważ strona jest kopiowana, gdy jakiś proces zapisuje na niej.
Wydaje się, że gdy któryś z procesów próbuje zapisać na stronie. Nowa kopia strony jest przydzielana i przypisywana do procesu, który wygenerował błąd strony. Oryginalna strona jest później oznaczona do zapisu.
Moje pytanie brzmi: co się stanie, jeśli widelec zostanie wywołany wiele razy, zanim jakikolwiek proces podejmie próbę zapisu na udostępnionej stronie?