martes, septiembre 26, 2006

La dura vida de los procesos

Ya adelanté hace mucho tiempo que la vida de los programas no es nada agradable a pesar de las apariencias, y de hecho puede llegar a ser bastante surrealista. Hoy aprenderemos a solidarizarnos con estas pobres criaturas. Para seguir leyendo interesa que recuerde qué es un proceso: básicamente, es la forma en que nos referiemos un programa que esté ejecutándose en el sistema. Las diferencias son sutiles pero importantes.

Y por favor, sea prudente: esta entrada puede herir su sensibilidad... ;-)

Dando a luz

¿Cómo empieza la vida de un proceso? Pues como la de (casi) todo el mundo: con un parto. En efecto, los procesos nacen de otros procesos. No me estoy riendo de ustedes, es la pura verdad: muchos programas crean subprocesos para que éstos se encarguen de ciertas tareas auxiliares y aprovechar la famosa simultaneidad. Se trata de una forma de entender la vida bastante interesada: tengo hijos para que me ayuden en el trabajo que no quiero o no puedo realizar...

A su vez, estos hijos tendrán su descendencia, y de esta manera los procesos formarán una bonita familia feliz en memoria. Toda estirpe tiene un origen, y es lógico pensar que tendrá que existir un proceso "patriarca" que engendre al resto. Cuando el sistema arranca, se crea un proceso 0, cuya función es engendrar al proceso 1, que recibe el nombre de “Init”. Este proceso, el padre de todos, se encarga de iniciar el sistema correctamente, teniendo hijos que asumirán las diferentes funciones del sistema y tendrán más hijos. A partir de este momento, todos los programas que se ejecuten serán, de alguna manera, descendientes de Init, que permanecerá siempre en el sistema, como el capitán de un barco.

Hay que hacer una precisión. Técnicamente los procesos no tienen hijos. No. Los procesos se clonan a sí mismos (esto empieza a ser surrealista). Es decir, Init crea un clon de sí mismo y le manda atender una función del sistema. Aunque son iguales en su origen, quedan completamente diferenciados y el Init original conserva cierto poder sobre la copia, con lo que podemos considerar que es su padre. Para que quede claro, es igual que el capítulo de Los Simpsons en que Homer crea clones de sí mismo a los que manda a hacer el trabajo sucio.

Una vida peligrosa

Después de este parto accidentado, la vida del proceso transcurrirá con mayor o menor interés, desempeñando la función que su padre le encomendó. En todo ese tiempo, puede ser expulsado momentáneamente de la ejecución, puede quedarse dormido en espera de algún evento que le despierte nuevamente... tendrá, en general, una existencia aparentemente relajada.

Y digo aparentemente porque en todo este tiempo, una enorme cantidad de peligros amenazan su existencia... un proceso puede morir por muchos motivos:
  • Puede ser por muerte natural, en la que llega al final de su tarea asignada. Como no tiene nada más que hacer, se muere.
  • También puede suicidarse si encuentra una anomalía que no sabe resolver por sí mismo.
  • Puede ser matado por otro proceso, siempre que el proceso asesino tenga “licencia para matar”, que se traduce en que sea su padre o un proceso del administrador.
  • Puede ser matado por el sistema operativo, por varios motivos: intentó realizar una operación no admitida, cometió un error, no tenía memoria suficiente, acaparaba un determinado recurso... cualquier momento es bueno para morir.
El mecanismo por el que un proceso elimina a otro es muy interesante. Si un proceso padre quiere matar a su hijo (cosa muy común por otro lado), le pide primero que se muera por las buenas, porque puede que el hijo quiera hacer algo antes de morirse.

El bondadoso padre le dice “mira, te voy a matar, así que haz lo que tengas que hacer y haz el favor de morirte”. Eso equivale a enviarle una señal, llamada SIGTERM, que quiere decir “termina”. Si el hijo sigue en ejecución pasado un tiempo, el padre cumplirá sus amenazas y le matará, enviándole la señal SIGKILL (unos cachondos mentales, los del Unix...)

El hijo zombie

El objetivo final de la vida de un proceso hijo es informar a su padre de que terminó su trabajo con éxito, y lo es tanto que un proceso no morirá hasta haber informado de que lo hizo. En principio no hay problema, pero ¿qué pasa si un proceso padre muere y el hijo continúa funcionando? Cuando el hijo termine sus tareas, no podrá informar a su padre de que ha hecho los deberes, y como un chico obediente esperará a su padre (que no va a volver jamás, qué dura es esta vida...).

En este caso, el proceso huérfano sigue vivo pero no tiene nada que hacer, así que decimos que el proceso está Zombie. La cosa se pone macabra. ¿Quién se hace cargo de esta pobre criatura? Pues el proceso Init hace de padre adoptivo, recoge lo que el hijo tenía que decir, lo desecha (porque realmente no le vale para nada) y acto seguido exorciza al zombie vía SIGKILL y lo manda al descanso eterno.

Divertido ¿eh?

8 Comentarios:

A las 3:41 a. m., Anonymous ArTo escribió... (¡Gracias, Anonymous ArTo!)

Genial y muy divertida explicación. :D

 
A las 7:31 a. m., Blogger Misslucifer escribió... (¡Gracias, Blogger Misslucifer!)

Vaya drama...

 
A las 2:20 p. m., Anonymous Treiral_ escribió... (¡Gracias, Anonymous Treiral_!)

Grandiosa la entrada!! :DDD

 
A las 4:23 p. m., Blogger Watttana escribió... (¡Gracias, Blogger Watttana!)

Eso es en sistemas basados en Unix.
Aunque que desde el WindowsNt los de Mocosoft digan que también lo hace, quien no se ha encontrado con un proceso Indestructible??
Con superpoderes, que ni aunque seas el amo de la creación local (Administrador en modo a prueba de fallos), te deja terminar el proceso. Y, generalmente, los virus usan esta magnífica cualidad del s.o. para hacerse invulnerables a los antivirus.

 
A las 10:03 p. m., Anonymous Flup escribió... (¡Gracias, Anonymous Flup!)

Me encanta! Ahora comprendo un poco mas a los procesos, pero me dara pena utilizar el ordenador. Crear tantas vidas para destruirlas al momento...Mola! xD

 
A las 1:56 a. m., Anonymous Anónimo escribió... (¡Gracias, Anonymous Anónimo!)

Watttana dijo...

Eso es en sistemas basados en Unix.
Aunque que desde el WindowsNt los de Mocosoft digan que también lo hace, quien no se ha encontrado con un proceso Indestructible??
Con superpoderes, que ni aunque seas el amo de la creación local (Administrador en modo a prueba de fallos), te deja terminar el proceso. Y, generalmente, los virus usan esta magnífica cualidad del s.o. para hacerse invulnerables a los antivirus.



El "usuario" System tiene privilegios sobre Administrador, por lo que ciertos procesos no es posible destruirlos. Existe un truco para ser System en XP usando el comando at.

Paco

 
A las 10:01 a. m., Blogger Watttana escribió... (¡Gracias, Blogger Watttana!)

Y luego dicen que la consola de Linux es oscura...
En que libro de hechizos has encontrado ese comando??
A quien hay que invocar para saberlos??

je je je

---------------------
Nunca dejaré de alegrarme de haber e-migrado.

 
A las 12:33 p. m., Anonymous cirne escribió... (¡Gracias, Anonymous cirne!)

Muy buen artículo, pero la parte del hijo zombie tiene alguna inexactitud.

Cuando dices "...un proceso no morirá hasta haber informado de que lo hizo. (informar de que terminó su trabajo con éxito)" no es del todo cierto.
El proceso muere pero no puede desaparecer del sistema ("vaga en pena" :-) ) hasta poder informar a su padre.

Por lo tanto, el proceso NO sigue vivo.

Finalmente, el proceso Init no envía un SIGKILL al proceso adoptado ya que éste ya ha muerto. El "exorcismo" se produce vía la llamada al sistema wait (o waitpid, ...) como haría cualquier padre responsable.

 

Recuerda que nos hemos mudado a nosololinux.com

<< Home