Aula 7: wait() — Coletando Filhos e Prevenindo Zombies
Quando um processo filho termina de rodar, ele fica em estado zombie até que o processo pai chame wait(). Na NVIDIA, servidores de inference que rodam múltiplos worker processes precisam limpá-los com wait(). Processos zombie com contexto CUDA mantêm a VRAM alocada até que o pai chame wait() — um bu
Um processo zombie é como um funcionário que entregou a carta de demissão, mas o gestor ainda não assinou o formulário. Ele não trabalha mais, mas ainda ocupa uma mesa. wait() é a assinatura do gestor — só então a mesa (a memória) é liberada.
- Processo Zombie
- Um processo que terminou de rodar (exit() foi chamado) mas cuja entrada na process table ainda existe porque o pai não chamou wait(). Estado Z no ps. Um processo zombie não consome CPU, mas ocupa um PID e pode reter recursos de GPU.
- wait() / waitpid()
- Syscalls que esperam um processo filho terminar e limpam sua entrada. wait() espera qualquer filho, waitpid(pid, &status, 0) espera um filho específico. Precisam ser chamadas para evitar zombies.
- WIFEXITED
- Uma macro que verifica se um processo filho terminou normalmente (via exit/return) e não por um signal. WIFEXITED(status) retorna true se o término foi normal.
- WEXITSTATUS
- Uma macro que extrai o código de saída do status retornado por wait(). WEXITSTATUS(status) retorna o valor passado para exit() ou retornado de main().
- Processo Orphan
- Um processo cujo processo pai terminou de rodar antes dele. O kernel reatribui processos orphan ao init (PID 1), que vai chamar wait() por eles. Diferente de zombie — orphan está a correr, zombie terminou.