Jak Linux obsługuje proces zombie


12

Procesy zombie są tworzone w systemach Unix / Linux. Możemy je usunąć za pomocą killpolecenia.

Ale czy jest jakiś wbudowany mechanizm czyszczenia w systemie Linux do obsługi procesów zombie?

Odpowiedzi:


18

Procesy zombie są już martwe. Nie możesz ich zabić. killPolecenie lub system połączeń nie ma wpływu na proces zombie. (Możesz sprawić, że zombie odejdzie kill, ale musisz zastrzelić rodzica, a nie zombie, jak zobaczymy za chwilę.)

Proces zombie nie jest tak naprawdę procesem, to tylko wpis w tabeli procesów. Nie ma żadnych innych zasobów związanych z procesem zombie: nie ma on żadnej pamięci ani żadnego działającego kodu, nie utrzymuje otwartych plików itp.

Gdy proces umiera, ostatnią rzeczą, którą należy przejść, po wyczyszczeniu wszystkich innych zasobów, jest wpis w tabeli procesów. Ten wpis jest utrzymywany wokół, tworząc zombie, aby umożliwić procesowi nadrzędnemu śledzenie statusu wyjścia dziecka. Rodzic odczytuje status wyjścia, wywołując jedną z waitrodziny wywołań systemowych; w tym momencie zombie znika. Wywoływanie waitmówi się czerpać dziecko, rozszerzając metaforę zombie nie żyje, ale w jakiś sposób nadal nie są w pełni przetwarzane w zaświatach. Rodzic może również wskazać, że go to nie obchodzi (ignorując sygnał SIGCHLD lub dzwoniąc sigactionz SA_NOCLDWAITflagą), w którym to przypadku wpis w tabeli procesów jest usuwany natychmiast po śmierci dziecka.

Dlatego zombie istnieje tylko wtedy, gdy proces umarł, a jego rodzic jeszcze nie zadzwonił wait. Ten stan może trwać tylko tak długo, jak rodzic nadal działa. Jeśli rodzic umiera przed dzieckiem lub umiera bez odczytania statusu dziecka, proces nadrzędny zombie jest ustawiany na proces z PID 1, to znaczy init. Jednym z zadań initjest wywoływanie waitw pętli, a tym samym czerpanie wszelkich procesów zombie pozostawionych przez jego rodziców.


6

Nie killjesteś procesem zombie, ponieważ jest już martwy.

Procesy zombie muszą być waitedytowane przez ich rodziców, aby ich status wyjścia został zebrany.

Jedyny „wbudowany mechanizm czyszczenia” dostępny w systemie Linux działa w przypadku, gdy dowolny proces nadrzędny umiera przed pobraniem statusu wyjścia swoich dzieci. W takim przypadku każde dziecko jest dziedziczone przez initproces, który będzie waitna nim, zbiera swój status wyjścia i usuwa swój wpis z tabeli procesów.


3

Gdy tylko rodzic procesu umiera, proces staje się sierotą - niezależnie od tego, czy jest to zombie, czy nie. Co dzieje się z sierotami? Otrzymują nowego rodzica o nazwie init. initbędzie waitna każdym sierocie, którą zebrał, zbierając w ten sposób sierotę (która mogła być również zombie).


1
Nie. Precyzja initnie zabija żadnego procesu. Tylko waitod jego dzieci zależy, czy zdobędą status.
chrk

1
@chrk, Philipp: zwykły termin to reap .
Gilles 'SO - przestań być zły'

1

Nie, nie ma wbudowanego mechanizmu czyszczenia zombie. Zombie idą do nieba zombie, gdy ich rodzic zostanie zabity. Do tego czasu system operacyjny utrzymuje je, aby zwracały status wyjścia rodzicowi.


więc ... czy to nie ma negatywnego wpływu na pamięć itp?

1
w rzeczywistości, gdy umiera rodzic zombie, initproces przejmuje kontrolę i nazywa waitto

Nie, wszystkie zasoby przydzielone do procesu są zwalniane, z wyjątkiem wpisu w tabeli procesów.
unxnut
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.