dic 01 2009

Por las noches veo zombies…

Published by at 6:54 pm under Bash,OpenSource,SysAdmin

¿Qué es un proceso zombie (zombi según la DRAE) en Unix? Según la Wikipedia, es un proceso que ha completado su ejecución pero aún tiene una entrada en la tabla de procesos, permitiendo al proceso que le ha creado leer el estado de su salida. Metafóricamente, el proceso hijo ha muerto pero su “alma” (el valor de retorno de la operación) aún no ha sido recogida.

Vale. Y entonces, ¿qué es un proceso zombi? (como dirían mis alumnos tras una explicación “de libro”) :-) Lo mejor es verlo con un ejemplo sencillito programado en C:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
 pid_t pid;
 
if ((pid = fork()) < 0)
        exit(1);
else if (pid == 0)
        exit(0);
 
sleep(120);
exit(0);
}

Nota: para compilar, guarda el código anterior en prueba.c y compila así: gcc -o prueba prueba.c

En la línea 8 se hace un fork(), es decir, el proceso actual (padre) genera un nuevo proceso (hijo). Ambos son “idénticos” (mismo área de código, datos, mismos identificadores de canal abiertos, etc.) y se ejecutan en paralelo (sí, con una sola CPU ese paralelismo es una mera “ilusión óptica” ;-) . La instrucción fork() devuelve un identificador -1 si ha habido algún error en la creación del hijo. Si la génesis (proceso de formación del proceso hijo) fue correcta, en la línea 10 tanto el proceso padre como el proceso hijo preguntan por el identificador devuelto por fork(). Aquí sí que hay una diferencia: al proceso padre, el sistema operativo le devolverá el PID de su proceso hijo. Al proceso hijo, el s.o. le devolverá un 0.

Así que la línea 11 sólo será ejecutada por el proceso hijo. Y casualidades de la vida, esa línea es un exit(0). Así que el proceso hijo acaba de morir. Pero el proceso padre sigue, línea 13, y se suspende durante 2 minutos, desentendiéndose del hijo que acaba de morir. De hecho, el padre podría intentar recoger el resultado devuelto por el hijo (un 0) sincronizándose mediante una llamada al sistema wait(&resultado) pero no lo hace, está durmiendo la mona durante 2 minutos :-) Así que el proceso hijo, está “muerto”, pero su “alma” (el resultado 0 que aún está disponible para el padre si éste lo quiere) aún no ha sido recibida por nadie. Así que el proceso hijo no ha terminado de morir “del todo”. Está en modo zombie.

Podemos comprobarlo ejecutando “prueba” y pidiendo la lista de procesos:

$ ./prueba

Verás algo como lo siguiente:

$ ps auxww| grep prueba
juanan   12851  0.0  0.0   1624   296 pts/1    S+   14:58   0:00 ./prueba
juanan   12852  0.0  0.0      0     0 pts/1    Z+   14:58   0:00 [prueba] <defunct>
juanan   12862  0.0  0.0   3236   792 pts/2    R+   14:58   0:00 grep prueba

La (Z) es indicador de modo zombie en el proceso. El padre (PID=12851) está durmiendo (S).

5 responses so far

5 Responses to “Por las noches veo zombies…”

  1. shakaranon 02 dic 2009 at 4:02 am

    Muy buena explicación de ejemplo y muy detallada. Hace falta más artículos así. Generalmente cuando esto se explica en clase te quedas con el concepto pero no llegas a comprenderlo bien, porque no ves un ejemplo. A nota informativa el “alma” o “pellejillo” del proceso en linux 2.6 se queda en la estructura task_struct del kernel.

    Saludos

  2. NetStorming » Procesos zombie en Unixon 03 dic 2009 at 5:26 am

    [...] que aún nunca he tocado son los procesos en Unix. Es por ello que al encontrar en DiarioLinux una excelente explicación del significado de un proceso zombie decidí compartirlo con ustedes. ¡Qué lo disfruten! [Translate] linux, mac, sistemas [...]

  3. txrlvon 03 dic 2009 at 4:28 pm

    Hace poco que he descubierto vuestra página y me parece muy interesante. Seguid así!!

  4. RaZieR~SarEon 04 dic 2009 at 1:51 am

    Muy buena explicación!!!

    Sigue así!

  5. Albertoon 11 feb 2010 at 11:23 am

    Perfecto, estaba en la biblioteca estudiando y me ha solucionado la vida ;)

Trackback URI | Comments RSS

Leave a Reply

« Back to text comment