Laut Wikipedia (was falsch sein könnte)
Bei einem Systemaufruf von fork () wird eine Kopie aller Seiten erstellt, die dem übergeordneten Prozess entsprechen, und vom Betriebssystem für den untergeordneten Prozess in einen separaten Speicherort geladen. In bestimmten Fällen ist dies jedoch nicht erforderlich. Betrachten Sie den Fall, dass ein Kind einen "
exec
" Systemaufruf ausführt (mit dem eine ausführbare Datei in einem C - Programm ausgeführt wird) oder sehr bald nach dem beendet wirdfork()
. Wenn das untergeordnete Element nur zum Ausführen eines Befehls für den übergeordneten Prozess benötigt wird, müssen die Seiten des übergeordneten Prozesses nicht kopiert werden, daexec
der Adressraum des aufgerufenen Prozesses durch den auszuführenden Befehl ersetzt wird.In solchen Fällen wird eine Technik verwendet, die als Copy-on-Write (COW) bezeichnet wird. Bei dieser Technik werden beim Verzweigen die Seiten des übergeordneten Prozesses nicht für den untergeordneten Prozess kopiert. Stattdessen werden die Seiten zwischen dem untergeordneten und dem übergeordneten Prozess geteilt. Wenn ein Prozess (übergeordnet oder untergeordnet) eine Seite ändert, wird nur eine separate Kopie dieser bestimmten Seite für den Prozess (übergeordnet oder untergeordnet) erstellt, der die Änderung durchgeführt hat. Bei diesem Vorgang wird in allen zukünftigen Verweisen die neu kopierte Seite anstelle der freigegebenen Seite verwendet. Der andere Prozess (der die freigegebene Seite nicht geändert hat) verwendet weiterhin die Originalkopie der Seite (die jetzt nicht mehr freigegeben ist). Diese Technik wird als Copy-on-Write bezeichnet, da die Seite kopiert wird, wenn ein Prozess darauf schreibt.
Es scheint, dass, wenn einer der Prozesse versucht, auf die Seite zu schreiben, eine neue Kopie der Seite zugewiesen und dem Prozess zugewiesen wird, der den Seitenfehler erzeugt hat. Die Originalseite wird anschließend als beschreibbar markiert.
Meine Frage ist: Was passiert, wenn die fork()
mehrmals aufgerufen wird, bevor einer der Prozesse versucht, auf eine freigegebene Seite zu schreiben?
pmap -XX PID
oder überprüfen cat /proc/PID/smap
.