GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie behandelt fork() insbesondere dynamisch zugewiesenen Speicher von malloc() in Linux?

Jede Seite, die dem Prozess zugewiesen wird (sei es eine virtuelle Speicherseite, auf der sich der Stack oder der Heap befindet), wird kopiert, damit der gegabelte Prozess darauf zugreifen kann.

Tatsächlich wird es nicht gleich zu Beginn kopiert, es ist auf Copy-on-Write eingestellt, d. h. sobald einer der Prozesse (Eltern oder Kind) versucht, eine Seite zu ändern, wird es kopiert, damit sie sich nicht gegenseitig schaden. und haben immer noch alle Daten vom Punkt von fork() für sie zugänglich.

Beispielsweise sind die Codepages, denen die eigentliche ausführbare Datei im Speicher zugeordnet wurde, normalerweise schreibgeschützt und werden daher zwischen allen gegabelten Prozessen wiederverwendet - sie werden nicht erneut kopiert, da dort niemand schreibt, sondern nur gelesen wird und so weiter Copy-on-Write wird niemals benötigt.

Weitere Informationen finden Sie hier und hier.


Nach einem Fork ist das Kind völlig unabhängig vom Elternteil, kann aber bestimmte Dinge erben, die Kopien des Elternteils sind. Im Fall des Heaps wird das Kind zum Zeitpunkt des Forks konzeptionell eine Kopie des Eltern-Heaps haben. Änderungen am Kopf im Adressraum des Kindes ändern jedoch nur die Kopie des Kindes (z. B. durch Copy-on-Write).

Was die Dokumentation betrifft:Mir ist aufgefallen, dass die Dokumentation normalerweise besagt, dass alles kopiert wird, außer für bla, bla bla.


Die kurze Antwort ist 'schmutzig beim Schreiben' - die längere Antwort ist ... viel länger.

Aber für alle Absichten und Zwecke - das Arbeitsmodell, von dem man auf C-Level sicher ausgehen kann, ist, dass die beiden Prozesse direkt nach dem fork() absolut identisch sind - d.h. das Kind bekommt eine 100% exakte Kopie - (aber für ein bisschen Bit um den Rückgabewert von fork()) - und beginnen dann zu divergieren, wenn jede Seite ihren Speicher, Stack und Heaps modifiziert.

Ihre Schlussfolgerung ist also etwas daneben - das Kind beginnt mit denselben Daten wie das Elternteil, das in seinen eigenen Bereich kopiert wurde - modifiziert es dann - und sieht es als geändert an - während das Elternteil mit seiner eigenen Kopie fortfährt.

In Wirklichkeit sind die Dinge etwas komplexer - da versucht wird, eine vollständige Kopie zu vermeiden, indem etwas Schmutziges getan wird; Kopieren vermeiden, bis es nötig ist.

Dw.


Linux
  1. So löschen Sie den Speichercache in Linux

  2. Linux – Wie führe ich einen Bootloader von Linux aus?

  3. Wie funktioniert copy_from_user aus dem Linux-Kernel intern?

  4. Wie unterscheidet Linux Threads von untergeordneten Prozessen?

  5. Wie schreibe ich ein ISO-Image von der Linux-Befehlszeile auf einen USB-Speicherstick?

So greifen Sie von Windows 10 auf Linux-Partitionen zu

So löschen Sie den Auslagerungsspeicher unter Linux

So entfernen Sie einen Befehl aus dem Verlauf in Linux

So installieren Sie Software von der Quelle in Linux

So entfernen Sie (^M) Zeichen aus einer Datei in Linux

Wie funktioniert Swap-Speicher in Linux?