Зомби-процессы - PullRequest
       24

Зомби-процессы

13 голосов
/ 04 октября 2010

У меня есть несколько вопросов о зомби-процессах

  • в чем выгода от концепции процесса зомби?
  • знать, что ядро ​​хранит (PID, статус завершения, информация об использовании ресурсов) для процесса зомби
    что означает «информация об использовании ресурсов»
  • как PPID зомби () = 1 и он все еще зомби (init пожинает зомби, потому что по умолчанию он wait ())
    может ли кто-нибудь написать некоторый код C , чтобы сделать зомби, его родителем является Init?
  • могут ли зомби отказаться от какой-либо блокировки памяти ??

заранее спасибо

Ответы [ 4 ]

13 голосов
/ 04 октября 2010

- в чем выгода от концепции процесса зомби?

Процесс зомби - это просто pid, статус выхода и некоторая учетная информация, которая остается до тех пор, пока родитель не использует одно из семейства waitсистемные вызовы, чтобы получить его окончательный статус.Пока родитель не вызовет wait идентификатор дочернего процесса должен оставаться отмеченным как использованный, чтобы никакой другой процесс не мог быть назначен ему.Если бы другому процессу был назначен переработанный pid, было бы трудно определить разницу между ним и предыдущими процессами, которые имели тот же pid.Как только родительский номер wait вызывается и возвращается окончательное состояние выхода, можно предположить, что никто не будет снова искать ребенка за этим pid, поэтому теперь pid можно использовать повторно.(Я думаю, что в Linux, если родитель оставляет SIGCHLD как SIG_IGN, ядро ​​не будет держать зомби, но перерегистрация расположения SIGCHLD как SIG_IGN не даст того же эффекта)

- знать, что ядро ​​сохраняет (PID, статус завершения, информация об использовании ресурсов) для процесса зомби, что означает «информация об использовании ресурсов»

Часть этой информации - то, о чем будет сообщать запущенная программа:

time my_program

.Эти значения обычно сообщаются в структуре siginfo для SIGCHLD (которая не является точно вызовом wait), но также доступны из вызова в форме waitid вызова systme (в некоторых системах).Посмотрите на man sigaction информацию об этой структуре.

- как PPID зомби () = 1 и он все еще зомби (init пожинает зомби, потому что он по умолчанию wait ())

Aзомби, чей ppid = 1 не должен оставаться зомби очень долго, потому что init должен пожинать его довольно быстро.Процесс будет оставаться зомби с момента, когда он вскоре умрет (либо с помощью exit, либо с помощью неуправляемого сигнала, который его убивает), пока его родитель не вызовет wait и не получит свой окончательный статус.Это означает, что даже если init ничего не делает, кроме как вызывает init снова и снова, может пройти небольшое время, когда процесс может проявиться как зомби.Если процессы отображаются как потомки init (0 = ppid) в течение длительного времени (в секундах), то, возможно, что-то не так.

- любой может написать некоторый C-код, чтобы сделатьзомби, его родитель Инициатор?

Это не ясно, но я думаю, что вы хотите:

pid_t f = fork();
if (f > 0) {
    exit(0); // this is the parent dying, so the child will be an orphan
             // and get adopted by init
} else if (f == 0) {
    sleep(100); // This is the child doing something that takes enough time for
                // its parent to commit suicide (exit(0)) and then for you to
                // observe that it has now been adopted by init
    exit(0);    // And now it dyes as well, so init should reap its status, but
                // it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */

- могут ли зомби отказаться от какой-либо блокировки памяти ??

Зомби не могут ничего удержать.Они теряют все свои страницы памяти, дескрипторы открытых файлов и т. Д.Практически все, что операционная система может выяснить, как освободиться, должно быть освобождено.Это не ошибка, но помните, что ОС должна знать, что она должна быть освобождена.Очень легко создать ресурсы в пространстве пользователя, которые должны быть освобождены, когда программа умирает, и ОС не знает, что она должна быть освобождена.

3 голосов
/ 04 октября 2010

Процесс зомби - это просто значение статуса pid и exit. PID не может быть освобожден, потому что ресурс (pid) «принадлежит» родителю. Если он был освобожден, другому процессу может быть назначен тот же pid, и тогда родительский процесс может в конечном итоге посылать сигналы несвязанному процессу; даже если родитель сначала подождал, чтобы определить, ушел ли ребенок, не было бы способа избежать условий гонки.

2 голосов
/ 19 ноября 2016

Если вы заинтересованы в том, чтобы увидеть процесс зомби в списке запущенных процессов, используйте это:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    pid_t p = fork();   // creates child process and stores the returned PID

    if (p != 0)         // executed by parent process
    {   sleep(1);       /* the child process terminates while the parent process sleeps,
                           the child then becomes a zombie process because the returned status
                           of the terminated child process isn't checked via a wait() */

        system("ps -eo pid,ppid,stat,cmd");  // prints a list of processes in your terminal

    }
    else        // executed by child process
    {
        exit(0);        // the child process terminates immediately
    }

    return 0;
}

Вы можете идентифицировать процесс зомби по Z + в списке:

screenshot of the zombie process

ПРИМЕЧАНИЕ: вам придется изменить код, если вы используете Windows.

0 голосов
/ 01 ноября 2018

Процессы-зомби - это процессы, которые прекратили работать, но их запись в таблице процессов все еще существует, поскольку родительский процесс не получил ее через системный вызов wait. Технически каждый процесс, который завершается, является зомби в течение очень короткого периода времени, но они могут жить дольше.

Длительные жизненные процессы зомби происходят, когда родительские процессы не вызывают системный вызов ожидания после завершения дочернего процесса. Одна из ситуаций, когда это происходит, - когда родительский процесс плохо написан и просто пропускает вызов ожидания, или когда родительский процесс умирает до того, как дочерний процесс и новый родительский процесс не вызывает ожидание для него. Когда родительский процесс умирает раньше дочернего, ОС назначает дочерний процесс процессу «init» или PID 1. То есть процесс init «принимает» дочерний процесс и становится его родителем. Это означает, что теперь, когда дочерний процесс завершает работу, новый родительский элемент (init) должен вызвать wait, чтобы получить свой код выхода, или его запись в таблице процессов останется навсегда и станет зомби

...