2013-03-23 2 views
5

Unter Linux fork() aufrufen und die gegabelten (Kind) Prozess beendet werden alle virtuellen Speicherseiten noch als copy-on-write in der Mutter markiert?Wenn Sie fork() und die verzweigten (untergeordneten) Prozess-Exits sind alle VM-Seiten immer noch COW in der übergeordneten markiert? wenn Sie

Ich denke, die Seiten werden als COW markiert bleiben, da alles andere wahrscheinlich unerschwinglich teuer wäre, wahrscheinlich pro Seite Refcounts und andere teure Buchführung erfordern. Aber ich frage mich neulich, ob ich einen Prozess ausspreize, um Code in einem "stabilen Snapshot" des aktuellen Prozesses auszuführen. Was passiert, wenn der Child-Prozess beendet wird? Bleiben alle Speicherseiten im übergeordneten Ordner als Kopie-beim-Schreiben markiert? Das bedeutet, dass das Forking in einem Prozess mit viel virtuellem Speicher (z. B. 128 GB) nur einige Minuten lang Code ausführt, was zu einer anhaltenden Leistungsverschlechterung im übergeordneten Prozess für Stunden oder sogar Tage führen würde (ganz zu schweigen vom Fork Call selbst) die nicht billig sein.)

ich bin nur neugierig, was das tatsächliche Verhalten ist auf Linux (und ich habe keine Ahnung, wie ich es testen konnte.)

+0

Ich bin nicht sicher, aber Sie sollten 'posix_spawn', nicht' fork' verwenden, externe Programme auszuführen. –

+0

IIRC, COW wird auf * sowohl * als auch die untergeordneten Seiten festgelegt. Der erste, der kommt, erhält den PageFault und die Seite wird geklont (und auf keiner der geklonten Seiten ist COW mehr gesetzt) ​​BTW: Sie könnten sich die Quelle ansehen. Es ist Open Source, weißt du ... – wildplasser

Antwort

8

Neben der copy-on-write Bit gibt es auch eine Referenzzahl in der Seitentabelle. Wenn sich ein Kind also verzweigt, werden alle nicht-privaten Seiten im Parentent mit COW markiert, und der Referenzzähler wird inkrementiert.

Wenn dann der untergeordnete Prozess ausgeführt wird und der übergeordnete Benutzer eine Seite schreibt, wird ein Seitenfehler angezeigt, und die Seite wird wie erwartet kopiert, und die Anzahl der Referenzen wird verringert. Wenn das Kind beendet wird, verringert es alle seine Seitenreferenzen um eins, und die Seiten mit dem Referenzzähler Null werden weggeworfen.

Wenn das übergeordnete Element eine Seite schreibt, auf der das COW-Bit gesetzt ist, und eine Referenzzählung von eins, wird das COW-Bit einfach ignoriert.

+0

Jetzt ist das süß! – Eloff

0

Der Kernel markiert alle freigegebenen Seiten als schreibgeschützt, so dass in Ausnahmefällen ergibt, wenn entweder versucht man zu modifizieren. Das Duplikat wird erstellt und als schreibbar gekennzeichnet (also keine Ausnahmen mehr), während das Original schreibgeschützt bleibt.

Wenn das Original geschrieben wird, eine weitere Ausnahme auftritt, aber der Kernel wird sehen, dass die Seite nicht von einem anderen Prozess gemeinsam genutzt wird, und so wird, dass man auch als beschreibbar markieren. Wenn ein Prozess beendet wird, werden alle seine Seiten freigegeben, und so wird der Kernel den COW-Status von jeder Seite im übergeordneten Element entfernen, wenn er geändert wird.

Verwandte Themen