Proceso zombi , zombi ( ing. proceso zombi , ing. proceso difunto ): un proceso secundario en un sistema Unix que completó su ejecución, pero aún está presente en la lista de procesos del sistema operativo para permitir que el proceso principal lea el código de salida .
Derivado de la palabra " zombi ", que significa "muerto viviente" ( oxímoron , inglés undead ). El término es una vívida metáfora del hecho de que el proceso está "muerto", pero no "enterrado".
Un proceso, cuando finaliza (ya sea normalmente o como resultado de una señal no controlada), libera todos sus recursos y se convierte en un "zombie": una entrada vacía en la tabla de procesos que almacena el estado de salida para ser leído por el proceso principal.
Existe un proceso zombi hasta que el proceso principal lee su estado con una llamada al sistema wait() , lo que hace que se libere la entrada de la tabla de procesos.
Cuando finaliza un proceso, el sistema notifica al proceso principal la finalización del proceso secundario con la señal SIGCHLD , por lo que puede ser conveniente (pero no necesario) llamar wait()a un controlador para esta señal.
Los zombis no ocupan memoria (como los procesos huérfanos ), sino que bloquean las entradas en la tabla de procesos, que tiene un tamaño limitado para cada usuario y el sistema en su conjunto.
Cuando se alcanza el límite de escritura, todos los procesos del usuario que ejecuta el proceso principal creador de zombis no podrán crear nuevos procesos secundarios. Además, el usuario bajo cuyo nombre se ejecuta el proceso principal no podrá iniciar sesión en la consola (local o remota) ni ejecutar ningún comando en una consola ya abierta (porque el intérprete de comandos sh debe crear un nuevo proceso para esto) , y para restaurar la salud (terminar el programa infractor) se requerirá la intervención del administrador del sistema.
A veces, si el proceso principal se ejecuta en nombre del superusuario, es posible que se requiera un reinicio para liberar los registros (reiniciar el proceso) (y, a menudo, solo un reinicio completo). Algunos sistemas operativos (como Sun Solaris ) bloquearán algunos de los procesos en ejecución cuando ocurra esta situación, restaurando la salud del sistema.
Cada proceso está en un estado zombi cuando finaliza y hasta que un ancestro lee el estado de terminación, esto es perfectamente normal y los procesos zombis de corta duración no son un problema en el sistema. Al mismo tiempo, una serie de errores de programación pueden dar lugar a la aparición y acumulación de procesos zombis sin procesar en el sistema (es decir, procesos que ya terminaron, cuyo padre no lee su estado).
Ignorar el manejo de la terminación de los procesos hijos no es correcto, pero por lo general no genera problemas para los programas de corta duración, ya que cuando un proceso termina, todos sus hijos se convierten en hijos del proceso init, que constantemente lee el estado de sus hijos zombies, limpiando la tabla de procesos. Es para habilitar este mecanismo que se realiza la técnica estándar de inicio del daemon "doble bifurcación ()": el padre intermedio termina, haciendo que el proceso sea el padre de su hijo init.
Para los programas de larga duración y que crean niños con frecuencia, el control de finalización del programa niño debe manejarse correctamente, porque la acumulación de zombis no controlados conduce a una "fuga de recursos" en forma de acumulación de entradas en la tabla de procesos.
En Linux, a partir del kernel 3.4, un proceso tiene la capacidad de declararse un adoptante huérfano ("subrecolector") en lugar de un proceso con el initcomando prctl(PR_SET_CHILD_SUBREAPER).