2010-10-04 20 views
12

i'v algunas preguntas acerca de los procesos zombizombi procesa

  • lo que los beneficios de concepto del proceso zombi?
  • saben que el núcleo mantiene (PID, estado de terminación, la información de uso de recursos) para el proceso zombie
    ¿cuál es el significado de "información sobre el uso de los recursos"
  • cómo PPID del zombi() = 1 y todavía zombi, (init siega Zombies porque espera() de forma predeterminada)
    ¿alguien puede escribir algún código C para hacer que un zombie sea su padre es Init?
  • ¿Pueden los zombies negarse a liberar algo de bloqueo en la memoria?

gracias de antemano

+0

Pertenece a superuser.com –

+10

@Paul R No lo creo, esto viene bajo la programación del sistema. – Searock

Respuesta

12

- ¿cuáles son los beneficios del concepto de proceso zombie?

Un proceso zombie es solo un pid, un estado de salida y cierta información de contabilidad que permanece hasta que un padre utiliza una de las llamadas al sistema wait para obtener su estado final. Hasta que un padre llame al wait, la identificación del proceso del niño debe permanecer marcada como utilizada para que no se le pueda asignar ningún otro proceso. Si a otro proceso se le asignase un pid reciclado, sería difícil distinguir la diferencia entre él y los procesos anteriores que tenían ese mismo pid. Una vez que el padre llama al wait y devuelve un estado de salida final, se puede suponer que nadie volverá a buscar al hijo en ese pid de nuevo, por lo que el pid puede volver a utilizarse. (creo que en Linux si un padre abandona SIGCHLD como SIG_IGN el núcleo no mantendrá zombis de todo, pero que volver a registrar la disposición de SIGCHLD como SIG_IGN no tiene el mismo efecto)

- saben que el núcleo mantiene (PID , estado de terminación, información de uso de recursos) para el proceso zombie lo que es el significado de "información de uso de los recursos"

parte de esta información es lo que se ejecuta un programa como:

time my_program 

informará. Estos valores generalmente se informan en la estructura siginfo para SIGCHLD (que no es exactamente una llamada al wait) pero también están disponibles a partir de una llamada a la forma de llamada de sistema waitid (en algunos sistemas). Consulte man sigaction para obtener información sobre esta estructura.

- cómo PPID del zombi() = 1 y todavía zombi, (init cosecha zombis porque esperar() por defecto)

Un zombi cuya ppid = 1 no deben quedarse en un zombi por mucho tiempo debido a init debería cosechar bastante rápido. Un proceso seguirá siendo un zombi desde un punto poco después de su muerte (ya sea a través del exit o mediante una señal sin manos que lo mata) hasta que su padre llame al wait y obtenga su estado final. Esto significa que incluso si init no hace más que llamar a init una y otra vez, podría haber una pequeña cantidad de tiempo en que un proceso puede aparecer como un zombie.Si los procesos aparecen como hijos de init (0 = ppid) durante largos períodos de tiempo (segundos), entonces es probable que algo esté mal.

- ¿alguien puede escribir un código C para hacer que un zombie sea su padre es Init?

Esto no es clara, pero creo que quiere:

pid_t f = fork(); 
if (f > 0) { 
    exit(0); // this is the parent dying, so the child will be an orphan 
      // and get adopted by init 
} else if (f == 0) { 
    sleep(100); // This is the child doing something that takes enough time for 
       // its parent to commit suicide (exit(0)) and then for you to 
       // observe that it has now been adopted by init 
    exit(0); // And now it dyes as well, so init should reap its status, but 
       // it may be a zombie for a short amount of time first. 
} else /* error condition would be handled here */ 

- zombis pueden negarse a liberar un poco de bloqueo en la memoria ??

Zombies no pueden aferrarse a mucho de nada. Pierden todas sus páginas de memoria, abren manejadores de archivos, ... etc. Prácticamente todo lo que el sistema operativo puede descifrar cómo liberarse debe ser liberado. Sería un error no hacerlo, pero recuerde que el sistema operativo debe saber que se supone que debe liberarse. Es muy fácil crear recursos en el espacio de usuario que deberían liberarse cuando muere un programa que el sistema operativo no sabe que deberían liberarse.

+0

mira esto y sabrás mi significado sobre el punto 3 http://stackoverflow.com/questions/1907775/init-never-reaping-zombie-defunct-processes – Aboelnour

+3

@Aboelnour: O había uno o más errores en el kernel o _init_ en el sistema que se ejecutó, por alguna razón _init_ había muerto (no sé lo que se supone que sucedería si _init_ muere), root envió 'SIGSTP' a _init_, o _init_ estaba funcionando extremadamente lento. Eso no se supone que suceda – nategoose

3

Un proceso zombie es puramente un valor de estado pid y salida. El pid no puede ser liberado porque el recurso (el pid) "pertenece" al padre. Si se liberara, a otro proceso se le podría asignar el mismo pid, y luego el padre podría terminar enviando señales a un proceso no relacionado; incluso si el padre esperaba primero para determinar si el niño había salido, no habría forma de evitar las condiciones de carrera.

+0

... Creo que me estoy perdiendo algo. ¿Cuál es la definición de un proceso zombie del que estás trabajando? –

+2

Un proceso hijo que ha salido pero cuyo padre no ha obtenido la notificación del estado de salida a través de 'waitpid' o interfaces similares. –

+0

Ahh, sí. Lo siento. Me di cuenta de que seguía leyendo "zombie" y estaba pensando "huérfano". Gracias. –

2

Si está interesado en ver el proceso zombi dentro de una lista de procesos en ejecución utilizan este:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(void) 
{ 
    pid_t p = fork(); // creates child process and stores the returned PID 

    if (p != 0)   // executed by parent process 
    { sleep(1);  /* the child process terminates while the parent process sleeps, 
          the child then becomes a zombie process because the returned status 
          of the terminated child process isn't checked via a wait() */ 

     system("ps -eo pid,ppid,stat,cmd"); // prints a list of processes in your terminal 

    } 
    else  // executed by child process 
    { 
     exit(0);  // the child process terminates immediately 
    } 

    return 0; 
} 

se puede identificar el proceso zombie por el Z + en la lista:

screenshot of the zombie process

NOTA: tendrá que modificar el código si está usando Windows.

Cuestiones relacionadas