Um unter Linux einen Kindprozess zu starten, muss man fork() aufrufen, das dann den eigenen Prozess verdoppelt. Nach dem fork laufen beide Prozesse im gleichen, aber unabhängig voneinander änderbaren Speicher ab. Da das Kopieren des gesamten Speicherbereichs aufwendig und in den meisten Fällen völlig unnötig ist, beherrscht die Speicherverwaltung des Linuxkernels Copy on Write (COW). Das heißt, der Speicher wird solange gemeinsam benutzt, bis er von einem Prozess verändert wird. Dabei werden nur einzelne Speicherseiten (i.d.R. 4kB) dupliziert. Dieses Verfahren steigert die Performance deshalb so stark, weil nach einem fork meist ein exec-Aufruf folgt, mit dem ein neues Program geladen wird und somit der gesamte Speicher dieses Prozesses mit einem neuen Binärprogramm übeschrieben wird. Zuvor den ursrünglichen Speicherinhalt zu kopieren, wäre in diesem Fall also vergebliche Liebesmühe.

Zur Implementierung wird eine MMU (Memory Management Unit) benötigt, die virtuelle Speicherverwaltung ermöglicht. Das bedeutet, dass physikalische Speicherblöcke an beliebiger Stelle in den Adressraum von Prozessen eingeblendet werden können. Copy on Write wird dadurch implementiert, dass die fraglichen Blöcke schreibgeschützt werden und der dann erzeugte Interrupt abgefangen wird. Der Interrupthandler kopiert dann den Speicherblock und ändert die Speicherzuordnungstabellen - danach kann der Prozess fortgesetzt werden.

Copy on Write ist damit für die beteiligten Prozesse transparent, d.h. als Programmierer muss man sich um nichts kümmern.


I've got a program which reads in lots of data (e.g. ~ 10MB) and then forks many children (e.g. ~ 20). Because of one of the 'seven wonders of Linux' (Windows doesn't have this) namely copy-on-write forking, TOP shows 20 new processes each with ~10 MB but the total free memory isn't adjusted by minus 10x20MB because most of the memory is shared between the processes until copy-on-write occurs.

My question for the Linux gurus here is:

OffeneFrage: Which tool can I use to determine how much memory a process is really using and how much is shared? I've looked through google and found TOP, PMAP, and VMSTAT, but none of them reports how much memory in a process is marked as copy-on- write (although PMAP does but only on Solaris, i.e. not Linux...).

-- Simon Hardy-Francis 2003-08-13 07:59:41


KategorieProgrammiersprachen

ForkCopyOnWrite (zuletzt geändert am 2007-12-23 22:47:27 durch localhost)