Wie geht Copy-on-Write in fork () mit mehreren Forks um?
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, in dem ein untergeordnetes Element einen Systemaufruf "exec" ausführt (der zum Ausführen einer ausführbaren Datei aus einem C-Programm verwendet wird) oder sehr bald nach der Verzweigung () beendet wird. 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, da exec den Adressraum des aufgerufenen Prozesses durch den auszuführenden Befehl ersetzt.
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 wird zugewiesen und dem Prozess zugewiesen, der den Seitenfehler generiert hat. Die Originalseite wird anschließend als beschreibbar markiert.
Meine Frage ist: Was passiert, wenn der Fork mehrmals aufgerufen wird, bevor einer der Prozesse versucht, auf eine freigegebene Seite zu schreiben?