Sistemas operativos – Estados de los procesos

Para que un programa se ejecute, se debe crear un proceso para dicho programa. Desde el punto de vista del procesador, él ejecuta instrucciones de su repertorio de instrucciones en una secuencia dictada por el cambio de los valores del registro contador de programa. A lo largo del tiempo, el contador de programa puede apuntar al código de diferentes programas que son parte de diferentes procesos. Desde el punto de vista de un programa individual, su ejecución implica una secuencia de instrucciones dentro de dicho programa.

Se puede caracterizar el comportamiento de un determinado proceso, listando la secuencia de instrucciones que se ejecutan para dicho proceso. Esta lista se llama traza de proceso. Se puede caracterizar el comportamiento de un procesador mostrando como las trazas de varios procesos se entrelazan.

Por ejemplo, imaginemos el despliegue en memoria de tres procesos. Para simplificar la exposición, se asume que dichos procesos no usan memoria virtual; por tanto, los tres procesos están representados por programas que residen en memoria principal. De manera adicional, existe un pequeño programa activador (dispatcher) que intercambia el procesador de un proceso a otro.

procesosenmemoriaEn la siguiente imagen, podemos ver las trazas de cada uno de los procesos en los primeros instantes de ejecución. Se muestran las 12 primeras instrucciones ejecutadas por los procesos A y C. El proceso B, ejecuta 4 instrucciones y se asume que la cuarta instrucción invoca una operación de E/S, a la cual el proceso debe esperar.

trazasabcVeamos qué ocurre desde el punto de vista del procesador. En la siguiente imagen, se muestran las trazas entrelazadas, resultado de los 52 primeros ciclos de ejecución. En este ejemplo, el sistema operativo hará uso del algoritmo Round-Robin y sólo dejará que un proceso se ejecute durante 6 ciclos de instrucción, después de los cuales se interrumpe. Este mecanismo previene que un sólo proceso monopolice el uso del tiempo del procesador. Las primeras 6 instrucciones del proceso A se ejecutan seguidas de una alarma de temporización (time-out) y de la ejecución de cierto código del activador, que ejecuta 6 instrucciones antes de devolver el control al proceso B. Cuando se ejecuten 4 instrucciones, el proceso B solicita una operación de E/S, para la cual debe esperar. Por tanto, el procesador deja de ejecutar el proceso B y pasa a ejecutar el proceso C, por medio del activador. Después de otra alarma de temporización, el procesador vuelve al proceso A. Cuando este proceso llega a su temporización, el proceso B aún estará esperando que se complete su operación de E/S, por lo que el activador pasa de nuevo el control al proceso C.

ejecucionabc

Modelo de procesos de dos estados

La responsabilidad principal del sistema operativo es controlar la ejecución de los procesos. Esto incluye determinar el patrón de entrelazado para la ejecución y asignar recursos a los procesos. El primer paso en el diseño de un sistema operativo para el control de procesos es describir el comportamiento que se desea que tengan los procesos.

Se puede construir el modelo más simple posible, observando que en un instante dado, un proceso está siendo ejecutado por el procesador o no. En este modelo, un proceso puede estar en dos estados: Ejecutando o No Ejecutando. Cuando el sistema operativo crea un nuevo proceso, crea el bloque de control de proceso para el nuevo proceso e inserta dicho proceso en el sistema en estado No Ejecutando. El proceso existe, y es conocido por el sistema operativo, y está esperando su oportunidad de ejecutar. Cada poco tiempo, el proceso que está actualmente en ejecución se interrumpirá y una parte del sistema operativo, el activador, seleccionará otro proceso a ejecutar. El proceso saliente pasará del estado Ejecutando a No Ejecutando y pasará a Ejecutando un nuevo proceso.

En este modelo simple se puede apreciar algo del diseño de los elementos del sistema operativo. Cada proceso debe representarse de tal manera que el sistema operativo pueda seguirle la pista. Es decir, debe haber información correspondiente a cada proceso, incluyendo el estado actual y su localización en memoria. Esto es el bloque de control de programa. Los procesos que no están ejecutando deben estar en una cola, esperando su turno de ejecución. Existe una sola cola cuyas entradas son puntes al BCP de un proceso en particular. Alternativamente, la cola debe consistir en una lista enlazada de bloques de datos, en la cual cada bloque representa un proceso.

Un proceso que se interrumpe se transfiere a la cola de procesos en espera. En el caso de que el proceso finalice su ejecución o haya sido abortado, se descarta, sale del sistema y el activador elige un proceso de la cola para ejecutar.

modelo2estados

Modelo de proceso de cinco estados

Si todos los procesos estuviesen siempre preparados para ejecutar, las gestión de las colas sería más fácil de manejar. La cola es una lista de tipo FIFO y el procesador opera siguiendo una estrategia cíclica (round-robin) sobre todos los procesos disponibles. Sin embargo, esta implementación es inadecuada: algunos procesos que están en el estado de No Ejecutando están listos para ejecutar, mientras que otros están bloqueados, esperando a que se complete una operación de E/S. Por tanto, utilizando una única cola, el activador no puede seleccionar únicamente los procesos que lleven más tiempo en la cola. En su lugar, debería recorrer la lista buscando los procesos que no estén bloqueados y que lleven en la cola más tiempo.

Una forma más óptima para manejar esta situación es dividir el estado en No Ejecutando en dos estados: Listo y Bloqueado. Para gestionarlo correctamente, se han añadido dos estados adicionales que serán bastante útiles. Estos cinco estados son:

  • Ejecutando: El proceso está actualmente en ejecución.
  • Listo: Un proceso que se prepara para ejecutar cuando tenga oportunidad.
  • Bloqueado: Un proceso que no puede ejecutar hasta que se cumpla un evento determinado o se complete una operación E/S.
  • Nuevo: Un proceso que se acaba de crear y que aún no ha sido admitido en el grupo de procesos ejecutables por el sistema operativo. Suele ser un proceso que aún no se ha cargado en memoria principal aunque su BCP sí ha sido creado.
  • Terminado: Un proceso que ha sido liberado del grupo de procesos ejecutables por el sistema operativo, debido a que ha sido detenido o que ha sido abortado por alguna razón.

modelo_5_estados

Estos son los tipos de eventos que llevan a cada transición de estado para cada proceso:

  • Null -> Nuevo: Se crea un proceso nuevo para ejecutar un programa.
  • Nuevo -> Listo: El sistema operativo mueve a un proceso del estado Nuevo al estado Listo cuando éste se encuentre preparado para ejecutar un nuevo proceso. La mayoría de sistemas fijan un límite basado en el número de procesos existentes o en la cantidad de memoria virtual que se podrá utilizar por parte de los procesos existentes. Este límite garantiza que no haya demasiados procesos activos y que se degrade el rendimiento del sistema.
  • Listo -> Ejecutando: Cuando llega el momento de seleccionar un nuevo proceso para ejecutar, el sistema operativo selecciona uno de los procesos que se encuentren en estado Listo. Esta tarea la realiza el planificador.
  • Ejecutando -> Saliente: El proceso que actualmente está en ejecución se finaliza por parte del sistema operativo, tanto si ha finalizado su ejecución o si ha sido abortado por algún motivo.
  • Ejecutando -> Listo: Esta transición se suele producir cuando el proceso que está en ejecución ha alcanzado el máximo tiempo posible de ejecución de forma ininterrumpida. Prácticamente todos los sistemas multiprogramados imponen este tipo de restricción de tiempo.
  • Ejecutando -> Bloqueado: Un proceso se pone en estado Bloqueado si solicita algo por lo que debe esperar. Pueden ser muchos los motivos de esta transición: solicitar una operación de E/S, solicitar una sección de memoria compartida que no está inmediatamente disponible, comunicarse con otro proceso y bloquearse hasta que el otro proceso le proporcione los datos solicitados, etc.
  • Bloqueado -> Listo: Un proceso en estado Bloqueado se mueve a Listo cuando sucede el evento por el cual esperaba.
  • Listo -> Saliente: Para simplificar, esta transición no se muestra en la imagen del modelo de cinco estados. Un padre puede terminar la ejecución de un proceso hijo en cualquier momento. De igual manera, si el padre termina, todos los procesos hijos asociados al padre pueden finalizarse.
  • Bloqueado -> Saliente: Igual que el caso anterior.

Este esquema se suele aplicar mediante el uso de dos colas. Una para los procesos Listos y otra para los procesos Bloqueados. Cada proceso admitido por el sistema se coloca en la cola de Listos. Cuando llega el momento de seleccionar un proceso para ejecutar, se selecciona uno de la cola de Listos. En ausencia de un esquema de prioridad, esta cola se puede manejar mediante FIFO (first-in-first-out). Cuando el proceso termina de usar el procesador, o bien finaliza, o bien se coloca en la cola de Listos o Bloqueados, dependiendo de las circunstancias. Cuando sucede un evento esperado por algún proceso de la cola de Bloqueados, este proceso se mueve a la cola de Listos para ser ejecutado. Recorrer la cola de Bloqueados en busca del proceso que espera el evento, puede ser una difícil tarea para el sistema operativo, por lo que sería mucho más eficiente una cola de Bloqueados por cada evento que pueda darse. De la misma manera, si el sistema funciona en base a prioridades, sería ideal tener una cola de procesos Listos por cada nivel de prioridad que exista.

Procesos suspendidos y la necesidad de swapping

Los tres principales estados descritos (Listo, Ejecutando y Bloqueado) proporcionan una forma sistemática de modelizar el comportamiento de los procesos y diseñar la implementación del sistema operativo. Se han construido algunos sistemas operativos usando este esquema de tres estados.

Sin embargo, existe una buena justificación para añadir otros estados al modelo. Para ver ese beneficio de nuevos estados, imaginemos un sistema que no utiliza memoria virtual, de forma que cada proceso que se ejecute debe cargarse completamente en memoria principal. La razón de toda esta compleja maquinaria es debido a que las operaciones de E/S son más lentas que los procesos de cómputo y el procesador en un sistema monoprogramado estaría sin realizar trabajo alguno la mayor parte del tiempo. La diferencia de velocidad entre el procesador y la E/S es tal que sería muy habitual que todos los procesos en memoria se encontrasen a espera de dichas operaciones. Por lo que, es probable que incluso en un sistema multiprogramado, el procesador no realice ningún trabajo la mayor parte del tiempo.

La solución a este problema es el swapping (memoria de intercambio), que implica mover parte o todo el proceso de memoria principal al disco. Cuando ninguno de los procesos en memoria principal se encuentra en estado Listo, el sistema operativo intercambia uno de los procesos bloqueados a disco, en la cola de Suspendidos. Esta cola es una lista de procesos existentes que han sido temporalmente expulsados de memoria o suspendidos. El sistema operativo trae otro proceso de la cola Suspendidos o responde a una solicitud de un nuevo proceso. La ejecución continúa con los nuevos procesos que han llegado.

El swapping es también una operación de E/S, por lo que existe el riesgo de empeorar el problema, pero habitualmente el acceso a disco es bastante rápido en sistemas actuales, por lo que termina mejorando el rendimiento. Con el uso del swapping, debe añadirse un nuevo estado al modelo de comportamiento de procesos: el estado Suspendido. Es probable que todos los procesos en memoria principal estén bloqueados en algún momento determinado. En ese caso, el sistema operativo puede suspender un proceso poniéndolo en el estado Suspendido y transfiriéndolo a disco. El espacio liberado puede ser usado por un nuevo proceso.

Cuando el sistema operativo realiza la operación de swap, tiene dos opciones para seleccionar un nuevo proceso para traerlo a memoria principal. Puede admitir un proceso que se haya creado o puede traer un proceso que anteriormente se encontrase en estado Suspendido. Puede parecer lógico traer a memoria un proceso que estuviese suspendido, pero existe un dificultad: los procesos que fueron suspendidos se encontraban previamente en estado Bloqueado. No sería lo ideal traer un proceso bloqueado a memoria ya que puede no estar listo para continuar ejecutándose.

De esta forma, necesitamos replantear este aspecto del diseño. Hay dos conceptos independientes: si un proceso está esperando a un evento (Bloqueado o no) y si un proceso está transferido de memoria a disco (Suspendido o no). Para describir estas combinaciones necesitamos cuatro estados:

  • Listo: El proceso está en memoria principal disponible para su ejecución.
  • Bloqueado: El proceso está en memoria principal y esperando un evento.
  • Bloqueado/Suspendido: El proceso está en almacenamiento secundario y esperando un evento.
  • Listo/Suspendido: El proceso está en almacenamiento secundario pero está disponible para su ejecución tan pronto como sea cargado en memoria principal.

Las nuevas transiciones más importantes son las siguientes:

  • Bloqueado -> Bloqueado/Suspendido: Si no hay procesos listos, entonces al menos uno de los procesos bloqueados se transfiere al disco para hacer espacio para otro proceso que no encuentra bloqueado. Esta transición puede realizarse incluso si hay procesos listos disponibles, si el sistema operativo determina que el proceso actualmente en ejecución o los procesos listos que desea ejecutar requieren más memoria principal para mantener un rendimiento adecuado.
  • Bloqueado/Suspendido -> Listo/Suspendido: Un proceso en el estado Bloqueado/Suspendido se mueve al estado Listo/Suspendido cuando sucede un evento al que estaba esperando. Esto requiere que la información de estado de un proceso suspendido sea accesible para el sistema operativo.
  • Listo/Suspendido -> Listo: Cuando no hay más procesos listos en memoria principal, el sistema operativo necesitará traer uno para continuar la ejecución. Puede darse el caso de que un proceso en estado Listo/Suspendido tenga mayor prioridad que cualquiera de los procesos en estado Listo. En este caso, el sistema operativo puede haberse diseñado para determinar que es más importante traer un proceso de mayor prioridad que minimizar el efecto del swapping.
  • Listo -> Listo/Suspendido: Normalmente, el sistema operativo preferirá suspender procesos bloqueados antes que procesos listos, porque un proceso Listo se puede ejecutar en ese momento, mientras que un proceso Bloqueado ocupa espacio en memoria y no se puede ejecutar. Sin embargo, puede ser necesario suspender un proceso Listo si con ello se consigue liberar un bloque suficientemente grande de memoria. También el sistema operativo puede decidir suspender un proceso Listo de baja prioridad antes que un proceso Bloqueado de alta prioridad, si se cree que el proceso Bloqueado estará pronto Listo.
Anuncios
Publicado en Sistemas operativos, Varios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Sobre mi…

Soy Técnico en Explotación de Sistemas Informáticos y Técnico Superior en Administración de Sistemas Informáticos en Red. Actualmente estudiando el Grado de Ingeniería Informática en la Universidad de Córdoba (España).

Enamorado de la ciencia en general y de la computación en particular.

Música: Heavy, Rock, Celta, New Age, Electrónica, etc...
Libros:Isaac Asimov, Richard Dawkins, Stephen Hawking, Carl Sagan...

Estoy interesado en la programación de videojuegos. Políticamente de izquierdas, escéptico y ateo. En definitiva, mala gente.

Sígueme en Twitter

Introduce tu dirección de correo electrónico para seguir este Blog y recibir las notificaciones de las nuevas publicaciones en tu buzón de correo electrónico.

Únete a otros 24 seguidores

Usa Linux Mint
The Bit Developer Box
A %d blogueros les gusta esto: