.. include:: ../../my-header_2.txt

Estados de un proceso UNIX/Linux
---------------------------------

Para entender mejor el comportamiento de un proceso en un sistema operativo se recurre a un modelo de estados sobre el que se definen transiciones. Todo ello se representa con un grafo. Linux, y en general el modelo UNIX, no es una excepción. La orden ``ps a`` nos muestra el estado de cada uno de nuestros procesos en ese momento, básicamente utilizando una letra mayúscula que indica la inicial del estado (R, S, etc). Como puedes comprobar en el ``man``, hay media docena de estados básicos. 

Un proceso atraviesa una serie de estados desde su creación hasta su muerte. La transición entre uno u otro estado ocurre a consecuencia de una llamada al sistema o de un evento. Por ejemplo, el proceso lanzador secuencial que has construido puede representarse por el siguiente grafo de transiciones de estado:


  .. image:: ../../_static/Figuras/Estados_Linux.jpg
       :align: center
       :width: 600 px


El proceso se ha creado a consecuencia de una llamada ``fork()`` ejecutada por el *shell*, entrando en estado *R*, que significa que el proceso está listo para ejecutarse. Cuando tu lanzador ha ejecutado ``wait()`` para esperar la terminación de un proceso hijo, pasa a estado *S*, que traduciremos como *bloqueado*. El lanzador seguirá en este estado hasta que la terminación del hijo produzca la señal ``SIGCHLD``, que hace que el lanzador pueda seguir ejecutándose. Cuando termina, pasa a estado *Z*, de *zombie*, o finalizado. 

¿Por qué se necesita un estado para representar un proceso que ha finalizado? ¿Por qué no se elimina el proceso directamente? La respuesta se puede deducir a partir de la especificación de ``wait()``. Mediante esta llamada, el proceso padre recibe del hijo su identificador y el código de retorno que el hijo ha pasado como parámetro de ``exit()`` al terminar. Por lo tanto, Linux tiene que almacenar estos recursos del hijo hasta que el padre los recoge en ``wait()``. El término *zombie* es realmente elocuente…

El estado *bloqueado* es múltiple, ya que son muchas las situaciones de bloqueo: entrada/salida, tiempo (``pause()``), y otras muchas. Como puedes comprobar en el ``man``, Linux considera otros estados análogos a *S*, en los que no vamos a entrar aquí y que podríamos asimilar a *bloqueado*.


.. include:: ../../my-footer_2.txt

