Solución:
Cuando un niño sale, algún proceso debe wait
en él para obtener su código de salida. Ese código de salida se almacena en la tabla de proceso hasta que esto suceda. El acto de leer ese código de salida se llama “cosechar” al niño. Entre el momento en que un niño sale y es cosechado, se le llama zombi. (Toda la nomenclatura es un poco espantosa cuando lo piensas; recomiendo no pensar demasiado en eso).
Los zombis solo ocupan espacio en la tabla de proceso. No toman memoria ni CPU. Sin embargo, la tabla de procesos es un recurso finito y un exceso de zombis puede llenarla, lo que significa que no se pueden iniciar otros procesos. Más allá de eso, son un desorden molesto y deben evitarse enérgicamente.
Si un proceso sale con niños aún en ejecución (y no mata a sus niños; la metáfora sigue siendo extraña), esos niños son huérfanos. Los niños huérfanos son “adoptados” inmediatamente por init
(de hecho, creo que la mayoría de la gente llama a esto “reparenting”, pero “adopción” parece llevar mejor la metáfora). Un huérfano es solo un proceso. Utilizará los recursos que utilice. Es razonable decir que no es un “huérfano” en absoluto, ya que tiene un padre, pero los he oído llamar así a menudo.
init
recoge automáticamente sus hijos (adoptados o no). Entonces, si sale sin limpiar a sus hijos, entonces no se convertirán en zombis (al menos no por más de un momento).
Pero existen zombis longevos. ¿Qué son? Son los antiguos hijos de un proceso existente que no los ha cosechado. El proceso se puede colgar. O puede estar mal escrito y se olvida de cosechar sus hijos. O tal vez está sobrecargado y no lo ha logrado. O lo que sea. Pero por alguna razón, el proceso padre continúa existiendo (por lo que no son huérfanos) y no han sido atendidos, por lo que viven como zombis en la tabla de procesos.
Entonces, si ve zombis durante más de un momento, significa que hay algo mal en el proceso principal y se debe hacer algo para mejorar ese programa.
Cuando un proceso termina, el sistema operativo desasigna sus recursos. Sin embargo, su entrada en la tabla de procesos debe permanecer allí hasta que el padre llame a wait (), porque la tabla de procesos contiene el estado de salida del proceso. Un proceso que ha terminado, pero cuyo padre aún no ha llamado a wait (), se conoce como proceso zombie. Todos los procesos pasan a este estado cuando terminan, pero generalmente existen como zombis solo brevemente. Una vez que el padre llama a wait (), se libera el identificador de proceso del proceso zombie y su entrada en la tabla de procesos.
Ahora considere lo que sucedería si un padre no invocara wait () y en su lugar terminara, dejando así sus procesos secundarios como huérfanos. Linux y UNIX abordan este escenario asignando el proceso init como el nuevo padre a los procesos huérfanos. El proceso init invoca periódicamente a wait (), lo que permite recopilar el estado de salida de cualquier proceso huérfano y liberar el identificador de proceso huérfano y la entrada de la tabla de procesos.
Fuente: Conceptos del sistema operativo por Abraham, Peter, Greg
Un proceso huérfano es un proceso informático cuyo parent process
ha finalizado o terminado, aunque (el proceso hijo) sigue ejecutándose.
A proceso zombie o proceso difunto es un proceso que ha completado la ejecución pero todavía tiene una entrada en la tabla de procesos ya que su proceso padre no invocó un wait()
llamada al sistema.