Seite 2 von 2
Re: String kürzen
Verfasst: Montag 26. Januar 2015, 09:21
von Sirius3
@wusa: dass Linux so freundlich ist, nach dem Ende eines Programms alle Zombies aufzuräumen, darf für Dich kein Grund sein, sich nicht um das Problem sauber zu kümmern.
Re: String kürzen
Verfasst: Montag 26. Januar 2015, 09:27
von BlackJack
@wusa: Während des `sleep()` existiert der Zombieprozess. Der verschwindet wenn Dein Programm endet. Das es einen Zombieprozess gibt, habe ich ja in einem Beitrag weiter oben demonstriert. Man sollte halt genau wie man Dateien schliesst so bald wie möglich nach dem man sie nicht mehr benötigt, auch dafür sorgen das Prozesse so kurz wie möglich im Zombiezustand bleiben. Andernfalls kann man in beiden Fällen wenn es blöd läuft an Begrenzungen vom Betriebssystem stossen die das Programm hart beenden.
Ergänzend zu Sirius: Du hast da ja auch kein Programm das sofort wieder endet, sondern erstellst in einer Schleife immer neue Prozesse. Vielleicht sogar in einem Programm welches lange läuft. Da käme das Betriebssystem ja erst ganz am Ende zum Zug um hinter dem Programm aufzuräumen. Und das Ende des Programms könnte wie gesagt dann auch vom Betriebssystem beendet werden statt regulär zu enden, ganz einfach weil alle Ressourcen aufgebraucht waren die dem Prozess zugestanden wurden.
Re: String kürzen
Verfasst: Montag 26. Januar 2015, 09:53
von jerch
wusa hat geschrieben:Ich hinterfrage das ganze leider nur, da ich es nicht verstehe. Sicherlich hat es auch was mit sauberer Programmierung zu tun.
In Unixoiden Systemen werden Prozesse mittels
fork geklont, was zunächst zu 2 fast identischen Prozessen führt. Der neue Prozess wird als Kindprozess des Ursprungprozesses geführt. Dieses Bootstrappen von Kindprozessen beginnt nach dem Booten des Systems mit dem Urvater aller Prozesse (init; der init-Prozess selbst wird vom Kernel initialisiert, da man von einem 0. Prozess schlecht forken kann) und führt zum bekannten Prozessbaum eines laufenden Systemes.
In Deinem Falle übernimmt
subprocess das Forken (Duplizieren des Pythonprozesses als Kind) und Laden des neuen Binärcodes (exec* Syscalls).
Der Kernel weiss nun, ob ein Prozess beendet wurde oder nicht. Wenn er beendet wurde, werden Ressourcen freigeschaufelt (Speicher, Filedescriptoren etc.). POSIX sieht nun vor, dass der Kindprozess dem Elternprozess einen Rückgabewert von 0-255 gibt (die Idee eines Rückgabewertes eines Prozesses ist allerdings viel älter), was z.B. eine simple Erfolgskontrolle möglich macht.
Da der Kernel kein Wissen darüber hat, wann den Elternprozess der Rückgabewert des Kindes interessiert, speichert er den Wert selber bis er vom Elternprozess angefragt wird. Wird er nie angefragt (was der Kernel nicht wissen kann), ist der Speicher blockiert --> Zombie. Erst wenn auch der Elternprozess terminiert, ist klar, dass der Wert verworfen werden kann und der Zombie wird abgeräumt.
Re: String kürzen
Verfasst: Montag 26. Januar 2015, 14:15
von wusa
Vielen Dank für die ganzen Antworten!
Werde ich heute gleich mal umsetzen!