Ответ
Зомби-процесс (Zombie или Defunct process) — это дочерний процесс в Unix-подобных системах, который завершил своё выполнение (с помощью exit()), но его запись остаётся в таблице процессов до тех пор, пока родительский процесс не прочитает его статус завершения.
Механизм возникновения:
- Дочерний процесс завершается.
- Ядро освобождает его ресурсы (память, файловые дескрипторы), но сохраняет небольшую запись с кодом завершения (exit status).
- Эта запись нужна, чтобы родитель мог узнать, как завершился его потомок (через системный вызов
wait()илиwaitpid()). - Если родитель никогда не вызывает
wait(), запись процесса остаётся в системе как "зомби".
Характеристики зомби-процесса:
- Не потребляет CPU и память (кроме самой записи в таблице процессов).
- Не может быть "убит" сигналом
SIGKILL, так как уже мёртв. - Исчезает, когда родительский процесс завершается (все его зомби "усыновляет"
initпроцесс, который периодически вызываетwait()) или когда родитель вызываетwait().
Пример на C:
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// Дочерний процесс
sleep(1);
_exit(0); // Завершаемся
} else {
// Родительский процесс
sleep(10); // НЕ вызывает wait() → дочерний процесс станет зомби на 9 секунд
// wait(NULL); // Раскомментировать, чтобы избежать зомби
sleep(10);
}
return 0;
}
Как избежать зомби-процессов в разработке:
- Всегда вызывать
wait()илиwaitpid()для завершённых потомков. - Использовать обработчик сигнала
SIGCHLD, который уведомляет родителя о завершении потомка. - Дважды вызывать
fork()("fork twice"), чтобы сразу отдавать потомковinit.
В iOS/macOS: система управления процессами (launchd, XNU kernel) корректно обрабатывает зомби, поэтому в пользовательских приложениях эта проблема обычно не возникает.