Was ist ein Zombie ?

B

bobo

Eroberer
HI,

sorry der Frage wegen, aber was ist wenn da bei Top oben steht 1 Zombie ?
Was ist das.

Gruß
bobo
 
Quelle schrieb:
Zombies und blockierte Prozesse


Gelegentlich werden in Ausgabe von ps Prozesse angezeigt, die mit dem Status Z als Zombie gekennzeichnet sind. Diese ``lebendigen Toten'' existieren normalerweise nur für einige Augenblicke. Sie entstehen, wenn ein Prozeß beendet ist, und sie verschwinden, sobald der Elternprozeß das Signal von der Beendigung seines Kindes erhalten und bestätigt hat.

Wenn ein Zombie nicht aus der Prozeßtabelle verschwindet, bedeutet das, daß der Elternprozeß des Zombies eigentlich auf das Signal von der Beendigung seines Kindes warten wollte, jedoch aus irgendwelchen Gründen nicht mehr existiert.

Ein Zombie kann auch durch ein SIGKILL nicht aus der Prozeßtabelle entfernt werden. Weil der eigentliche Prozeß nicht mehr existiert und weder Arbeitsspeicher noch Rechenzeit verbraucht, hat ein Zombie außer dem unschönen Eintrag in der Anzeige von ps keine nachteilige Auswirkung auf das laufende System.

Es gibt noch weitere Fälle, in denen ein Prozeß auch durch das Signal SIGKILL nicht sofort beendet werden kann. Die Ursache hierfür liegt meistens in einem blockierten Systemaufruf. Diese Situation entsteht beispielsweise, wenn ein Prozeß auf die Beendigung einer Schreib- oder Leseoperation eines langsamen Gerätes wartet.

http://www.informatikserver.at/LHB/node148.html#SECTION00634200000000000000
 
Zuletzt bearbeitet:
Vielen Dank für die ausführliche Information !

Gruß
bobo
 
Mal anders umschrieben:

Jeder Prozess hat einen Rückgabewert, also er gibt zurück, ob alles OK war, oder eben ein Fehler vorlag etc. Wenn nun ein Prozess einen Kindprozess erzeugt hat, ist dies der Elternprozess zu diesem Kind und damit dafür zuständig, d.h. es holt dessen Rückgabewert bei dessen Beendigung ab. Es gibt daher im Vaterprozess bestimmte Punkte, wo auf den Kindprozess gelauscht wird, ob er sich beendet hat und daher was zu sagen hat (nämlich seinen Rückgabewert). Wenn nun ein Programmierer schlecht programmiert hat, kann es sein, dass der Rückgabewert durch irgendwelche Umstände vom Kindprozess nie abgeholt wird. Das Kind kann aber solange nicht wirklich sterben, wie es seinen Rückgabewert noch nicht dem Elternprozess übergeben hat. Daher befindet es sich in einem Dämmerzustand (= Zombie :)). Es belegt dabei keinen Speicher, es taucht nur noch in der Prozessliste auf.
Es gibt auch die Möglichkeit, dass ein Vaterprozess stirbt, sich die Kinder aber noch nicht beendet haben. Wenn diese sich beenden, können sie ja nun keine Rückgabe machen. Dies bezeichnet man als verwaiste Prozesse. Verwaiste Prozess werden dem Über-Prozess "init" mit der Prozess-ID 0 übergeben, er adoptiert sie praktisch und nimmt deren Rückgabewerte entgegen, damit sich die Prozesse beenden können. Dieser init-Prozess wird nicht selbst von einem Prozess angestoßen, sondern vom Kernel initiiert. (Er kann allerdings keine Zombies annehmen, wo deren Elternprozesse noch laufen. Sie müssen dazu erst verwaisen.)

So hab ich das verstanden. Korrigiert mich, wenn ich falsch liege :)
 
Zuletzt bearbeitet:
Sry fürs thread ausgraben, aber ich hab zu dem thema noch ein paar fragen.

Ich les gerade linux-unix-programmierung und versteh nicht ganz was diese Zeile macht.

Code:
pid = fork ();

Es geht hier im speziellen um dieses Programm: http://www.pronix.de/pronix-170.html
(daemon.c)

Es wird ein Prozess gestartet, schon klar, nur was und warum und was macht der und wieso steht oben irgendwas von wegen signalhandler und was hat das ganze mit zombies und wait() zu tun?
 
Hi,

fork "klont" ganz einfach den aktuellen Prozess. Der neue Prozess ist dann ein Kind von diesem, hat aber seine eigene PID.

Am Rückgabewert von fork läst sich erkennen in welchem Prozess man sich befindet. Gibt fork 0 zurück befindet man sich im Kindprozess, im "Vaterprozess" wird die PID des Kindprozesses zurückgegeben.

IMHO entsteht ein Zombie wenn der Kindprozess mit seiner Arbeit fertig ist, aber der Exit-Status nicht vom Vaterprozess verarbeitet wird(glaub mit wait() bzw. waitpid()).

Alle Klarheiten beseitigt? :D

Ist eigentlich das falsche Forum für lange Erklärungen, am besten nen Thread im C/C++ Forum aufmachen!

mfg
Mortl

PS: Das Buch Linux-UNIX-Programmierung hab ich auch daheim, kann ich wärmstens empfehlen :)
 

Ähnliche Themen

systemd service mit Bash Script und Subshell in einer tmux Umgebung

sed - Bitte um Unterstützung

Pi zu einem Netshare service einrichten (SMB + Web)

openSSH: SFTP / FTPS

Keine grafische Oberfläche (Debian Installation)

Zurück
Oben