2010-11-26 13 views
1

Im auf Unix-Plattform.Was ist mit einem Mem-Leck in einem Kind-Prozess

Der Speicher eines Prozesses mit einem Memleak wird bei Prozessbeendigung gereinigt.

Was ist mit einem Prozess, der ein Kind hervorgebracht hat, wo das Kind ein Memleak hat. Wird der durchgesickerte Speicher bei Beendigung des Childprozesses bereinigt? Oder wird diese Erinnerung jetzt beim Elternprozess bleiben?

Dank

Antwort

8

Die von dem untergeordneten Prozess zugewiesenen Speicher existiert nur in dem virtuellen Adressraum des Kindes Prozesses, nicht die Eltern. Es wird freigegeben, sobald der Kindprozess sich beendet oder durch ein neues Programmabbild über eine der exec Funktionen ersetzt.

Dies steht im Gegensatz zu Threads, die sich einen gemeinsamen virtuellen Adressraum teilen und bei denen Zuordnungen in einem neuen Thread bestehen bleiben, nachdem der Thread beendet wurde und für andere Threads nutzbar bleibt.

+0

+1 obwohl Sie die Tatsache erwähnen sollten, dass einige Aufrufe wie 'vfork' und' clone' zu ​​einem gemeinsamen Adressraum führen. – casablanca

+0

Ich würde nicht die Ergebnisse von 'vfork' einen gemeinsamen Speicherbereich nennen. 'vfork' hat ein undefiniertes Verhalten, wenn Sie irgendetwas außer einer kurzen Liste von sicheren Funktionen zwischen den' vfork' und '_exit' oder einer der 'exec'-Funktionen aufrufen. Sicher ruft das Aufrufen von 'malloc' aus dem' vfork''d-Kind Speicherkorruption auf. Dasselbe gilt im Allgemeinen für "Klon" mit einem gemeinsamen Adressraum, es sei denn, Sie sind der Implementierer der Systemthread-Implementierung und haben die Freiheit, die richtigen Synchronisationsmechanismen in die System- "malloc" -Implementierung einzufügen. –

+0

Und um das undefinierte Verhalten hervorzuheben, ist es völlig erlaubt (nach den neuesten Spezifikationen, die 'vfork', IIRC; das aktuelle POSIX hat nicht einmal' vfork') für 'vfork' zu haben, einfach' fork' zu nennen Verlassen Sie sich nicht auf einen gemeinsamen Speicherplatz nach 'vfork'. –