2.1.7 Apéndice II: Gestión de interrupciones

 

Comencemos este apartado con una clasificación de los tipos de interrupción. Aunque algunos autores utilizan criterios distintos, nosotros veremos las siguientes:

 Un usuario realiza una llamada al sistema, concretamente una instrucción trampa (a veces, a las llamadas al sistema se les llaman interrupciones software).

 En un proceso de usuario se da una condición de error (por ej., una división entre cero). Esta condición puede tratarse como una "interrupción interna" generada por el procesador y ser gestionada en primera instancia por una rutina de interrupción. A estas condiciones de error algunas veces se les llama excepciones.

 Se intenta ejecutar un instrucción reservada estando en modo usuario. Ello puede considerarse como un tipo particular de error y tratarse, pues, como en b).

 Un controlador de un dispositivo de E/S genera una interrupción para indicar el fin de la E/S.

La ocurrencia de cualquiera de estas circunstancias, incluida las interrupciones, provoca el cambio automático del procesador de modo usuario a modo supervisor.

El controlador de interrupciones de primer nivel -FLIH, del inglés First-Level Interrupt Handler- es la parte del sistema operativo responsable de proporcionar la respuesta adecuada a las señales procedentes tanto del exterior de la CPU (interrupciones de un controlador) como de dentro del procesador (excepciones y llamadas al sistema). La misión del FLIH es doble: a) determinar el origen de las interrupciones y b) iniciar el servicio de las mismas.

 

Ya hemos visto que era el mecanismo de interrupción del ordenador el responsable de salvar al menos el valor del contador de programa del proceso interrumpido. Hay que asegurar también que se salven lo otros registros que vaya a emplear el FLIH y que estuviesen siendo utilizados por el proceso interrumpido. Si esto no lo realiza el mecanismo de interrupción, debe ser la primera operación que realice el FLIH. Como que éste es un programa relativamente sencillo, definido además sobre una zona dedicada de memoria, el conjunto de registros afectados no será muy grande, posiblemente sólo un acumulador. Será desde luego considerablemente menor que la información de estado del procesador del proceso interrumpido, que no hace falta que se guarde en su totalidad, ya que puede reemprenderse dicho proceso tan pronto como se haya atendido la interrupción.

Una estrategia alternativa a la de salvar el valor de los registros, adoptada por ejemplo por algunos ordenadores de la serie PDP-11, es la de disponer de un conjunto suplementario de registros para ser utilizados sólo en modo supervisor. El FLIH puede entonces usar estos registros y deja los del proceso interrumpido intactos.

La determinación del origen de la interrupción puede llevarse a cabo más o menos fácilmente dependiendo del hardware de que se disponga. En el caso más elemental, en el que todas las interrupciones transfieren el control del programa a la misma posición de memoria, debe realizarse la identificación a través de una secuencia de consultas de los status (estados) de todas las posibles fuentes de interrupción. Esta secuencia se conoce frecuentemente con el nombre de cadena de saltos.

En algunos ordenadores (por ejemplo el PDP-11), la cadena de saltos se hace innecesaria gracias a la utilización de un hardware capaz de distinguir las diferentes fuentes de interrupción y transferir el control del programa a una posición de memoria distinta para cada una de ellas. Ello reduce el tiempo empleado en reconocer una interrupción a costa de utilizar un conjunto adicional de posiciones de memoria. Una solución de compromiso que aparece en varios ordenadores, es la de disponer de un número reducido de posiciones de memoria de interrupción, cada una de las cuales está compartida por un grupo de dispositivos. De esta forma, la primera etapa del reconocimiento de la interrupción la realiza el hardware, siendo suficiente para completar la identificación, una pequeña cadena de saltos asociada a cada una de las posiciones de memoria. La diferenciación entre interrupciones generadas por un controlador, excepciones y llamadas al sistema se lleva a cabo muy a menudo de esta forma. El mecanismo de interrupción puede facilitar la identificación guardando información acerca de la interrupción en alguna posición prefijada de memoria.

Normalmente se inhiben las interrupciones del procesador central cuando se cambia de modo usuario a modo supervisor. Con ello se asegura que el valor de los registros almacenados al entrar en el FLIH no pueda alterarse debido a una interrupción posterior que se dé antes de salir del FLIH. Una interrupción que ocurra mientras el mecanismo de interrupción está inhibido, queda pendiente hasta que este mecanismo sea reactivado al volver al modo usuario. Este sistema no es válido en situaciones en las que algún dispositivo necesite una respuesta mucho más rápida que otros, si, por ejemplo, no se quiere que se pierda información. En tales casos es conveniente introducir la noción de prioridad entre la distintas fuentes de interrupción, permitiendo que una rutina de interrupción sea a su vez interrumpida por una solicitud de servicio de un dispositivo de más alta prioridad.

Algunos ordenadores permiten hacer todo esto desautorizando de forma selectiva algunas interrupciones dentro del FLIH; cuando éste sirve una interrupción, inhibe todas las otras que tengan igual o menor prioridad. Hay que tener la precaución, evidentemente, de guardar los registros de programa del proceso interrumpido en posiciones distintas de memoria, según sea el nivel de prioridad de la interrupción recibida.

También es posible que el hardware de interrupción pueda distinguir por sí mismo los diferentes niveles de interrupción, y transfiera el control del programa y guarde el contenido de los registros en posiciones distintas de memoria según cada nivel. Una interrupción de una determinada prioridad inhibe automáticamente las otras de niveles iguales o inferiores.

La segunda misión del FLIH es la de iniciar el servicio de un interrupción a través de la llamada a una rutina de servicio apropiada al tipo de señal recibida. Hay que destacar el hecho de que debido a la circunstancia de que las rutinas de interrupción se ejecutan en modo supervisor, con las otras interrupciones total o parcialmente inhibidas, es conveniente que dichas rutinas sean lo más cortas posible. En general van a llevar a cabo una acción mínima, como por ejemplo transferir un carácter de un dispositivo de entrada a un buffer, dejando a cargo de un proceso que se ejecuta con las interrupciones permitidas la tarea de emprender la acción adecuada al carácter recibido.

Es importante destacar la circunstancia de que el que se dé una interrupción puede que altere el estado de un proceso. Así, por ejemplo, un proceso que haya puesto en marcha una transferencia con un dispositivo, mientras dure la misma, será bloqueado; aunque pasará a ser listo al recibir la interrupción que señale el final de la transferencia en curso. Algunas llamadas al sistema, como una solicitud de E/S, provocarán que el proceso en curso no pueda proseguir. En todos los casos, el cambio de status lo realiza la rutina de interrupción al modificar el campo correspondiente al estado del proceso en el PCB del proceso.

Una consecuencia de este cambio de status es que el proceso que se estaba ejecutando antes de darse la interrupción puede que no sea el más adecuado para ejecutarse después de la misma. Puede darse el caso, por ejemplo, de que la interrupción vuelva ejecutable un proceso que tenga mayor prioridad que el proceso en curso. En el tema siguiente vamos a discutir la cuestión de cuándo conmutar la CPU entre procesos, así como la de decidir el proceso que debe ocupar la CPU.

ENLACE al tema anterior: INTRODUCCIÓN

ENLACE al siguiente tema: PLANIFICACIÓN DE PROCESOS