www.wikidata.de-de.nina.az
Als Zombie Prozess wird bei unixartigen Betriebssystemen der Prozesstabelleneintrag eines beendeten Prozesses bezeichnet Ein beendeter Prozess wird aus der Prozesstabelle entfernt sobald sein Elternprozess dessen Exit Status abfragt Bis dahin verbleibt er dort als Zombie der keine weiteren Ressourcen ausser dem Tabelleneintrag der Prozess ID und Eintragen in Nutzungs Statistiken mehr belegt Aus unten genauer beschriebenen Grunden bei der Prozessverwaltung wird ein beendeter Prozess manchmal nicht aus der Prozesstabelle entfernt und belegt somit geringfugige Systemressourcen Ein solcher langlebiger Zombie richtet selbst keinen Schaden an kann aber ein Hinweis auf einen Fehler sein Inhaltsverzeichnis 1 Entstehung von Zombieprozessen 2 Verwaiste Prozesse 3 Probleme von Zombies 4 Behandlung von Zombieprozessen 4 1 Automatisiertes Loschen 4 2 Besonderheit im Linux Kernel 4 3 Programmierfehler beseitigen 5 Beispiel in C zur Erzeugung von Zombies 6 Literatur 7 Einzelnachweise 8 Siehe auchEntstehung von Zombieprozessen BearbeitenWenn ein Prozess einen neuen Prozess startet mittels Forking wird der alte Elternprozess und der neue Kindprozess genannt Wenn der Kindprozess beendet wird kann der Elternprozess vom Betriebssystem erfragen auf welche Art der Kindprozess beendet wurde erfolgreich mit Fehler abgesturzt abgebrochen etc Um diese Abfrage zu ermoglichen bleibt der Eintrag nachdem der Prozess beendet wurde in der Prozesstabelle stehen bis der Elternprozess diese Abfrage durchfuhrt egal ob diese Information gebraucht wird oder nicht Bis dahin hat der Kindprozess den Zustand Zombie In diesem Zustand belegt der Prozess selbst keinen Arbeitsspeicher mehr bis auf den Eintrag in der Prozesstabelle des Kernels und verbraucht auch keine Rechenzeit jedoch behalt er seine PID die noch nicht fur andere Prozesse wiederverwendet werden kann Der Kernel sendet an den Elternprozess ein spezielles Signal namlich SIGCHLD sobald eines seiner Kinder beendet wird um ihm mitzuteilen dass er eine Statusabfrage durchfuhren kann damit es endgultig verschwindet Die Statusabfrage darf der Elternprozess auch direkt im Handler fur dieses Signal durchfuhren Fuhrt der Elternprozess keine Statusabfrage durch verbleibt das Kind im Zombie Zustand in der Prozesstabelle 1 Verwaiste Prozesse BearbeitenEin weiterer Spezialfall der an und fur sich unabhangig von Zombies ist jedoch in Kombination damit auftreten kann ist wenn der Elternprozess beendet wird In diesem Fall werden alle seine Kindprozesse verwaist genannt Die Kindprozesse werden dann per Definition vom Prozess mit der PID 1 adoptiert und bekommen diesen als Elternprozess zugewiesen In der klassischen System V Bootfolge hat der sogenannte init Prozess die PID 1 Bei OS X tritt launchd an diese Stelle Haufig wird bei Linux Systemen hier systemd verwendet Dies passiert fur laufende genauso wie fur Zombieprozesse deren Eltern nicht mehr existieren Probleme von Zombies BearbeitenZombies stellen in der Regel kein Problem fur ein Betriebssystem dar da diese Prozesse bereits beendet wurden und nur sehr wenige Systemressourcen in Anspruch nehmen Allerdings kann der verursachende Fehler im Elternprozess unter Umstanden wie beispielsweise bei hoher Belastung weit grossere Folgen haben Eine grosse Anzahl von Zombies kann auch dazu fuhren dass dem Kernel die freien PIDs die er fur neue Prozesse braucht ausgehen Die PID Belegung durch Zombies ist unter Umstanden problematischer als deren minimaler Speicherverbrauch Ist die Anzahl an Prozessen auf einem System limitiert unter anderem via maxproc in limits conf um beispielsweise eine Forkbomb in ihrer Auswirkung zu begrenzen so fuhren zu viele Zombies dazu dass der Kernel keine neuen Prozesse mehr erzeugt Behandlung von Zombieprozessen BearbeitenObwohl Zombieprozesse in der Regel keine Gefahr fur das System darstellen konnen sie dennoch manuell geloscht werden oder auch automatisiert vom System Automatisiertes Loschen Bearbeiten Der init Prozess hat unter anderem die Aufgabe den Beendigungszustand aller seiner Kinder abzufragen sobald diese beendet also in den Zombie Zustand uberfuhrt werden Damit sorgt er dafur dass keine uberflussigen Zombies im System vorhanden sind Laufende Prozesse die vom init Prozess adoptiert werden werden dadurch nicht beeintrachtigt Hier wartet der init Prozess einfach bis sie fertig sind und fragt anschliessend deren Status ab Alternativ kann man dem Elternprozess des Zombies laut PPID Angabe in der Prozesstabelle zum Beispiel von ps axo stat pid comm ppid grep Z manuell das Signal SIGCHLD senden auf der Kommandozeile etwa mittels kill CHLD lt PID des Elternprozesses gt Reagiert der Elternprozess darauf nicht so kann man den Elternprozess beenden damit das Zombie Kind vom init Prozess adoptiert und sofort danach durch Abfrage seines Zustands endgultig geloscht wird Besonderheit im Linux Kernel Bearbeiten Der Linux Kernel bietet fur Prozesse die nicht am Status ihrer Kinder interessiert sind eine einfache allerdings nicht standardisierte Methode Zombies loszuwerden Gibt ein Prozess explizit an dass er SIGCHLD ignorieren will im Gegensatz zum Ignorieren per Default wenn kein Handler angegeben ist so loscht Linux die Zombies automatisch ohne auf eine Statusabfrage zu warten Programmierfehler beseitigen Bearbeiten Wenn ein Prozess seine Kinder oftmals vergisst und zu Zombies werden lasst besonders wenn er auch auf ein manuelles SIGCHLD nicht reagiert ist das meistens ein Hinweis auf einen Bug in diesem Programm Aus oben genannten Grunden sollten diese Fehler im Programm beseitigt werden um das System durch die entstehenden Zombies nicht zu beeintrachtigen Beispiel in C zur Erzeugung von Zombies BearbeitenSynchrones Warten auf denselben Kindprozess in einer fest definierten Reihenfolge kann Zombieprozesse erzeugen und diese sogar uber eine lange Zeit am Leben erhalten Dies ist nicht notwendigerweise ein Programmierfehler wie im folgenden Codebeispiel zu sehen ist include lt sys wait h gt include lt stdlib h gt include lt unistd h gt int main void pid t pids 10 Platz fur 10 Prozess IDs die Kindprozesse int i Laufvariable for i 0 i lt 10 i Der Elternprozess erzeugt nun einen Kindprozess welcher unabhangig vom Elternprozess mit der erneuten Ausfuhrung des Programms beginnt Ein Kindprozess erzeugt keinen Fork von sich selbst pids i fork if pids i 0 dann befinden wir uns in einem der 10 Kindprozesse Der erste Kindprozess wartet 10 Sekunden und jeder weitere Kindprozess wartet 1 Sekunde kurzer als der vorige sleep 10 i exit 0 Kindprozess erfolgreich beenden hier kommt nur der Elternprozess vorbei for i 0 i lt 10 i Der Elternprozess wartet nun bis der Reihe nach jeder seiner 10 Kindprozesse beendet ist Leider wird auf das Kind mit der langsten Wartezeit zuerst gewartet Obwohl die anderen Kinder langst erfolgreich beendet wurden blockiert das erste Kind eine Bereinigung der Prozesstabelle waitpid pids i NULL 0 return 0 Elternprozess erfolgreich beenden Dennoch ist das Verhalten nicht optimal Eine bessere Alternative bestunde darin auf einen beliebigen Prozess zu warten ihn im Array als erledigt zu markieren und diesen Prozess fortzufuhren bis das Array leer ist Literatur BearbeitenMichael Kerrisk The Linux Programming Interface Chapter 26 Monitoring Child Processes No Starch Press San Francisco 2010 ISBN 978 1 59327 220 3 engl Einzelnachweise Bearbeiten The Open Group Base Specifications Issue 7 2018 edition IEEE Std 1003 1 2017 Revision of IEEE Std 1003 1 2008 Consequences of Process TerminationSiehe auch BearbeitenDaemon Abgerufen von https de wikipedia org w index php title Zombie Prozess amp oldid 226409128