Ответ
Процесс-сирота (orphan process) — это живой дочерний процесс, родитель которого завершился. В этом случае ядро Linux назначает ему нового родителя — процесс init (или systemd с PID 1). Сирота продолжает нормально выполняться.
Зомби-процесс (zombie process) — это завершенный дочерний процесс, запись о котором остаётся в таблице процессов, потому что родительский процесс ещё не прочитал его статус завершения с помощью системного вызова wait() или его вариантов. Зомби не потребляет ресурсы CPU или память, но занимает запись в таблице процессов (PID).
Ключевые отличия:
- Состояние: Сирота — живой (
R/S), зомби — мертвый (Z). - Причина: Сирота возникает из-за смерти родителя, зомби — из-за того, что родитель не обработал статус завершения.
- Решение: Сироты работают самостоятельно и завершатся сами. Зомби исчезают, когда родитель вызывает
wait()или когда родитель умирает (тогда зомби "усыновляет"init, который автоматически выполнитwait).
Пример на практике (Bash):
# Создание зомби: дочерний процесс завершается быстрее, чем родитель читает статус
#!/bin/bash
# Дочерний процесс
if [ "$1" = "child" ]; then
echo "Child PID: $$"; exit 0
fi
# Родительский процесс запускает дочерний и не ждет его
./script.sh child &
sleep 10 # В этот момент завершенный дочерний процесс будет в состоянии Z (зомби)
# wait # Если раскомментировать wait, зомби будет убран
Для поиска зомби-процессов используйте ps aux | grep 'Z' или top.