C statische Variablen und Linux fork

8

Hallo Ich habe ein Server-Programm erstellt, das einen neuen Prozess ausgibt, nachdem es eine Socket-Verbindung akzeptiert. Im Programm sind mehrere statisch zugewiesene globale Variablen definiert. Meine Frage ist, sind diese statischen Puffer zweimal nach der Verzweigung zugeordnet? Oder dupliziert die Gabel nur Adressraum auf dem Heap und dem Call-Stack?

    
eat_a_lemon 02.02.2011, 20:06
quelle

4 Antworten

10

Der gesamte Adressraum ist doppelt vorhanden, einschließlich aller globalen Variablen und des Programmtextes.

    
zwol 02.02.2011, 20:07
quelle
6

Der gesamte Adressraum wird während fork(2) "dupliziert". Es wird oft mit copy-on-write gemacht und es gibt weitere Details zum Teilen von Programmtext und den Bibliotheken, aber das ist hier nicht relevant. Sowohl die übergeordneten als auch die untergeordneten Prozesse haben ihre eigene Kopie der statischen Daten.

    
Nikolai Fetissov 02.02.2011 20:09
quelle
2

fork() dupliziert das gesamte Prozessabbild. Alles davon. Als solche werden sie doppelt vergeben ... nein, sie werden einmal pro ausführbarem Bild zugewiesen, von dem es jetzt zwei gibt, und nein, wenn du dich auf eines im Elternteil beziehst, wird es nicht den gleichen Inhalt wie das des Kind, wenn Sie nicht gemeinsam genutzten Speicher verwenden.

Bei static bedeutet dieses Schlüsselwort (ab ISO C99):

  

Ein Objekt, dessen Bezeichner deklariert ist   mit externer oder interner Verknüpfung, oder   mit dem Speicherklassenspezifizierer   statisch hat statische Speicherdauer.   Seine Lebensdauer ist die gesamte Ausführung   des Programms und seines gespeicherten Wertes ist   initialisiert nur einmal vor   Programmstart.

Dies bedeutet grundsätzlich, dass Ihr Puffer einmal als Teil der CRT-Startroutine initialisiert wird und dieser Speicherplatz nur verschwindet, wenn Sie ihn beenden. In diesem Fall verschwindet dieser Speicher, wenn jedes Kind austritt.

    
user257111 02.02.2011 20:08
quelle
1

Linux verwendet einen Mechanismus namens Copy-on-Write. Das bedeutet, dass, solange die Variable nicht geändert wird, der Eltern- und der Neue Prozess eine Variable teilen. Aber bevor die Variable geändert wird, wird sie kopiert und der neue Prozess verwendet die Kopie. Es ist aus Leistungsgründen getan und Technik wird faule Optimierung genannt. Sie sollten sich also keine Sorgen machen, dass die Änderung der Variablen in einem Prozess sie in einem anderen Prozess ändert.

    
Maciej 02.02.2011 20:17
quelle

Tags und Links