2011-01-04 11 views
4

Ich bin verwirrt darüber. Ich habe gelesen, dass child, wenn ein Kind von einem übergeordneten Prozess erstellt wird, eine Kopie des Adressraums seiner Eltern erhält. Was bedeutet es hier durch kopieren? Wenn ich den Code unten verwende, dann druckt er die gleichen Adressen der Variablen 'a', die sich in allen Fällen auf dem Heap befindet. im Falle von Kind und Eltern. Was passiert hier?Unterschied zwischen dem Adressraum des übergeordneten Prozesses und seinem untergeordneten Prozess in Linux?

int main() { pid_t pid; int *a = (int *)malloc(4); printf ("heap pointer %p\n", a); pid = fork(); if (pid < 0) { fprintf (stderr, "Fork Failed"); exit(-1); } else if (pid == 0) { printf ("Child\n"); printf ("in child heap pointer %p\n", a); } else {

wait (NULL); printf ("Child Complete\n"); printf ("in parent heap pointer %p\n", a); exit(0); }

}

+3

Beachten Sie, dass in ** Eltern und Kind ** ** ** die ** Adresse ** der Variablen "a" nicht gedruckt wird. Sie drucken den ** Wert ** der Variablen "a" (vom Typ Zeiger). –

+0

ja das stimmt. Danke :) – abs

+0

Haben Sie eine Antwort gesehen, die Ihnen gefallen hat? –

Antwort

13

Das Kind erhält eine exakte Kopie des Elternadressraums, der in vielen Fällen wahrscheinlich im gleichen Format wie der Elternadressraum angelegt wird. Ich muss darauf hinweisen, dass jeder seinen eigenen virtuellen Adressraum für seinen Speicher hat, so dass jeder die gleichen Daten an der gleichen Adresse, aber in verschiedenen Adressräumen haben kann. Außerdem verwendet Linux Kopieren beim Schreiben, wenn untergeordnete Prozesse erstellt werden. Dies bedeutet, dass der Eltern- und der Kindteil den Elternadressraum teilen, bis einer von ihnen einen Schreibvorgang ausführt. Zu diesem Zeitpunkt wird der Speicher physisch auf das Kind kopiert. Dies eliminiert unnötige Kopien, wenn ein neuer Prozess ausgeführt wird. Da Sie den Speicher nur mit einer neuen ausführbaren Datei überschreiben, warum sollten Sie ihn kopieren?

+0

+1 Für Nizza Antwort und für Guts Avatar. – Muggen

1

Eine Kopie genau bedeutet, dass ein Bit-identische Kopie der virtuellen Adreßraum. In beiden Fällen sind die beiden Kopien nicht unterscheidbar, bis Sie mit dem Schreiben beginnen (die Änderungen sind in der anderen Kopie nicht sichtbar).

+0

Downvoter: warum, bitte? –

0

Mit fork() der Kind-Prozess einen neuen Adressraum erhält, in der alle Inhalte des übergeordneten Adressraum kopiert werden (eigentlich moderne Kernel verwenden copy-on-write).

Das heißt, wenn Sie a oder den Wert ändern, der in einem Prozess angezeigt wird, sieht der andere Prozess weiterhin den alten Wert.

1

Sie erhalten zwei Heaps, und da die Speicheradressen in verschiedene Teile des physischen Speichers übersetzt werden, haben beide die gleiche virtuelle Speicheradresse.

0

Ja, Sie erhalten die gleiche virtuelle Adresse, aber denken Sie daran, dass jede ihre eigenen virtuellen Adressräume hat. Bis es einen Copy-On-Write-Vorgang gibt, wird alles geteilt. Wenn Sie also versuchen, mit strcpy oder einer anderen Schreiboperation zu arbeiten, wird Copy-On-Write ausgeführt, was bedeutet, dass die virtuelle Adresse des untergeordneten Prozesses von Zeiger a für den untergeordneten Prozess aktualisiert wird, nicht jedoch für den übergeordneten Prozess.

Verwandte Themen