Proces Zombie vs proces sierocy

Zombie jest tworzony, gdy proces macierzysty nie używa wywołania systemowego wait po śmierci dziecka, aby odczytać jego status zakończenia, a osierocony jest proces potomny, który jest odzyskiwany przez init, gdy oryginalny proces macierzysty zakończy się przed dzieckiem.

Jeśli chodzi o zarządzanie pamięcią i tabelę procesów, jak te procesy są obsługiwane w różny sposób, w szczególności w Uniksie?

Jaki jest przykład lub skrajny przypadek, gdy tworzenie zombie lub sierot może być szkodliwy dla większego zastosowania lub systemu?

Author: alk, 2013-12-19

7 answers

Gdy dziecko kończy pracę, jakiś proces musi wait na nim, aby uzyskać jego kod zakończenia. Ten kod zakończenia jest przechowywany w tabeli procesów do tego czasu. Odczytywanie kodu wyjścia nazywa się" czerpaniem " dziecka. W czasie, gdy dziecko wychodzi i jest zbierane, nazywa się zombie. (Cała nomenklatura jest trochę makabryczna, gdy się nad tym zastanowić; polecam nie myśleć o tym za dużo.)

Zombie zajmują tylko miejsce w tabeli procesów. Nie pobierają pamięci ani procesora. Jednak proces tabela jest zasobem skończonym, a nadmiar zombie może go wypełnić, co oznacza, że żadne inne procesy nie mogą uruchomić. Poza tym są uciążliwym bałaganem i należy ich zdecydowanie unikać.

Jeśli proces kończy się, gdy dzieci nadal działają (i nie zabija swoich dzieci; metafora nadal jest dziwaczna), te dzieci są sierotami. Osierocone dzieci są natychmiast "adoptowane" przez init (właściwie, myślę, że większość ludzi nazywa to "reparentowaniem", ale "adopcja" wydaje się nosić metaforę lepiej). Sierota to tylko proces. Wykorzysta wszelkie zasoby. Rozsądnie jest powiedzieć, że w ogóle nie jest "sierotą", ponieważ ma rodzica, ale słyszałem, że często się tak nazywają.

init automatycznie zbiera swoje dzieci (adoptowane lub inne). Więc jeśli wyjdziesz bez sprzątania swoich dzieci, nie staną się zombie (przynajmniej nie dłużej niż przez chwilę).

Ale istnieją długo żyjące Zombie. Co to jest? Są dawnymi dziećmi istniejącego procesu, który nie zebrał ich. Proces może zostać zawieszony. Albo może być źle napisane i zapomina zbierać swoje dzieci. A może jest przeciążony i nie zdążył się do niego dostać. Albo cokolwiek. Ale z jakiegoś powodu, proces rodzica nadal istnieje (więc nie są sierotami), a oni nie byli czekani, więc żyją jako zombie w tabeli procesów.

Więc jeśli widzisz Zombie dłużej niż chwilę, oznacza to, że coś jest nie tak z procesem rodzica i coś powinno być poprawiłem ten program.

 119
Author: Rob Napier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 19:13:08

Gdy proces się kończy, jego zasoby są dealokowane przez działanie system. Jednak jego wpis do tabeli procesów musi pozostać tam aż do rodzic wywołuje metodę wait (), ponieważ tabela procesów zawiera status zakończenia procesu. Proces, który się zakończył, ale którego rodzic nie wywołał jeszcze wait (), jest znany jako proces zombie . Wszystkie procesy przechodzą do tego stanu, gdy terminują, ale generalnie istnieją jako zombie tylko krótko. Gdy rodzic wywołania wait (), the identyfikator procesu zombie i jego wpis w tabela procesów jest uwalniana.

Teraz zastanów się, co by się stało, gdyby rodzic nie wywołał wait () I zamiast tego został zakończony, pozostawiając procesy potomne jako sieroty. Linux i UNIX rozwiązuje ten scenariusz, przypisując procesowi init jako nowy rodzic do procesów osieroconych. Proces init wywołuje wait (), pozwalając tym samym na uzyskanie statusu zakończenia każdego osieroconego procesu zebrał i wydał identyfikator procesu orphana i wpis w tabeli procesów.

Source: Operating System Concepts by Abraham, Peter, Greg

 21
Author: opticod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 20:25:29

A orphan process jest procesem komputerowym, którego parent process zakończył się lub zakończył, chociaż (proces potomny) pozostaje uruchomiony sam.
Proces zombie lub defunct process jest procesem, który zakończył wykonywanie, ale nadal ma wpis w tabeli procesów, ponieważ jego proces macierzysty nie wywołał wywołania systemowego wait().

 16
Author: Linkon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 17:02:09

Sierota - Wyjście rodzica, proces Init staje się rodzicem procesu potomnego. Tak więc proces potomny jest zakończony, a tabela procesów jest usuwana przez system operacyjny.

Zombie - Gdy dziecko kończy pracę, nadaje rodzicowi status zakończenia. Tymczasem czas Załóżmy, że twój rodzic jest w stanie uśpienia i nie może otrzymać żadnego statusu od dziecka. Proces potomny kończy działanie, ale zajmuje miejsce w tabeli procesów

Sprawdź to polecenie w Linuksie ubuntu > > ps-eo pid,ppid,status, cmd

Jeśli znalazłeś coś jak defunc na końcu TJ Twój Proces jest zombie i zajmuje przestrzeń.

 5
Author: omkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-19 22:58:25
  1. Nie ma sierot poza procesem wykorzystującym PID 1.

    Z punktu widzenia uruchomionego procesu nie ma znaczenia, czy został on uruchomiony bezpośrednio i dlatego ma PID 1 jako rodzic, czy też został odziedziczony przez PID 1, ponieważ jego pierwotny rodzic (różny od PID 1) się skończył. Jest traktowany jak każdy inny proces.

  2. Każdy proces przechodzi przez jakiś stan zombie, kiedy się kończy, a mianowicie fazę między ogłoszeniem jego końca przez wydanie SIGCHLD a jego przetwarzanie (dostawa lub ignorancja) potwierdzone.

Gdy stan zombie został wprowadzony, Proces jest tylko wpisem na liście procesów systemu.

Jedynym znaczącym zasobem, którego zombie używa, jest prawidłowy PID.

 2
Author: alk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-07 12:48:26

Chciałbym dodać 2 fragmenty kodu przedstawiające sierotę i proces zombie. Ale najpierw opublikuję definicję tych procesów, jak podano w książce "Operating System Concepts" autorstwa Silberschatza, Galvina i Gagna: {]}

Jeśli żaden rodzic nie czeka (nie wywołał wait()) Proces jest zombie

Jeśli rodzic został zakończony bez wywołania wait , Proces jest sierotą

Sierota

// A C program to demonstrate Orphan Process.  
// Parent process finishes execution while the 
// child process is running. The child process 
// becomes orphan. 

#include <stdio.h>  //printf
#include <stdlib.h> //exit
#include <sys/types.h> //fork
#include <unistd.h> //fork and sleep
  
int main() 
{ 
    // Fork returns process id 
    // in parent process 
    pid_t child_pid = fork(); 
  
    // Parent process didn't use wait and finished before child
    // so the child becomes an orphan process

    // Parent process 
    if (child_pid > 0) {
        printf("I finished my execution before my child"); 
    }
    else // Child process 
        if (child_pid == 0) { 
            sleep(1); //sleep for 1 second
            printf("This printf will not be executed"); 
        } 
        else{
            //error occurred
        }
  
    return 0; 
}

Wyjście

I finished my egzekucja przed moim dzieckiem

Zombie

// A C program to demonstrate Zombie Process. 
// Child becomes Zombie as parent is not waiting
// when child process exits. 

#include <stdio.h>  //printf
#include <stdlib.h> //exit
#include <sys/types.h> //fork
#include <unistd.h> //fork and sleep

int main() 
{ 
    // Fork returns process id 
    // in parent process 
    pid_t child_pid = fork(); 
 
    // Parent process didn't use wait 
    // so the child becomes a zombie process

    // Parent process 
    if (child_pid > 0){ 
        sleep(1); //sleep for 1 second
        printf("\nI don't wait for my child");
    }
    else // Child process 
        if(child_pid == 0){ 
            printf("My parent doesn't wait me");
            exit(0);
        }
        else{
            //error occurred
        }
    
    return 0; 
} 

Wyjście

Mój rodzic nie czeka na mnie

Nie czekam na moje dziecko

Edit: źródło i inspiracja zaczerpnięte z tutaj

 2
Author: Justice Bringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Proces, który zakończył wykonywanie, ale nadal ma wpis w tabeli procesów, aby zgłosić proces macierzysty, jest znany jako proces zombie. Proces, którego proces macierzysty już nie istnieje, tzn. zakończony lub zakończony bez oczekiwania na zakończenie procesu potomnego, nazywa się procesem osieroconym

 1
Author: SAURABH DUBEY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-20 01:09:31