Подтвердить что ты не робот

Процессы зомби

Несколько вопросов о процессах зомби

  • Каковы преимущества концепции зомби-процесса?
  • знать, что ядро ​​хранит (PID, статус завершения, информацию об использовании ресурсов) для процесса зомби

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

заблаговременно

4b9b3361

Ответ 1

- каковы преимущества концепции зомби-процесса?

Процесс зомби - это просто 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 забирает зомби, потому что он по-прежнему() по умолчанию)

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

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

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

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 */

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

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

Ответ 2

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

Ответ 3

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

#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 + в списке:

снимок экрана процесса зомби

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