Der Zombie-Prozess hat keine Auswirkungen auf die Leistung oder Langsamkeit, da die Zombie-Prozesse keine Systemressourcen verbrauchen.
Hinweis: - In der Praxis wird immer noch die PID (die eine begrenzte Ressource ist) verwendet, und die Kerneldatenstrukturen für den Prozess werden weiterhin zugewiesen. Normalerweise spielt dies keine große Rolle, aber die Speichernutzung des Kernels kann auf Systemen mit sehr begrenztem Speicher erheblich sein.
Problem durch Zombie-Prozess verursacht
Jeder Zombie-Prozess behält seine Prozess-ID. Linux-Systeme haben eine begrenzte Anzahl von Prozess-IDs - 32767 standardmäßig auf 32-Bit-Systemen. Wenn sich Zombies sehr schnell ansammeln, wird der gesamte Pool verfügbarer PIDs schließlich Zombie-Prozessen zugewiesen, sodass andere Prozesse nicht gestartet werden können.
Hinweis : Auf 64-Bit-Systemen können Sie die maximale PID erhöhen (siehe /unix//a/16884/170373)
Ein paar Zombie-Prozesse, die herumhängen, sind jedoch kein Problem - obwohl sie auf einen Fehler mit ihrem übergeordneten Prozess auf Ihrem System hinweisen.
Erläuterung:
Wenn ein Prozess unter Linux abstürzt, wird nicht sofort alles aus dem Speicher entfernt - sein Prozessdeskriptor bleibt im Speicher.
Der Status EXIT_ZOMBIE
des Prozesses wird und der übergeordnete Prozess wird benachrichtigt, dass sein untergeordneter Prozess mit dem SIGCHLD
Signal gestorben ist.
Der übergeordnete Prozess soll dann den Systemaufruf wait () ausführen, um den Beendigungsstatus des toten Prozesses und andere Informationen zu lesen. Auf diese Weise kann der übergeordnete Prozess Informationen vom toten Prozess abrufen. Nachdem wait () aufgerufen wurde, wird der Zombie-Prozess vollständig aus dem Speicher entfernt.
Dies geschieht normalerweise sehr schnell, sodass sich auf Ihrem System keine Zombie-Prozesse ansammeln. Wenn ein übergeordneter Prozess jedoch nicht ordnungsgemäß programmiert ist und nie wait () aufruft, bleiben die untergeordneten Zombies im Speicher, bis sie bereinigt sind.
Auflösung:
Sie können keine Zombie-Prozesse beenden, da Sie normale Prozesse mit dem SIGKILL-Signal beenden können - Zombie-Prozesse sind bereits beendet.
Eine Möglichkeit, Zombies zu töten, besteht darin, das SIGCHLD-Signal an den übergeordneten Prozess zu senden. Dieses Signal weist den übergeordneten Prozess an, den Systemaufruf wait () auszuführen und die untergeordneten Zombies zu bereinigen. Senden Sie das Signal mit dem Befehl kill und ersetzen Sie pid im folgenden Befehl durch die PID des übergeordneten Prozesses:
kill -s SIGCHLD pid
Wenn der Prozess, der die Zombies erstellt hat, beendet ist, erbt init die Zombie-Prozesse und wird zu ihrem neuen übergeordneten Element. (init ist der erste Prozess, der beim Booten unter Linux gestartet wird, und ihm wird PID 1 zugewiesen.)
Hinweis: Ab Linux 3.4 können Prozesse den Systemaufruf prctl () mit der Option PR_SET_CHILD_SUBREAPER ausgeben, sodass sie, nicht Prozess Nr. 1, die Eltern ihrer verwaisten Nachfolgeprozesse werden. Siehe: /unix//a/177361/5132
INIT führt dann den Systemaufruf wait () aus, um die untergeordneten Zombies zu bereinigen, sodass init die Zombies in Kürze bearbeitet. Sie können den übergeordneten Prozess nach dem Schließen neu starten.
Meistens sind Zombies kein großes Problem. Es handelt sich um einen "toten" Prozess, der keine CPU-Zeit in Anspruch nimmt, und der zugewiesene Speicher sollte vor dem Tod durch den Prozess freigegeben worden sein. Die einzige Ressource, die sie tatsächlich in Anspruch nehmen, ist ein Eintrag in Ihrer Prozessliste. Abhängig von Ihrem System können Sie eine maximal zulässige Anzahl von Threads festlegen, und mit Zombies können Sie dieses Limit ohne Grund schneller erreichen.
Allerdings: Zombies erscheinen normalerweise aufgrund von fehlerhaftem / fehlerhaftem Code, bei dem der Programmierer vergessen hat , den Status seiner untergeordneten Prozesse zu überprüfen. Dies kann beabsichtigt sein, ist es aber oft nicht. Fehlerhafter / fehlerhafter Code behandelt häufig auch Speicher auf eine
schlechtespezielle Art und Weise und gibt einige zugewiesene Ressourcen nicht frei. In diesem Fall bleiben diese Ressourcen für den Zombie reserviert, bis er vollständig beendet ist.Bearbeiten : Wenn der Prozess ein Java-Programm ist, sollte nicht freigegebener Speicher kein Problem sein, da der Java-Garbage-Collector sich um alles kümmert.
quelle