Sistemas operativos – Interrupciones

Prácticamente todos los computadores proporcionan un mecanismo para mejorar el uso del procesador y por el cual, módulos como los de E/S pueden interrumpir el secuenciamiento normal del mismo. A continuación se describirán los cuatro tipos de interrupciones más comunes. Los dos primeros tipos corresponden a interrupciones de software, y los dos últimos a interrupciones de hardware:

  • De programa: Generada por alguna condición que se produce como resultado de la ejecución de una instrucción, como por ejemplo un desbordamiento aritmético, una división entre cero, un intento de ejecutar una instrucción ilegal o una referencia errónea a memoria.
  • Por temporizador: Generada por un temporizador del procesador. Permite al sistema operativo realizar funciones de forma regular.
  • De E/S: Generada por un controlador de E/S para señalar la conclusión normal de una operación, o para indicar diversas condiciones de error.
  • Por fallo de hardware: Generada por un fallo, como un fallo de energía, o un error de paridad en la memoria.

La mayoría de los dispositivos de E/S son más lentos que el procesador. Imaginemos un envío de datos a la impresora. Al finalizar cada instrucción de escritura, el procesador debe parar y permanecer inactivo hasta que la impresora termine su trabajo y pueda vaciar así su buffer. Esta pausa del procesador puede durar cientos, miles e incluso millones de ciclos de instrucción, por lo que, es un desperdicio del procesador, para solucionar esto, el procesador detiene el proceso que está haciendo la llamada a la impresora durante un periodo de tiempo determinado. En este momento, el proceso cambia de contexto y queda esperando a la transferencia de información entre la CPU y el dispositivo.

Es ahora cuando podemos introducir el concepto de interrupción de manera genérica. Gracias a las interrupciones, el procesador podrá dedicarse a ejecutar otras instrucciones mientras la operación de E/S es llevada a cabo. Cuando el dispositivo externo está listo, envía de nuevo una señal de interrupción al procesador. El procesador suspende la ejecución del proceso que se encuentre en ejecución en ese momento, y salta a una rutina de servicio (Interrupt Service Routine o ISR) específica de ese dispositivo, conocida como manejador de interrupción, y reanudando la ejecución original. El programa de usuario no tiene por qué llevar ningún código especial para realizar una interrupción, es el procesador y el sistema operativo los responsables de realizar esto.

CicloInstInterrup

Salvado del contexto de un proceso debido a una interrupción

La aparición de una interrupción, genera varios eventos, tanto a nivel de hardware como de software:

  1. El dispositivo genera una señal de interrupción hacia el procesador a través de un bus habilitado para ello, modificando así un registro.
  2. El procesador no ejecuta la siguiente instrucción, sin embargo sí completa la ejecución de la instrucción que se encuentra en ese momento haciendo uso de él. Esto se debe a que al finalizar cada instrucción, el procesador comprueba si hay alguna interrupción pendiente. Comprueba que existe una interrupción, determina el tipo de ésta y el dispositivo del que proviene, para ello hace uso de una tabla de tipos de interrupción. Envía una señal al dispositivo notificando que ha recibido la interrupción y posteriormente comprueba el estado de dicho dispositivo. Dependiendo de la arquitectura del procesador y del diseño del sistema operativo, puede haber una única rutina de interrupción o varias, una por cada tipo de interrupción o por cada tipo de dispositivo. Si existe más de una rutina para el manejo de la interrupción, el procesador determinará cual de éstas invocar. Esta información puede estar incluida en la señal de interrupción original, o en ocasiones, el procesador necesitará realizar una petición al dispositivo para obtener más información.
  3. En este momento, el procesador se prepara para transferir el control a la rutina de interrupción. Necesita salvar la información requerida para reanudar el programa actual en el momento de la interrupción. La información mínima requerida es la palabra de estado de programa o PSW y la posición de la siguiente instrucción que se va a ejecutar, contenida en el contador de programa (PC).
  4. Ahora, el procesador carga el contador del programa con la posición del punto de entrada a la rutina de manejo de interrupción (ISR) que tratará esa interrupción.
  5. Una vez se ha cargado el contador del programa, el procesador continua con el siguiente ciclo de instrucción, que comienza con una lectura de la instrucción. Dado que la lectura de la instrucción está determinada por el contenido del contado del programa, el resultado es que se transfiere el control al programa manejador de la interrupción. Esta ejecución conlleva las siguientes operaciones.
    1. En este momento, el PC y la PSQ vinculados al programa que ha sido interrumpido se han almacenado en la pila del sistema. Se deben salvar el contenido de los registros del procesador, ya que el manejador de interrupción puede hacer uso de esos registros y machacar la información del programa interrumpido. Por tanto, se deben salvar estos valores, así como cualquier otra información de estado. A esto lo llamamos Bloque de Control de proceso o BCP.
    2. Es ahora cuando el manejador de interrupción puede en este momento comenzar a procesar la interrupción. Esto incluirá un examen de la información de estado relacionada con la operación de E/S (así sea un éxito o un fracaso) o con otro evento distinto que haya causado la interrupción. De la misma forma que puede involucrar el envío de datos del dispositivo E/S a la CPU y viceversa.
    3. Cuando se completa el procesamiento de la interrupción, se recuperan los valores de los registros salvados en la pila y se restituyen en los registros del procesador.
    4. La última acción es la de restituir de la pila los valores de la PSW y del contador de programa.
  6. Como resultado, la siguiente instrucción que será ejecutada corresponderá al programa previamente interrumpido. En muchas ocasiones, el planificador del sistema operativo puede optar por ejecutar otro programa que tenga más prioridad, por lo que no siempre se restaura el programa que se interrumpe.

Es importante salvar toda la información del estado del programa interrumpido para posteriormente, poder reanudarlo desde el punto en el que se detuvo su ejecución. Una interrupción puede suceder en cualquier momento y en cualquier punto de la ejecución del programa, por lo que son imprevisibles.

Múltiples interrupciones

Hasta ahora se ha hablado de que sólo se produzca una única interrupción. Sin embargo, se pueden producir múltiples interrupciones de forma simultánea. Se pueden llevar a cabo dos estrategias a la hora de manejar múltiples interrupciones:

  1. Inhabilitar las interrupciones mientras se está procesando una interrupción. Esto significa, que el procesador ignorará cualquier nueva interrupción que se produzca. En el caso de que se produzca una o más interrupciones durante este periodo, generalmente, se almacenarán y permanecerán pendientes de ser procesadas, de forma que el procesador sólo la comprobará cuando las interrupciones sean de nuevo habilitadas. Esta estrategia es válida y sencilla, ya que las interrupciones se manejan en estricto orden secuencial. La desventaja de esta estrategia es que no se tiene en cuenta la prioridad o el grado de urgencia de las interrupciones.
  2. Definir prioridades para las interrupciones y permitir que una interrupción de más prioridad interrumpa la ejecución de un manejador de interrupciones de menor prioridad

2 comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *