Un proceso huérfano es un proceso informático cuyo proceso principal ha finalizado o terminado , aunque sigue ejecutándose.
Tipo Unix
En un sistema operativo similar a Unix, cualquier proceso huérfano será adoptado inmediatamente por el proceso especial del sistema init : el kernel establece el padre en init. Esta operación se llama re-crianza y ocurre automáticamente. Aunque técnicamente el proceso tiene el proceso "init" como padre, todavía se le llama proceso huérfano ya que el proceso que lo creó originalmente ya no existe. En otros sistemas, los procesos huérfanos son inmediatamente terminados por el kernel. En los sistemas Linux modernos, un proceso huérfano se puede comparar a un proceso "subreaper" en lugar de init . [1] [2]
Un proceso puede quedar huérfano involuntariamente, como cuando el proceso principal termina o se bloquea. El mecanismo de grupo de procesos en la mayoría de los sistemas operativos similares a Unix se puede utilizar para ayudar a proteger contra la huérfana accidental, donde en coordinación con el shell del usuario intentará terminar todos los procesos secundarios con la señal de " colgar " ( SIGHUP ), en lugar de dejarlos seguir corriendo como huérfanos. Más precisamente, como parte del control del trabajo , cuando el shell sale, porque es el "líder de sesión" (su ID de sesión es igual a su ID de proceso), la sesión de inicio de sesión correspondiente finaliza y el shell envía SIGHUP a todos sus trabajos (representación interna de grupos de procesos).
A veces es deseable dejar un proceso huérfano intencionalmente, generalmente para permitir que un trabajo de larga ejecución se complete sin la atención adicional del usuario, o para iniciar un servicio o agente en ejecución indefinida; tales procesos (sin una sesión asociada) se conocen como demonios , particularmente si se ejecutan indefinidamente. Un enfoque de bajo nivel es bifurcar dos veces, ejecutar el proceso deseado en el nieto y terminar inmediatamente al hijo. El proceso de nietos ahora está huérfano y no es adoptado por sus abuelos, sino por init. Las alternativas de nivel superior evitan el manejo de la suspensión del shell, ya sea diciéndole al proceso hijo que ignore SIGHUP (usando nohup ), o eliminando el trabajo de la tabla de trabajos o diciéndole al shell que no envíe SIGHUP al final de la sesión (usando disown en cualquier caso ). En cualquier caso, la identificación de la sesión (identificación del proceso del líder de la sesión, el shell) no cambia, y la identificación del proceso de la sesión que ha finalizado todavía está en uso hasta que todos los procesos huérfanos terminen o cambien la identificación de la sesión (iniciando un nueva sesión vía setsid(2)
).
Para simplificar la administración del sistema, a menudo es deseable utilizar una envoltura de servicios para que los procesos no diseñados para ser utilizados como servicios respondan correctamente a las señales del sistema. Una alternativa para mantener los procesos en ejecución sin dejarlos huérfanos es utilizar un multiplexor de terminal y ejecutar los procesos en una sesión separada (o una sesión que se separa), de modo que la sesión no se termine y el proceso no quede huérfano.
También se dice que un proceso del servidor queda huérfano cuando el cliente que inició la solicitud se bloquea inesperadamente después de realizar la solicitud mientras deja el proceso del servidor en ejecución.
Estos procesos huérfanos desperdician los recursos del servidor y potencialmente pueden dejar a un servidor sin recursos. Sin embargo, existen varias soluciones al problema del proceso huérfano:
- La terminación es la técnica más utilizada; en este caso se mata al huérfano.
- La reencarnación es una técnica en la que las máquinas intentan periódicamente localizar a los padres de cualquier cálculo remoto; momento en el que se matan los procesos huérfanos.
- La caducidad es una técnica en la que a cada proceso se le asigna una cierta cantidad de tiempo para que finalice antes de ser eliminado. Si es necesario, un proceso puede "pedir" más tiempo para finalizar antes de que expire el tiempo asignado.
Ver también
Referencias
- ^ "¿Qué es un proceso" subreaper "?" .
- ^ "Nuevo proceso padre cuando muere el proceso padre" .
Desde Linux 3.4 en adelante, los procesos pueden emitir la llamada al sistema prctl () con la opción PR_SET_CHILD_SUBREAPER y, como resultado, ellos, no el proceso # 1, se convertirán en el padre de cualquiera de sus procesos descendientes huérfanos.
- " 10.6.4 Grupos de procesos huérfanos ", El modelo de proceso del desarrollo de aplicaciones Linux , por Erik W. Troan y Michael K. Johnson, 8 de julio de 2005
Definición: Un proceso huérfano es un proceso en ejecución cuyo proceso padre está terminado o terminado.