lunes, 25 de abril de 2011

Sistemas de prioridad

Existen varias alternativas que consideramos a continuación:


* Interrupciones simultáneas: No tienen por qué ocurrir de manera simultánea sino que se refiere a que en un momento dado puede haber varias interrupciones activas.

* Interrupciones anidadas: Mientras se está procesando una determinada rutina de servicio de interrupción sucede otra señal de interrupción.

* Inhibición de interrupciones: Se deshabilitan las interrupciones mientras se está tratando una.

Interrupciones simultáneas

En este método tenemos dos alternativas, una de ellas es que exista algún hardware que tenga como entradas las señales de interrupción y de como salida la interrupción más prioritaria que está activa en ese momento. Otra alternativa es tener un método de identificación de prioridades distribuida y no generalizada como en el caso anterior, en este caso tenemos que destacar dos técnicas distintas que se pueden implementar en la práctica:

* "Polling": Como ya vimos es la CPU la que chequea los dispositivos y el orden de sondeo determina la prioridad.

* "Daisy-chain": "Daisy-chain" significa "cadena de flores" y viene a significar que podemos conectar los distintos dispositivos en cadena, en orden decreciente de prioridad y por tanto la señal de reconocimiento de interrupción (INTA#) solo será pasada al siguiente dispositivo en caso de que el anterior (más prioritario) no haya solicitado los servicios del procesador. Sin embargo hay algo importante que explicar y es que las señales de interrupción que van al procesador están conectadas todas a un mismo cable, por tanto, deberemos utilizar alguna técnica especial para que no se produzca un cortocircuito. Para evitar precisamente que la pista se cortocircuite se utiliza la técnica del "open-collector" o "colector abierto" y consiste en conectar el colector de un transistor a la pista común (un transistor por cada dispositivo) y por tanto estarán tantos colectores conectados como dispositivos tengamos (se entiende que son dispositivos que mandan petición de interrupción al procesador).


* Híbrida: Mezcla las dos técnicas explicadas anteriormente.

Interrupciones anidadas

Existen dos métodos para tratar las interrupciones anidadas. El primero se basa en inhabilitar las interrupciones mientras se está ejecutando una determinada RSI. Esto puede realizarlo el hardware de manera automática en algunos procesadores pero en otros será el usuario el encargado de deshabilitarlas en caso de que desee que ninguna otra interrupción pueda interrumpir el transcurso normal de la rutina de servicio de interrupción. No es aconsejable deshabilitar las interrupciones durante mucho tiempo ya que esto degrada el rendimiento total del sistema. La otra alternativa es permitir que solo las interrupciones más prioritarias puedan suspender la ejecución de la RSI actual. Para esto tendremos que definir qué líneas son más prioritarias que otras. Otra consideración de esta segunda alternativa es que al anidar distintas llamadas a rutinas tendremos que contar con una pila suficientemente grande para que esta no se desborde.

Inhibición de interrupciones

En este apartado queremos destacar las distintas alternativas de inhibición de interrupciones. Como ya hemos visto estas se pueden hacer de manera automática por el hardware en algunos casos mientras que en otros será el usuario el encargado de realizarlo por software y esto depende de la arquitectura del procesador que consideremos. Las distintas opciones son:

* Deshabilitar todas las interrupciones para esto basta con inhibir el bit del registro de flags dedicado a las interrupciones


* Como hemos dicho se pueden deshabilitar al principio de la RSI y activarlas de nuevo al finalizar la misma, puede ser de manera automática o por el usuario


* Desactivar solo las interrupciones que tengan menor prioridad que la asociada a la RSI que se está ejecutando en ese momento


* Deshabilitar de forma selectiva distintos niveles de prioridad de interrupción para lo cual se emplean registros especiales denominados máscaras en el que cada uno de sus bits identifican a un nivel distinto y modificando su contenido podemos establecer que niveles están activos en ese momento. Se puede cambiar por el programador.

Tormenta de interrupciones

Este evento se puede producir cuando un procesador recibe un número demasiado grande de interrupciones, las cuales consumen la mayor parte del tiempo del procesador. Las tormentas de interrupciones suelen ser causadas por dispositivos de hardware que no son compatibles con una tasa de interrupción limitante.

Como curiosidad, quizas la primera tormenta de interrupciones ocurrio durante el descenso lunar del Apollo 11 en 1969.