Los procesos zombis se crean en sistemas Unix / Linux. Podemos eliminarlos a través del kill
comando.
¿Pero hay algún mecanismo de limpieza incorporado en Linux para manejar procesos zombies?
fuente
Los procesos zombis se crean en sistemas Unix / Linux. Podemos eliminarlos a través del kill
comando.
¿Pero hay algún mecanismo de limpieza incorporado en Linux para manejar procesos zombies?
Los procesos de zombis ya están muertos. No puedes matarlos. El kill
comando o la llamada al sistema no tiene efecto en un proceso zombie. (Puedes hacer que un zombie se vaya kill
, pero tienes que dispararle al padre, no al zombie, como veremos en un minuto).
Un proceso zombie no es realmente un proceso, es solo una entrada en la tabla de procesos. No hay otros recursos asociados con el proceso zombie: no tiene memoria ni código de ejecución, no tiene archivos abiertos, etc.
Cuando un proceso muere, lo último que queda, después de que se hayan limpiado todos los demás recursos, es la entrada en la tabla de procesos. Esta entrada se mantiene, formando un zombi, para permitir que el proceso principal rastree el estado de salida del niño. El padre lee el estado de salida llamando a una de las wait
familias de syscalls; En este punto, el zombie desaparece. wait
Se dice que las llamadas cosechan al niño, extendiendo la metáfora de la muerte de un zombi, pero de alguna manera aún no se procesa completamente en la otra vida. El padre también puede indicar que no le importa (ignorando la señal SIGCHLD, o llamando sigaction
con la SA_NOCLDWAIT
bandera), en cuyo caso la entrada en la tabla de proceso se elimina inmediatamente cuando el niño muere.
Por lo tanto, un zombie solo existe cuando un proceso ha muerto y su padre aún no ha llamado wait
. Este estado solo puede durar mientras el padre todavía se esté ejecutando. Si el padre muere antes que el niño o muere sin leer el estado del niño, el proceso padre del zombie se establece en el proceso con PID 1, que es init
. Uno de los trabajos de init
es llamar wait
en un bucle y, por lo tanto, cosechar cualquier proceso zombie dejado por su padre.
No eres kill
un proceso zombie, ya que está muerto.
Los procesos de zombis deben ser wait
editados por sus padres, para que se pueda recopilar su estado de salida.
El único "mecanismo de limpieza integrado" que existe en Linux funciona para el caso de que cualquier proceso padre muera antes de que recoja el estado de salida de sus hijos. En este caso, el init
proceso hereda cada elemento secundario , que recogerá wait
el estado de salida en el elemento secundario y eliminará su entrada en la tabla de proceso.
Tan pronto como el padre de un proceso muere, el proceso se vuelve huérfano, sin tener en cuenta si es un zombie o no. ¿Qué les pasa a los huérfanos? Consiguen un nuevo padre, llamado init
. init
habrá wait
en cada huérfano que recoge, cosechando así el huérfano (que también puede haber sido un zombi también).
init
no mata ningún proceso. Solowait
depende de sus hijos recopilar su estado.No, no hay un mecanismo de limpieza incorporado para zombies. Los zombis van al cielo de los zombis una vez que matan a sus padres. Hasta entonces, el sistema operativo los mantiene para devolver el estado de salida a padre.
fuente
init
proceso se hace cargo y llamará await
que