Proces Zombie nie będzie miał żadnego wpływu na wydajność ani spowolnienie, ponieważ procesy Zombie nie zużywają żadnych zasobów systemowych.
Uwaga: - W praktyce nadal używa PID (który jest ograniczonym zasobem), a struktury danych jądra dla procesu są nadal przydzielane. Zwykle nie ma to większego znaczenia, ale użycie pamięci jądra może być znaczące w systemach o bardzo ograniczonej pamięci.
Problem spowodowany przez proces zombie
Każdy proces zombie zachowuje swój identyfikator procesu. Systemy Linux mają skończoną liczbę identyfikatorów procesów - domyślnie 32767 w systemach 32-bitowych. Jeśli zombie gromadzą się w bardzo szybkim tempie, cała pula dostępnych PID zostanie ostatecznie przypisana do procesów zombie, uniemożliwiając uruchomienie innych procesów.
Uwaga : w systemach 64-bitowych można zwiększyć maksymalny PID, patrz /unix//a/16884/170373
Jednak kilka wiszących wokół procesów zombie nie stanowi problemu - chociaż wskazują one na błąd w procesie nadrzędnym w systemie.
Wyjaśnienie:
Kiedy proces umiera w systemie Linux, nie wszystkie są natychmiast usuwane z pamięci - jego deskryptor pozostaje w pamięci.
Status procesu staje się, EXIT_ZOMBIE
a jego rodzic jest powiadamiany, że jego proces potomny zmarł wraz z SIGCHLD
sygnałem.
Proces nadrzędny ma następnie wykonać wywołanie systemowe wait (), aby odczytać status zakończenia martwego procesu i inne informacje. Pozwala to procesowi nadrzędnemu uzyskać informacje z martwego procesu. Po wywołaniu funkcji wait () proces zombie jest całkowicie usuwany z pamięci.
Zwykle dzieje się to bardzo szybko, więc nie zobaczysz procesów zombie gromadzących się w twoim systemie. Jeśli jednak proces nadrzędny nie zostanie odpowiednio zaprogramowany i nigdy nie wywoła funkcji wait (), jego dzieci zombie pozostaną w pamięci, dopóki nie zostaną wyczyszczone.
Rozkład:
Nie możesz zabić procesów zombie, ponieważ możesz zabić normalne procesy za pomocą sygnału SIGKILL - procesy zombie są już martwe.
Jednym ze sposobów zabicia zombie jest wysłanie sygnału SIGCHLD do procesu nadrzędnego. Ten sygnał nakazuje procesowi nadrzędnemu wykonanie wywołania systemowego wait () i wyczyszczenie jego dzieci-zombie. Wyślij sygnał za pomocą polecenia kill, zastępując pid w poniższym poleceniu PID procesu nadrzędnego:
kill -s SIGCHLD pid
Po zakończeniu procesu, który stworzył zombie, init dziedziczy procesy zombie i staje się ich nowym rodzicem. (init jest pierwszym procesem uruchomionym w systemie Linux podczas rozruchu i ma przypisany PID 1.)
Uwaga: - Począwszy od Linuksa 3.4, procesy mogą wywoływać wywołanie systemowe prctl () z opcją PR_SET_CHILD_SUBREAPER, w wyniku czego nie będą przetwarzać # 1, a będą rodzicami swoich osieroconych procesów potomnych. Patrz: /unix//a/177361/5132
Następnie INIT wykonuje wywołanie systemowe wait () w celu oczyszczenia swoich dzieci zombie, więc init wykona krótką pracę z zombie. Możesz zrestartować proces nadrzędny po jego zamknięciu.
Przeważnie zombie nie są dużym problemem. Są to proces „martwy”, który nie wymaga czasu procesora, a cała przydzielona pamięć powinna zostać zwolniona przez proces przed śmiercią. Jedynym zasobem, który faktycznie biorą, jest wpis na liście procesów. W zależności od systemu możesz mieć maksymalną dozwoloną liczbę wątków, a posiadanie zombie może sprawić, że osiągniesz ten limit szybciej bez powodu.
Jednak: Zombie zwykle pojawiają się z powodu złego / błędnego kodu, w którym programista zapomniał sprawdzić stan swoich procesów potomnych. Może to być celowe, ale często tak nie jest. Bad / code buggy często również obsługiwać pamięci w
złymspecjalny sposób, a nie zwolnić przydzielone zasoby. W takim przypadku zasoby te pozostaną przydzielone zombie, dopóki nie zostanie całkowicie zakończone.Edycja : Jeśli jest to program Java, nie zwalniana pamięć nie powinna stanowić problemu, ponieważ śmieciarz Java zajmuje się wszystkim.
źródło