¿Cómo maneja Linux el proceso zombie?

12

Los procesos zombis se crean en sistemas Unix / Linux. Podemos eliminarlos a través del killcomando.

¿Pero hay algún mecanismo de limpieza incorporado en Linux para manejar procesos zombies?

Atur
fuente

Respuestas:

18

Los procesos de zombis ya están muertos. No puedes matarlos. El killcomando 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 waitfamilias de syscalls; En este punto, el zombie desaparece. waitSe 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 sigactioncon la SA_NOCLDWAITbandera), 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 inites llamar waiten un bucle y, por lo tanto, cosechar cualquier proceso zombie dejado por su padre.

Gilles 'SO- deja de ser malvado'
fuente
6

No eres killun proceso zombie, ya que está muerto.

Los procesos de zombis deben ser waiteditados 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 initproceso hereda cada elemento secundario , que recogerá waitel estado de salida en el elemento secundario y eliminará su entrada en la tabla de proceso.

chrk
fuente
3

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. inithabrá waiten cada huérfano que recoge, cosechando así el huérfano (que también puede haber sido un zombi también).

Philipp Murry
fuente
1
No. Siendo preciso, initno mata ningún proceso. Solo waitdepende de sus hijos recopilar su estado.
chrk
1
@chrk, Philipp: el término habitual es cosechar .
Gilles 'SO- deja de ser malvado'
1

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.

unxnut
fuente
entonces ... ¿no tiene esto un efecto negativo de la memoria, etc.?
1
En realidad, cuando el padre de las matrices de zombies, el initproceso se hace cargo y llamará a waitque
No, se liberan todos los recursos asignados al proceso, excepto la entrada en la tabla de procesos.
unxnut