Lección 7: wait() — recolectar hijos y prevenir zombis
Cuando un proceso hijo termina de ejecutarse, se queda en estado zombi hasta que el proceso padre llama a wait(). En NVIDIA, los servidores de inferencia que ejecutan múltiples worker processes deben limpiarlos con wait(). Los procesos zombi con un contexto CUDA retienen VRAM hasta que el padre llam
Un proceso zombi es como un empleado que entregó su carta de renuncia, pero el gerente todavía no firmó el formulario. Ya no trabaja, pero sigue ocupando un escritorio. wait() es la firma del gerente — solo entonces se libera el escritorio (la memoria).
- Proceso zombi
- Un proceso que terminó de ejecutarse (se llamó a exit()) pero cuya entrada en la tabla de procesos todavía existe porque el padre no llamó a wait(). Estado Z en ps. Un proceso zombi no consume CPU pero ocupa un PID y puede retener recursos de GPU.
- wait() / waitpid()
- Syscalls que esperan a que un proceso hijo termine y limpian su registro. wait() espera a cualquier hijo, waitpid(pid, &status, 0) espera a un hijo específico. Hay que llamarlos para evitar zombis.
- WIFEXITED
- Un macro que verifica si un proceso hijo terminó normalmente (vía exit/return) y no por una señal. WIFEXITED(status) devuelve true si la terminación fue normal.
- WEXITSTATUS
- Un macro que extrae el código de salida del status devuelto por wait(). WEXITSTATUS(status) devuelve el valor pasado a exit() o retornado desde main().
- Proceso huérfano
- Un proceso cuyo proceso padre terminó antes que él. El kernel reasigna los procesos huérfanos a init (PID 1), que llamará a wait() por ellos. Es distinto de un zombi — el huérfano sigue corriendo, el zombi ya terminó.