Урок 7: wait() — сбор дочерних процессов и предотвращение зомби
Когда дочерний процесс завершает работу, он остаётся в состоянии зомби, пока родительский процесс не вызовет wait(). В NVIDIA серверы инференса, запускающие несколько рабочих процессов, обязаны очищать их с помощью wait(). Процессы-зомби, удерживающие контекст CUDA, оставляют VRAM выделенной, пока р
Процесс-зомби похож на сотрудника, который подал заявление об увольнении, но менеджер ещё не подписал бланк. Он больше не работает, но всё ещё занимает стол. wait() — это подпись менеджера: только тогда стол (память) освобождается.
- Процесс-зомби (zombie process)
- Процесс, который завершил работу (был вызван exit()), но его запись в таблице процессов всё ещё существует, потому что родитель не вызвал wait(). Состояние Z в ps. Процесс-зомби не использует CPU, но занимает PID и может удерживать ресурсы GPU.
- wait() / waitpid()
- Системные вызовы, которые ждут завершения дочернего процесса и очищают его запись. wait() ждёт любого потомка, waitpid(pid, &status, 0) ждёт конкретного потомка. Их нужно вызывать, чтобы предотвратить зомби.
- WIFEXITED
- Макрос, который проверяет, завершился ли дочерний процесс нормально (через exit/return), а не по сигналу. WIFEXITED(status) возвращает true, если завершение было нормальным.
- WEXITSTATUS
- Макрос, который извлекает код выхода из status, возвращённого wait(). WEXITSTATUS(status) возвращает значение, переданное в exit() или возвращённое из main().
- Осиротевший процесс (orphan process)
- Процесс, родительский процесс которого завершился раньше него. Ядро переназначает осиротевшие процессы к init (PID 1), который вызовет для них wait(). Отличается от зомби — orphan работает, зомби завершился.