UNIDAD I - ADMINISTRACION DE PROCESOS


Administración de Procesos

     
     La actividad más importante del núcleo del sistema operativo es implementar los procesos. Cada proceso es un procesador virtual en donde se ejecuta una aplicación o una herramienta del sistema operativo. El núcleo debe encargarse entonces de administrar los recursos del hardware del computador para que sean asignados convenientemente a los procesos.



Scheduling de Procesos


     En la mayoría de los sistemas computacionales existe un solo procesador real. Por lo tanto el núcleo debe asignar el procesador por turnos a los numerosos procesos que pueden estar activos. Hay distintas estrategias para asignar estos turnos, dependiendo del objetivo que se persiga.

     Por ejemplo en un sistema de multiprogramación se busca maximizar el tiempo de uso del procesador, mientras que en un sistema de tiempo compartido se busca atender en forma expedita a muchos usuarios que trabajan interactivamente. La asignación estratégica del procesador a los procesos es lo que se denomina scheduling de procesos. Es estratégica porque se intenta lograr algún objetivo particular como alguno de los que se mencionó más arriba y para ello se usan estrategias que pueden funcionar muy bien en determinados sistemas, pero muy mal en otros. La componente del núcleo que se encarga de esta labor se denomina scheduler del procesador.

     Además de scheduling de procesos, también se realiza scheduling de los accesos a disco y para ello existe un scheduler asociado a cada disco. Este scheduler ordena estratégicamente los mútiples accesos a disco de varios procesos con el fin de minimizar el tiempo de acceso. 
      

Estados de un proceso

     Mientras un proceso se ejecuta puede pasar por distintos estados. Estos estados se aprecian en la siguiente figura:





  • En creación: el núcleo está obteniendo los recursos que necesita el proceso para poder correr, como por ejemplo memoria o disco.
  • Corriendo (RUN): El proceso está en posesión del procesador, el que ejecuta sus instrucciones.
  • Esperando (WAIT): El proceso espera que se lea un sector del disco, que llegue un mensaje de otro proceso, que transcurra un intervalo de tiempo, que termine otro proceso, etc.
  • Listo (READY): El proceso está activo pero no está en posesión del procesador.
  • Terminado: El proceso terminó su ejecución, pero sigue existiendo para que otros procesos puedan determinar que terminó.


     Un proceso pasa de un estado a otro constantemente y varias veces por segundo. Por ejemplo cuando un proceso está corriendo el scheduler puede quitarle el procesador para entregárselo a otro proceso. En este caso el primer proceso queda listo para ejecutarse. Es decir en cualquier momento, el scheduler puede entregarle nuevamente el procesador y quedar corriendo. En este estado el proceso puede leer del terminal y por lo tanto quedar en espera de que el usuario ingrese algún texto. 
    
      El número exacto de estados depende del sistema. Por ejemplo en nSystem un proceso puede pasar por los siguientes estados:

  • READY: Elegible por el scheduler o corriendo (también incluye el estado RUN).
  • ZOMBIE: La tarea llamó nExitTask y espera nWaitTask. Este es equivalente al estado terminado.
  • WAIT_TASK: La tarea espera el final de otra tarea.
  • WAIT_REPLY: La tarea hizo nSend y espera nReply.
  • WAIT_SEND: La tarea hizo nReceive y espera nSend.
  • WAIT_READ: La tarea está bloqueada en un read.
  • WAIT_WRITE: La tarea está bloqueada en un write.

El descriptor de proceso

El descriptor de proceso es la estructura de datos que utiliza el núcleo para mantener toda la información asociada a un proceso. Ella contiene:

  • El estado del proceso: En creación, listo, corriendo, etc.
  • Registros del procesador: Aquí se guardan los valores del contador de programa, del puntero a la pila y de los registros del procesador real cuando el proceso abandonó el estado corriendo.
  • Información para el scheduler: Por ejemplo la prioridad del proceso, punteros de enlace cuando el descriptor se encuentra en alguna cola, etc.
  • Asignación de recursos: Memoria asignada, archivos abiertos, espacio de swapping, etc.
  • Contabilización de uso de recurso: Tiempo de procesador consumido y otros.
      El núcleo posee algún mecanismo para obtener el descriptor de proceso a partir del identificador del proceso, que es el que conocen los procesos.



Colas de Scheduling

      Durante la ejecución, un proceso pasa por numerosas colas a la espera de algún evento. Esto se puede observar en la siguiente figura:






     Mientras un proceso espera la obtención del procesador, este proceso permanece en una cola del scheduler del procesador. Esta cola puede estar organizada en una lista enlazada simple (cada descriptor de proceso tiene un puntero al próximo descriptor en la cola).

     Además de la cola del scheduler del procesador existen la colas de scheduling de disco. El proceso permanece en estas colas cuando realiza E/S.

    Cuando un proceso envía un mensaje síncrono a otro proceso que no está preparado para recibirlo, el primer proceso queda en una cola de recepción de mensajes en el descriptor del proceso receptor.

     Por último el proceso puede quedar en una cola del reloj regresivo, a la espera de que transcurra un instante de tiempo.



Cambio de contexto

     Cambio de contexto (context switch, task switch o process switch) es la acción que efectúa el scheduler cuando transfiere el procesador de un proceso a otro. Para realizar el cambio de contexto, el scheduler debe realizar diversas labores:
 
  • Resguardar/restaurar Registros.

     Cuando un proceso está corriendo, se utiliza el contador de programa, el puntero a la pila y los registros del procesador real. Al hacer el cambio de contexto, el nuevo proceso que toma el control del procesador usará esos mismos registros. Por ello es necesario resguardar los registros del proceso saliente en su descriptor de proceso. De igual forma, el descriptor del proceso entrante mantiene los valores que contenían los registros en el momento en que perdió el procesador. Estos valores deben ser restaurados en los registros reales para que el proceso funcione correctamente.

  • Cambiar espacio de direcciones virtuales.

     El espacio de direcciones del proceso saliente no es el mismo del espacio de direcciones del proceso entrante. En el capítulo sobre administración de memoria veremos como se logra el cambio de espacio de direcciones virtuales.

  • Contabilización de uso de procesador.

     Usualmente, el núcleo se encarga de contabilizar el tiempo de procesador que utiliza cada proceso. Una variable en el descriptor de proceso indica el tiempo acumulado. En cada cambio de contexto el núcleo consulta un cronómetro que ofrece el hardware de cada computador. El scheduler suma el tiempo transcurrido desde el último cambio contexto al tiempo acumulado del proceso saliente.

     Estas labores del scheduler consumen algo de tiempo de procesador y por lo tanto son sobrecosto puro. Cada cambio de contexto puede significar unos pocos microsegundos en los procesadores de hoy en día, pero podía llegar a ser de hasta un milisegundo en los años 80 y por eso se consideraba crítico evitar los cambios de contexto que no fuesen imprescindibles.

     Normalmente la componente más cara en tiempo de procesador es la del cambio de espacio de direcciones virtuales. Ahí radica el origen del nombre de procesos livianos o pesados. Como los procesos livianos comparten el mismo espacio de direcciones no es necesario cambiarlo durante un cambio de contexto. Por lo tanto pueden ser  implementados más eficientemente. En este caso el peso de un proceso corresponde al tiempo de procesador que se consume al realizar un cambio de contexto.
     A mayor tiempo, mayor peso.










Anterior          Siguiente

No hay comentarios.:

Publicar un comentario