zombie - procesos sleeping linux
Proceso Zombie vs Proceso huérfano (4)
No hay huérfanos, pero el proceso usa PID 1.
Desde el punto de vista del proceso en ejecución, no importa si se inició directamente y, por lo tanto, tiene PID 1 como primario o heredado por PID 1 porque su padre original (que es diferente de PID 1) finalizó. Se maneja como cualquier otro proceso.
Cada proceso pasa por algún tipo de estado zombi, cuando termina, es decir, la fase entre el anuncio de su final mediante la emisión de
SIGCHLD
y el reconocimiento de su procesamiento (entrega o ignorancia).
Cuando se ingresó el estado zombie, el proceso es solo una entrada en la lista de procesos del sistema.
El único recurso significativo que un zombie utiliza exclusivamente es un PID válido.
Un Zombie se crea cuando un proceso principal no utiliza la llamada al sistema de espera después de que un niño muere para leer su estado de salida, y un huérfano es un proceso hijo que es reclamado por init cuando el proceso principal original finaliza antes que el niño.
En términos de gestión de la memoria y la tabla de procesos, ¿cómo se manejan estos procesos de forma diferente, específicamente en UNIX?
¿Qué es un ejemplo o un caso extremo cuando la creación de zombis o huérfanos puede ser perjudicial para la aplicación o sistema mayor?
Cuando un niño sale, algún proceso debe wait
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 llama zombie. (Toda la nomenclatura es un poco horrible cuando lo piensas; te recomiendo que no lo pienses demasiado).
Los zombis solo ocupan espacio en la tabla de procesos. No toman memoria o CPU. Sin embargo, la tabla de procesos es un recurso finito y zombies excesivos pueden llenarlo, lo que significa que no se pueden iniciar otros procesos. Más allá de eso, son un desorden molesto, y deben evitarse fuertemente.
Si un proceso sale con los niños aún corriendo (y no mata a sus hijos, la metáfora sigue siendo extraña), esos niños son huérfanos. Los niños huérfanos son inmediatamente "adoptados" por init
(de hecho, creo que la mayoría de las personas lo llaman "repairinging", pero "adoption" parece llevar mejor la metáfora). Un huérfano es solo un proceso. Utilizará todos los recursos que use. 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
automáticamente recoge sus hijos (adoptados o no). Entonces, si sales sin limpiar a tus hijos, entonces no se convertirán en zombis (al menos no por más de un momento).
Pero existen zombies longevos. ¿Qué son? Son los hijos anteriores de un proceso existente que no los ha cosechado. El proceso puede ser colgado. O puede estar mal escrito y olvida cosechar a sus hijos. O tal vez está sobrecargado y no ha llegado a eso. 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 zombies en la mesa de proceso.
Entonces, si ves zombies por más de un momento, significa que hay algo mal con el proceso principal, y se debe hacer algo para mejorar ese programa.
Cuando un proceso finaliza, el sistema operativo desasigna sus recursos. Sin embargo, su entrada en la tabla de proceso debe permanecer allí hasta que el padre llame a wait (), porque la tabla de proceso contiene el estado de salida del proceso. Un proceso que ha finalizado, pero cuyo padre aún no ha llamado a wait (), se conoce como un proceso zombie . Todos los procesos cambian a este estado cuando terminan, pero generalmente existen como zombies 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 proceso.
Ahora considere lo que sucedería si un padre no invocaba wait () y en su lugar finalizaba, dejando sus procesos secundarios como huérfanos . Linux y UNIX abordan este escenario asignando el proceso init como el nuevo padre a procesos huérfanos. El proceso init invoca periódicamente wait (), lo que permite que se recopile el estado de salida de cualquier proceso huérfano y se libera el identificador del proceso del huérfano y la entrada de la tabla de proceso.
Fuente: Conceptos del sistema operativo de Abraham, Peter, Greg
Un proceso huérfano es un proceso de computadora cuyo proceso parent process
ha finalizado o finalizado, aunque (proceso hijo) sigue ejecutándose.
Un proceso zombie o un proceso inactivo es un proceso que ha completado la ejecución pero todavía tiene una entrada en la tabla de proceso ya que su proceso principal no invocó una llamada al sistema wait()
.