Las tareas asociadas con la coordinación de la ejecución de los procesos son gestionadas por el planificador y el despachador dentro del núcleo del sistema operativo. El planificador mantiene un registro de los procesos presentes en la computadora y se encarga de introducir nuevos procesos en dicho registro y de eliminar de él los procesos completados. Así, cuando un usuario solicita la eje- cución de una aplicación, es el planificador el que añade la ejecución de dicha aplicación al conjunto de procesos actuales.
Para poder controlar todos los procesos existentes, el planificador man- tiene en la memoria principal un bloque de información denominado tabla de procesos. Cada vez que se solicita la ejecución de un programa, el planificador crea una nueva entrada para dicho proceso en la tabla de procesos. Esta entrada contiene informaciones tales como el área de memoria asignada al pro- ceso (obtenida del gestor de memoria), la prioridad del proceso y si el proceso está listo o a la espera. Un proceso está listo si se encuentra en un estado en el que puede continuar progresando; estará a la espera si su progreso está actual- mete detenido hasta que tenga lugar algún suceso externo, como la termina- ción de una operación de escritura en almacenamiento masivo, la pulsación de una tecla del teclado o la llegada de un mensaje enviado por otro proceso.
El despachador es el componente del núcleo que supervisa la ejecución de los procesos planificados. En un sistema de tiempo compartido/multitarea, esta tarea se lleva a cabo mediante multiprogramación; es decir, dividiendo el tiempo en cortos segmentos, cada uno de los cuales se denomina franja tem- poral (que típicamente dura unos milisegundos o unos microsegundos), y luego conmutando la atención del procesador entre los distintos procesos, a medida que se permite que cada uno de ellos se ejecute durante una franja temporal (Figura 3.6). El procedimiento de cambiar de un proceso a otro se denomina conmutación de procesos (o cambio de contexto).
Cada vez que el despachador concede una franja temporal a un proceso, inicia un circuito temporizador que indicará el final de la franja temporal, gene- rando una señal conocida como interrupción. El procesador reacciona a esta señal de interrupción de forma bastante similar a como nosotros reaccionamos cuando nos interrumpen en mitad de una tarea: dejamos de hacer lo que estu- viéramos haciendo, anotamos en qué punto de la tarea nos encontramos (para poder volver a ella posteriormente) y atendemos a la entidad que nos está inte- rrumpiendo. Cuando el procesador recibe una señal de interrupción, completa su ciclo de máquina actual, anota su posición dentro del proceso actual y comienza a ejecutar un programa, denominado rutina de tratamiento de
interrupciones, que está almacenado en una posición predeterminada de la memoria principal. Esta rutina de tratamiento de interrupciones forma parte del despachador y se encarga de describir cómo debe responder el despachador a la señal de interrupción.
Por tanto, el efecto de la señal de interrupción es el de desalojar al proceso actual y transferir de nuevo el control al despachador. En ese momento, el des- pachador selecciona en la tabla de procesos aquel proceso que tenga la mayor prioridad entre todos los procesos que estén listos (según haya determinado el planificador); a continuación, el despachador reinicia el circuito de tempori- zación y permite al proceso seleccionado que comience con su franja temporal.
Conmut. de proceso Conmut. de proceso Conmut. de proceso Conmut. de proceso Proc Interrupción Proceso B Franja temporal Interrupción so A Tiempo Interrupción Proceso A Franja temporal Interrupción Proceso A Franja temporal Interrupción Proceso B Franja temporal Conmut. de proceso
Figura 3.6 Multiprogramación entre el proceso A y el proceso B.
Interrupciones
El uso de interrupciones para la terminación de franjas temporales como se describe en el texto, es tan solo una de las múltiples aplicaciones del sistema de interrupciones de una computadora. Existen muchas situaciones distintas en las que se genera una señal de inte- rrupción, teniendo cada una de las posibles señales de interrupción su propia rutina de tratamiento de la misma. De hecho, las interrupciones proporcionan una importante herra- mienta para la coordinación de las acciones de una computadora con su entorno. Por ejem- plo, tanto hacer clic con el ratón como pulsar una tecla del teclado generan señales de interrupción que hacen que el procesador deje a un lado su actividad actual y atienda a la causa de la interrupción.
Para gestionar la tarea de reconocer y responder a las interrupciones entrantes, a las distintas señales de interrupción se les asignan prioridades, de modo que se pueda atender primero a las tareas más importantes. La interrupción de más alta prioridad suele estar aso- ciada con un fallo de la alimentación eléctrica. Dicha señal de interrupción se genera si de manera inesperada se corta el suministro de energía eléctrica a la computadora. La rutina de interrupción asociada dirige al procesador a través de una serie de tareas básicas de “salva- guarda” durante los escasos milisegundos disponibles antes de que el nivel de tensión caiga por debajo del nivel mínimo que garantiza el correcto funcionamiento de la computadora.
El aspecto clave para el buen funcionamiento de un sistema de multipro- gramación es la capacidad de detener un proceso y reanudarlo posteriormente. Si nos interrumpen mientras estamos leyendo un libro, nuestra capacidad de continuar leyendo posteriormente dependerá de nuestra capacidad de recordar el punto del libro en el que nos encontrábamos, así como la información que habíamos acumulado hasta ese punto. En resumen, debemos poder crear de nuevo el entorno que existía inmediatamente antes de la interrupción.
En el caso de un proceso, el entorno que hay que recrear es el estado del proceso que, como ya hemos mencionado, incluye el valor del contador de pro- grama, así como el contenido de los registros y de las celdas de memoria perti- nentes. Los procesadores diseñados para sistemas de multiprogramación incorporan la tarea de guardar esta información como parte de la reacción del procesador a la señal de interrupción. Estos procesadores también tienden a disponer de instrucciones del lenguaje máquina específicamente pensadas para recargar un estado previamente guardado. Dichas características simplifi- can la tarea del despachador cuando se realiza una conmutación de procesos y constituyen un ejemplo de cómo el diseño de los procesadores modernos está influenciado por las necesidades de los sistema operativos actuales.
Para finalizar, es preciso observar que el uso de técnicas de multiprogra- mación permite incrementar la eficiencia global de una máquina. Esto puede resultar anti-intuitivo, ya que la conmutación entre procesos requerida por la multiprogramación introduce una cierta sobrecarga de carácter meramente administrativo. Sin embargo, sin la multiprogramación cada proceso se ejecuta- ría hasta completarse antes de que el siguiente proceso pudiera comenzar, lo que significa que todo el tiempo que el proceso invierte en esperar a que los dispositivos periféricos completen tareas o a que un usuario haga su siguiente solicitud se desperdicia. La multiprogramación permite que estos tiempos muertos sean aprovechados por otros procesos. Por ejemplo, si un proceso eje- cuta una solicitud de E/S, como por ejemplo una solicitud para extraer datos de un disco magnético, el planificador actualizará la tabla de procesos para reflejar el hecho de que el proceso está esperando a que tenga lugar un suceso externo. A su vez, el despachador dejará de conceder franjas temporales a dicho pro- ceso. Posteriormente (quizá varios centenares de milisegundos después), cuando se haya completado la solicitud de E/S, el planificador actualizará la tabla de procesos para indicar que el proceso está listo, con lo que ese proceso volverá a competir de nuevo por el uso de las franjas temporales. En resumen, se podrá ir progresando en la realización de estas tareas mientras que se com- pleta la solicitud de E/S, de modo que todo el conjunto de tareas se completará en menos tiempo que si se ejecutaran de manera secuencial.
149 3.3 Coordinación de las actividades de la máquina
Cuestiones y ejercicios
1. Resuma la diferencia entre un programa y un proceso.
2. Resuma los pasos que lleva a cabo el procesador cuando se produce una interrupción.
3. En un sistema de multiprogramación, ¿cómo se puede hacer que los proce- sos de alta prioridad se ejecuten más rápidamente que los demás?
3.4
Gestión de la competición entre procesos
Una tarea importante de un sistema operativo es la asignación de los recursos de la máquina a los procesos del sistema. Aquí, utilizamos el término recurso en un sentido amplio, para incluir tanto los dispositivos periféricos de la máquina como las funcionalidades de la propia máquina. El administrador de archivos asigna el acceso a los archivos, asigna el espacio de almacenamiento masivo para la construcción de archivos nuevos; el gestor de memoria asigna espacio de memoria; el planificador asigna el espacio dentro de la tabla de pro- cesos y el despachador asigna las franjas temporales de procesamiento. Al igual que sucede con muchos otros problemas dentro de los sistemas de com- putación, esta tarea de asignación puede parecer simple a primera vista. Sin embargo, por debajo de la superficie se encuentran diversas sutilezas que pue- den hacer que las operaciones sean incorrectas en un sistema mal diseñado. Recuerde que una máquina no piensa por sí misma, sino que se limita a seguir las instrucciones que le damos. En consecuencia, para construir sistemas ope- rativos fiables es necesario desarrollar algoritmos que tengan en cuenta todas las posibles contingencias, independientemente de lo improbables que pue- dan parecer.