Además de estar en ejecución, inactivo... el proceso en realidad tiene un estado zombi y huérfano

Resumen: En este capítulo reconoceremos varios estados de proceso: estado en ejecución, estado inactivo, estado en pausa, estado de salida, etc. También presente dos procesos zombies y procesos huérfanos con experiencias de vida trágicas ~

Este artículo se comparte desde Huawei Cloud Community "¿ Proceso Zombie? ¿Proceso huérfano? ¿Por qué tuvo una experiencia de vida tan trágica... ", autor: Hua Xiangyun.

Conoce el estado del proceso

El estado del proceso en Linux generalmente tiene:

  • R (estado de ejecución): no significa que realmente se esté ejecutando (se refiere a que está programado por la CPU);
  • S (estado de suspensión): El proceso está esperando adquirir algún tipo de recurso, este estado también se denomina suspensión interrumpible;
  • D (estado de inactividad del disco): el proceso en este estado también está inactivo, pero no se puede interrumpir, por lo que este estado también se denomina inactividad ininterrumpida;
  • T (estado de suspensión): un proceso se puede detener enviando una señal SIGSTOP al proceso. El proceso suspendido se puede reanudar enviando la señal SIGCONT.
  • X (estado de muerte): este estado es solo un estado de retorno, no verá este estado en la lista de tareas;
  • Z (estado zombi): cuando un proceso secundario no es "reciclado" por el proceso principal, el proceso estará en estado zombi;

La siguiente es la definición de estos estados en el código fuente del kernel:

static const char * const task_state_array[] = {
“R (running)”, // 0
“S (sleeping)”, // 1
“D (disk sleep)”, // 2
“T (stopped)”, // 4
“t (tracing stop)”, // 8
“X (dead)”, // 16
“Z(zombie)”, // 32
};

Cómo comprobar el estado del proceso

  • Introduzca el comando:
ps axj | head -n1 && ps axj | grep myprocess | grep -v grep

A continuación, echemos un vistazo a cómo se ven los distintos estados ~

Estado R

Citación

Cuando ejecuta muchos programas en su computadora al mismo tiempo, por ejemplo, cuando está escribiendo un código, también está escuchando una canción reproducida por un determinado software, o cambiando de un navegador a otro. ¿Todas estas aplicaciones se están ejecutando en la CPU en este momento?

La respuesta es, no realmente.

Cuando la CPU está funcionando, habrá una cola de procesos en ejecución. El contenido mantenido por la cola es un puntero a cada estructura task_struct (se mencionó en el capítulo anterior que task_struct es un descriptor de proceso). Los procesos mantenidos en esta cola están todos en estado R y esperando ser programados por la CPU.

como observar

Escribe un simple fragmento de código:

#include<stdio.h>
#include<unistd.h>
int main()
{
 while(1)
 {
 printf("hello myprocess\n");
 }
 return 0;
}

Después de ejecutar el programa, vea el estado del proceso como se muestra en la figura:

  • Aquí viene la pregunta nuevamente, ¿por qué no vio el llamado estado R cuando se ejecutó el programa?
  • La respuesta es que, debido a que la velocidad de operación de la CPU es demasiado rápida, es básicamente difícil para nosotros ver el estado R. El proceso imprime hello myprocess en la pantalla en un bucle sin fin. Todos sabemos que la pantalla en este momento es una especie de periférico, y la velocidad de cómputo de la CPU no está en el mismo orden de magnitud que la velocidad de acceso del periférico. Por lo tanto, el proceso imprime contenido en la pantalla en un bucle sin fin, accediendo a los periféricos el 99,9 % del tiempo, y el resto del tiempo es la CPU haciendo cálculos. Cuando un proceso accede a los periféricos, la CPU no esperará en su lugar, sino que dará la vuelta y hará otras cosas. Cuando el proceso acceda con éxito a los periféricos, la CPU lo programará.

Entonces, ¿hay alguna forma de esperar para ver el estado R? Modificamos ligeramente el código anterior:

#include<stdio.h>
#include<unistd.h>
int main()
{
 while(1)
 {
 //printf("hello myprocess\n");
 }
 return 0;
}

Como se muestra en la figura anterior, cuando ya no accedemos a los periféricos, sino que seguimos haciendo cálculos repetidos, la CPU siempre estará programada en este momento y podemos ver el estado R.

Estado S y estado D

Estado S

El estado S se llama estado de sueño. ¿Por qué un proceso debe dormir bien? ¿Es porque estás cansado de correr durante demasiado tiempo? Por supuesto que no. El estado de sueño es esencialmente una especie de bloqueo.

  • Bloqueo: un estado en el que un proceso no avanza porque está esperando que un recurso esté disponible.

Por ejemplo, cuando un proceso está a mitad de camino y necesita obtener una gran cantidad de datos del disco, tomará mucho tiempo. En este momento, el sistema operativo maneja el proceso al permitir que el proceso continúe esperando los datos que desea, pero requiere que usted no ocupe la CPU mientras espera los recursos, por lo que el sistema operativo organiza el proceso para que espere en algún lugar. el estado S.

como observar

#include<stdio.h>
#include<unistd.h>
int main()
{
 while(1)
 {
 int n = 0;
 scanf("%d",&n);
 printf("%d\n",n);
 }
 return 0;
}

Como se muestra en el diagrama anterior, cuando un proceso está esperando datos ingresados ​​por el usuario desde el teclado, duerme.

Estado D

El estado D también es un estado de hibernación, pero tiene otro nombre llamado estado de hibernación del disco o hibernación ininterrumpida. Entonces, ¿cómo ve la diferencia entre el estado S y el estado D?

En primer lugar, tenemos que entender en qué circunstancias se interrumpirá el proceso. Cuando un proceso hace algunas cosas malas en secreto, y el usuario quiere detener el proceso en este momento, se debe enviar una señal de interrupción al proceso y el proceso será "matado".

En algunos casos, el sistema operativo puede "matar" ciertos procesos por sí mismo sin necesidad de que el usuario lo haga por sí mismo. Por ejemplo, cuando los recursos de memoria son muy escasos o incluso ponen en peligro la seguridad de todo el sistema, el sistema operativo "matará" algunos procesos sin importancia.

Por ejemplo, si un proceso entra en un estado inactivo porque está esperando datos, el sistema operativo lo descubre en este momento y la memoria es muy escasa, ¿sigue durmiendo aquí? ¡Desembolsar! Bueno, el proceso fue bifurcado. En este momento, se leyó la mitad de los datos y la parte en cuestión desapareció. Estos datos solo pueden descartarse, de lo contrario, quien encuentre el proceso en este momento puede encontrar "yo" después de la reencarnación.

Si estos datos descartados son algunos datos irrelevantes, simplemente deséchelos. Pero si es un documento confidencial, ¿no sería un gran problema? Por lo tanto, para evitar que el sistema operativo elimine accidentalmente algunos procesos ininterrumpibles, el proceso puede colocarse en un estado de suspensión ininterrumpible, es decir, el estado D. En este momento, el proceso finalmente no tiene miedo de ser perturbado cuando está durmiendo, pero cada paso atrás, dormiré en otro lugar, de lo contrario, temo que te impacientes. Entonces, cuando el proceso duerme, se duerme en un disco relativamente ancho.

estado t

El estado T se llama estado de parada, que es muy fácil de entender, significa pausar un determinado proceso. Por ejemplo, al depurar, establecemos varios puntos de interrupción. Cuando el proceso se detiene en el punto de interrupción, el proceso se suspende.

como observar

método uno

#include<stdio.h> 
#include<unistd.h>
int main() 
{ 
 while(1) 
 { 
 //printf("hello myprocess\n"); 
 int n = 0; 
 scanf("%d",&n); printf("%d\n",n); 
 }
 return 0;
}

Cuando establecemos un punto de interrupción en la línea 9 y lo ejecutamos, el programa se detiene en el punto de interrupción. Verifique el estado del proceso en este momento como se muestra en la siguiente figura:

Nota: t también es un estado suspendido. A veces también llamado estado de seguimiento.

Método dos

Podemos poner un proceso en estado de pausa enviando una señal de pausa al proceso. Edite el siguiente código:

#include<stdio.h> 
#include<unistd.h>
int main() 
{ 
 while(1) 
 { 
 printf("hello myprocess\n"); 
 }
 return 0;
}

Cuando el programa comience a ejecutarse, envíe una señal de pausa al proceso en este momento:

$ kill -19 (进程PID)

Además, también podemos enviar una señal de continuar para permitir que el proceso continúe ejecutándose:

$ kill -18 (进程PID)

Aviso

El proceso continúa ejecutándose. Pero descubrimos que hay un lugar que parece ser diferente al anterior ¿Siempre hay un signo + detrás de la S? No sabemos para qué es +, solo que parece haber desaparecido ahora.

  • "+" significa que se ejecuta en primer plano, sin "+" significa que se ejecuta en segundo plano;

Solíamos usar Ctrl + c al finalizar un programa antes, pero ahora parece que no es válido para el proceso que se ejecuta en segundo plano. En este momento, necesitamos dominar un nuevo comando para "matar" el proceso:

$ kill -9 (进程PID)

o,

$ kill -9 (进程PID)

Estado X y estado Z

  • El estado X es un estado de salida, que es un estado transitorio que no es fácil de observar, y se considera sin importancia por el momento;
  • El estado Z se llama estado Zombie. Como su nombre lo indica, un proceso que muere (sale) pero no "recoge el cuerpo" se convierte en un "zombie". Específicamente, cuando un proceso finaliza, si su proceso principal no lee el código de estado de salida devuelto cuando el proceso finaliza, el proceso se convertirá en un proceso zombi.

Hay muchos conceptos, así que hablemos de ellos primero. En primer lugar, ¿cuál es el código de estado de salida? En un programa en lenguaje C, a menudo tenemos que escribir una línea de código al final de la función principal: devolver 0;. Este 0 es el código de estado de salida, pero no es solo 0, también puede ser 1, 2, 3...

¿Cómo ver los procesos zombie?

A continuación, escribamos un fragmento de código para ver el proceso zombi:

#include<stdio.h> 
#include<unistd.h>
int main() 
{
 pid_t id = fork();
 if(id == 0)
 {
 while(1)
 {
 printf("我是子进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
 sleep(1);
 }
 }
 else if(id > 0) 
 {
 while(1)
 {
 printf("我是父进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
 sleep(1);
 }
 }
 return 0;
}

Cuando ejecutamos el programa, podemos ver que el programa se está ejecutando normalmente;

En este momento, cuando ejecutamos el comando para "matar" el proceso secundario, el proceso secundario se convertirá en un proceso zombi;

$ kill -9 (子进程PID)

Entre ellos, podemos ver una palabra en inglés -defunct- que significa zombi.

Los peligros de los procesos zombie

  • Mantener el estado de salida en sí requiere el mantenimiento de datos, que también pertenece a la información básica del proceso, por lo que se almacena en task_struct (es decir, PCB).En otras palabras, el estado Z no sale todo el tiempo, y el PCB tiene para ser mantenido todo el tiempo.
  • Un proceso principal crea muchos procesos secundarios, pero si no se recicla, provocará un desperdicio de recursos de memoria. Porque el objeto de estructura de datos en sí mismo ocupa memoria.

Los procesos zombi son dañinos y, por supuesto, podemos evitarlos, lo que debe mencionarse en el próximo capítulo.

proceso huérfano

Cuando el proceso padre está vivo, el proceso hijo cuelga temprano, lo que es fácil de causar un proceso zombi. Entonces, si el proceso padre cuelga antes de tiempo, ¿dónde debería ir el proceso hijo? Este es el proceso huérfano del que vamos a hablar a continuación.

Cómo ver los procesos huérfanos

Edite el siguiente código:

#include<stdio.h> 
#include<unistd.h>
int main() 
{
 pid_t id = fork();
 if(id == 0)
 {
 while(1)
 {
 printf("我是子进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
 sleep(1);
 }
 }
 else if(id > 0) 
 {
 while(1)
 {
 printf("我是父进程,我在运行,pid:%d,ppid:%d\n",getpid(),getppid());
 sleep(1);
 }
 }
 return 0;
}

Ejecute el programa, usamos el comando kill para "matar" el proceso principal y luego verificamos la información del proceso:

Como se muestra en la figura anterior, se han producido dos cambios en el proceso secundario. Uno es el PPID del proceso secundario y el otro es que el proceso secundario se ejecuta en segundo plano.

como entender

Cuando el proceso padre del proceso hijo cuelga, el proceso hijo será adoptado por el proceso 1. Este proceso también se conoce como proceso huérfano.

  • Entonces, ¿por qué adoptar?

La respuesta es encontrar a alguien que recoja el cuerpo por ti mismo. De lo contrario, cuando muera repentinamente un día y nadie recoja mi cuerpo por mí, se convertirá en un proceso zombi que causará un desastre en el mundo.

 

Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud por primera vez~

{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/9429287
Recomendado
Clasificación