Co to jest proces zombie?

Proces zombie to instancja programu komputerowego, która zachowuje rekord tabeli procesów pomimo zakończenia wykonywania. Takie niefunkcjonujące procesy są zazwyczaj powiązane z Uniksem® i innymi podobnymi systemami operacyjnymi ze względu na sposób, w jaki obsługują procesy podrzędne. Gdy proces potomny zakończy wykonywanie, rodzic jest zwykle odpowiedzialny za usunięcie go z tabeli procesów. Zwykle nie jest możliwe bezpośrednie usunięcie procesu zombie za pomocą polecenia kill, chociaż często można zmusić rodzica do usunięcia go, jeśli operator użyje powiadomienia podrzędnego sygnału (SIGCHLD). Jeśli to się nie powiedzie, proces zombie może zostać usunięty pośrednio poprzez zabicie rodzica.

Proces zombie to metaforyczny termin opisowy, który odnosi się do żywych trupów. Niefunkcjonujące procesy w systemie Unix® i podobnych systemach operacyjnych mogą być postrzegane jako analogiczne do zombie, ponieważ utrzymują obecność tabeli procesów, mimo że nie wykonują już zamierzonych funkcji. Kiedy proces zakończy wykonywanie, czasami mówi się, że umarł, podczas gdy sposób, w jaki system operacyjny odzyskuje przydział tabeli procesów, może być znany jako żniwa. Technicznie rzecz biorąc, proces rodzicielski zombie ma zbierać dzieci, choć nie zawsze tak się dzieje.

Istnieją pewne przypadki, w których istnienie procesu zombie może być zamierzone lub nawet pożądane. Po zakończeniu wykonywania procesu potomnego może być konieczne późniejsze uruchomienie przez rodzica innej instancji tego samego programu. Jeśli zombie nie został usunięty z tabeli procesów, nowemu dziecku nie zostanie przypisany ten sam identyfikator (ID), co staremu dziecku. Niektóre programy mogą czerpać korzyści lub nawet wymagać tego rodzaju zróżnicowania.

Jeśli proces nadrzędny nie wykonał polecenia oczekiwania, aby zebrać zombie, za które jest odpowiedzialny, możliwe jest wymuszenie problemu. Zwykle odbywa się to za pomocą polecenia kill i wysyłania sygnału SIGCHLD do procesu nadrzędnego. Jeśli wszystko działa poprawnie, proces nadrzędny, który odbiera ten sygnał, powinien zebrać swoje dzieci-zombie, aby można było ponownie wykorzystać ich identyfikatory i pozycje w tabeli procesów.

W pewnych okolicznościach proces rodzicielski może zignorować sygnał SIGCHLD. Jeśli tak się stanie, a operator nadal życzy sobie wyczyszczenia tablicy procesów, proces nadrzędny może zostać zabity. Wszelkie zombie utworzone przez proces nadrzędny zostaną następnie przypisane jako dzieci do procesu init. Ponieważ init okresowo inicjuje polecenie wait na swoich dzieciach, wszelkie zombie, za które jest odpowiedzialny, zostaną ostatecznie usunięte z tabeli procesów.