Procesy zombie są tworzone w systemach Unix / Linux. Możemy je usunąć za pomocą kill
polecenia.
Ale czy jest jakiś wbudowany mechanizm czyszczenia w systemie Linux do obsługi procesów zombie?
źródło
Procesy zombie są tworzone w systemach Unix / Linux. Możemy je usunąć za pomocą kill
polecenia.
Ale czy jest jakiś wbudowany mechanizm czyszczenia w systemie Linux do obsługi procesów zombie?
Procesy zombie są już martwe. Nie możesz ich zabić. kill
Polecenie 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 wait
rodziny wywołań systemowych; w tym momencie zombie znika. Wywoływanie wait
mó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 sigaction
z SA_NOCLDWAIT
flagą), 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ń init
jest wywoływanie wait
w pętli, a tym samym czerpanie wszelkich procesów zombie pozostawionych przez jego rodziców.
Nie kill
jesteś procesem zombie, ponieważ jest już martwy.
Procesy zombie muszą być wait
edytowane 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 init
proces, który będzie wait
na nim, zbiera swój status wyjścia i usuwa swój wpis z tabeli procesów.
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
. init
będzie wait
na każdym sierocie, którą zebrał, zbierając w ten sposób sierotę (która mogła być również zombie).
init
nie zabija żadnego procesu. Tylkowait
od jego dzieci zależy, czy zdobędą status.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.
źródło
init
proces przejmuje kontrolę i nazywawait
to