Według Wikipedii (co może być błędne)
Po wydaniu wywołania systemowego fork () tworzona jest kopia wszystkich stron odpowiadających procesowi nadrzędnemu, ładowana przez system operacyjny do osobnego miejsca w pamięci dla procesu potomnego. Ale w niektórych przypadkach nie jest to konieczne. Rozważ przypadek, gdy dziecko wykonuje
exec
wywołanie systemowe ("używane do wykonania dowolnego pliku wykonywalnego z programu C) lub kończy pracę wkrótce pofork()
. Gdy dziecko jest potrzebne tylko do wykonania polecenia dla procesu nadrzędnego, nie ma potrzeby kopiowania stron procesu nadrzędnego, ponieważexec
zastępuje przestrzeń adresową procesu, który ją wywołał, poleceniem do wykonania.W takich przypadkach stosowana jest technika zwana kopiowaniem przy zapisie (COW). Dzięki tej technice, gdy występuje rozwidlenie, strony procesu nadrzędnego nie są kopiowane do procesu potomnego. Zamiast tego strony są współużytkowane przez proces podrzędny i nadrzędny. Ilekroć proces (rodzic lub dziecko) modyfikuje stronę, tworzona jest osobna kopia samej strony dla tego procesu (rodzic lub dziecko), który dokonał modyfikacji. Ten proces będzie wykorzystywał nowo skopiowaną stronę zamiast udostępnionej 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 nazywa się kopiowaniem przy zapisie, ponieważ strona jest kopiowana, gdy jakiś proces do niej zapisuje.
Wygląda na to, że gdy którykolwiek z procesów próbuje zapisać na stronie, nowa kopia strony zostaje przydzielona i przypisana do procesu, który wygenerował błąd strony. Oryginalna strona zostaje następnie oznaczona do zapisu.
Moje pytanie brzmi: co się stanie, jeśli fork()
wywołanie zostanie wywołane wiele razy, zanim którykolwiek z procesów spróbuje napisać na udostępnionej stronie?
pmap -XX PID
lub cat /proc/PID/smap
.