Los dispositivos mediante los cuales se comunica la CPU con el exterior se denominan periféricos
.
tiposPresentación de datos: pantalla, impresora, etc.
- Adquisición de datos: teclado, sensores, etc.
- Soporte de información: discos, cintas, etc.
- Modificación del entorno: motores, válvulas, etc.
La forma en que estos dispositivos son controlados electrónicamente es muy variable. Si la CPU tuviera que controlarlos directamente, los programas de control así como la conexión física de los periféricos con los 3 buses de la CPU serían complicadísimos.
Para resolver este problema se incorpora al sistema un circuito especial llamado controlador de Entrada/Salida, que realiza las funciones de mediador entre la CPU y eldispositivo.
Un controlador es un dispositivo electrónico que se interpone entre los buses del sistema y el periférico y que es visible a nivel de Lenguaje Máquina como un conjunto de registros. La CPU se comunica con el periférico a través de los registros del controlador.
1.- Funciones del controlador de E/S
Las funciones del controlador de E/S son las siguientes:
- Diálogo con la CPU (recibe peticiones de la CPU para realizar operaciones de entrada/salida).
- Control del periférico para que realice la operación solicitada por la CPU.
- Facilitar la transferencia de información entre la CPU y el periférico.
La complejidad del controlador puede variar con el objetivo de disminuir la carga de trabajo de la CPU. Por ejemplo, un controlador simple del teclado le dará a la CPU en su registro de datos, el código de la tecla pulsada. En cambio, se podría diseñar un controlador más complejo que hiciera la traducción del código de la tecla a código ASCII.
2.- Registros del controlador de Entrada/Salida
El controlador tiene un conjunto de registros a los cuales la CPU puede acceder mediante instrucciones de LM (de la misma forma que accede a registros internos o a memoria)
. Estos registros pueden ser, en general, de 3 tipos:
* Registro de estado:
Mantiene información sobre la situación en la que se encuentra el periférico. Por ejemplo, si se ha tecleado un dato o no, si ha terminado la escritura de cierta información en el disco, etc.
El contenido de este registro es leído por la CPU cuando necesita conocer este tipo de información.
* Registro de control:
La CPU escribe en él información que le indica al controlador de qué forma ha de trabajar el periférico, o cuál ha de ser la operación a realizar.
Estructura de Computadores: E/S | 4 |
* Registro de datos:
El controlador deja aquí la información que recibe del periférico para que sea recogida por la CPU o viceversa. Por ejemplo, el carácter del teclado, o el carácter a escribir en el disco, etc.
El próximo problema a resolver es cómo accede la CPU a los registros del controlador. Existen 2 técnicas diferentes:
- registros mapeados en memoria,
- registros no mapeados en memoria.
3.- Entrada/Salida mapeada en memoria
Cada uno de los registros del controlador tiene asociada una dirección física del mapa de direcciones de la memoria, al igual que ocurre con cada posición de memoria. Por tanto, los registros se leen o se escriben exactamente igual que se lee o escribe una posición de memoria.
Estructura de Computadores: E/S | 5 |
Ventajas:
Se puede acceder a los registros del controlador exactamente igual que si fuese a una posición de memoria. Es decir, se puede utilizar cualquier instrucción y cualquier modo de direccionamiento. En definitiva, los registros mapeados en memoria se tratan como si fueran posiciones de memoria física. Y de hecho, la CPU no se entera de si el acceso es a memoria o a un registro de E/S.
Desventajas:
Se pierde espacio para memoria física.
Además, es difícil impedir que un usuario normal acceda a los registros de E/S. Habitualmente es responsabilidad del SO el acceso a los periféricos y controladores. De alguna forma hay que impedir que un usuario normal acceda a los registro de E/S porque es bastante probable que estropee algo. Este tipo de protección es bastante difícil en este caso. Por hardware se ha de
Estructura de Computadores: E/S | 6 |
detectar si el programa que genera la dirección es un programa de usuario o del SO. En tal caso se impediría la transferencia. Es habitual que los procesadores generen una señal por el bus de control que indique si el programa que se está ejecutando es un usuario normal o usuario privilegiado (SO). La distinción de usuario implica que debe haber instrucciones de cambio de modo y que en la palabra de estado (PSW) se ha de guardar el modo en que trabaja el programa en ejecución.
4.- Entrada/Salida independiente o no mapeada en memoria
Existe una señal especial en el bus que indica si la dirección generada corresponde a una posición de memoria o a uno de los registros del controlador de E/S, IO/M (InputOutput/Memory = EntradaSalida/Memoria). Se distingue mediante esta señal entre un mapa de Memoria y un mapa de Entrada/Salida, como se observa en la figura 3.5.
Cuando el procesador ejecuta una instrucción que accede a memoria como MOV, ADD, INC, entonces la señal IO/M está desactivada (IO/M =0) de forma que la dirección generada corresponde a la memoria física.
Si el programa quiere acceder a los registros de E/S ha de ejecutar una instrucción especial:
INnº registro interno, nº puerto o nº registro E/S
OUT nº puerto, nº registro interno
Ambas instrucciones hacen que IO/M = 1. Tienen como parámetro un registro de E/S, también llamado puerto que se direcciona por el bus de direcciones. Dependiendo de la instrucción IN/OUT se lee/escribe en ese puerto.
Por tanto, la diferencia principal con la técnica anterior es que se usan instrucciones diferentes para acceder al espacio de E/S que para acceder al espacio de memoria.
Ventajas
No se gasta espacio de memoria física ya que este espacio está separado del espacio de entrada/salida. Además, es fácil impedir que un usuario normal acceda al espacio de E/S, ya que en estas máquinas las instrucciones IN y OUT sólo se pueden ejecutar en modo privilegiado, es decir por programas del SO.
Desventajas:
Se necesitan al menos 2 nuevas instrucciones y alguna señal de control más, lo cual complica un poco el diseño de la CPU.
En algunas máquinas se combinan ambas técnicas.
Estructura de Computadores: E/S | 8 |
5.- Clasificación de los controladores de E/S
Los controladores se pueden clasificar en:
No multiplexados:
El controlador se hace cargo de un solo periférico, como puede verse en lafigura 3.7 .
Se usa cuando el periférico es rápido (el controlador no está demasiado tiempo desocupado). Por ejemplo, discos rápidos, pantallas gráficas.
Multiplexados:
El controlador se hace cargo de varios periféricos (ver Figura 3.8).
En este caso la multiplexación se puede realizar por bloques o por caracteres:
Multiplexado por caracteres:
El controlador atiende a cada periférico durante el tiempo de transferencia de un carácter. Se usa con periféricos lentos. Por ejemplo, se podría controlar con un mismo circuito un teclado y una pantalla. El teclado sólo requiere atención muy de vez en cuando, al teclear un carácter.
Multiplexado por bloques:
El controlador atiende a cada periférico durante el tiempo de transferencia de un bloque de caracteres. Se usa para periféricos de velocidad intermedia. Por ejemplo, un mismo controlador puede atender a diferentes unidades de cinta.
Estructura de Computadores: E/S | 9 |
¿Cómo se realiza la transferencia de información?
La respuesta a esta cuestión depende del periférico que se esté utilizando. Para cada caso hay que conocer la secuencia de operaciones que se ha de seguir para llevar a cabo la transferencia.
Estructura de Computadores: E/S | 10 |
¿Cuándo se realiza la transferencia?
O lo que es lo mismo, ¿cómo se sincroniza la CPU con los dispositivos de E/S?. Simplificando, ¿cómo se entera la CPU de que puede empezar a realizar una nueva operación de E/S?
En algunos casos, la respuesta a la pregunta es trivial. Por ejemplo, en el caso de salida de datos a la pantalla mapeada en memoria del caso anterior, la CPU inicia una nueva transferencia (visualización de un nuevo carácter) cuando quiere. No ha de esperar a que se produzca ninguna situación ni condición especial y en el momento en que desee dejará el carácter en la posición de memoria que le corresponde para que sea visualizado.
El caso extremo es cuando la CPU intenta leer un carácter que ha de teclear el usuario. En este caso la CPU debe esperar hasta que el usuario pulse una tecla.
En el caso más general, la CPU ha de detectar de alguna forma que el dispositivo está listo para realizar la transferencia. Por ejemplo, en el caso de la impresora, es necesario que el bit 7 del registro de estado esté a 1. De alguna forma la CPU ha de detectar esta circunstancia.
Existen 2 alternativas para resolver el problema de la sincronización entre la CPU y el controlador de E/S:
Sincronización por encuesta:
La CPU detecta la disponibilidad del dispositivo mediante laconsulta constante de alguno de los registros del controlador.Sincronización por interrupción:
En este caso es el controlador quien avisa a la CPU de queel periférico está preparado, para lo que activa una señal denominada interrupción
.
¿Quién realiza la transferencia?
Por último, vamos a ver quién es el responsable de realizar la transferencia de información entre el controlador y la memoria o viceversa (en general, la información procedente de un periférico se almacena en memoria y viceversa).
Existen 2 posibilidades:
- La CPU es responsable de realizar todas las operaciones involucradas en la E/S.
- La CPU realiza una parte de las operaciones y el resto las realiza un circuito externo especializado. Distinguiremos dos tipos de circuitos especializados en esta operación:
Estructura de Computadores: E/S | 11 |
- Controlador de DMA (acceso directo a memoria).
- Procesador de E/S (canal).
El funcionamiento de cada una de las posibilidades de la segunda opción lo describiremos más adelante. De momento supondremos que la CPU es la responsable de realizar todas las operaciones involucradas en la E/S.
1.- Entrada/Salida por encuesta
En el caso de sincronización por encuesta, la CPU debe detectar la disponibilidad del dispositivo mediante la consulta constante del registro de estado del controlador. Este tipo de encuesta se denomina encuesta por estado.
Podemos distinguir dos tipos de encuesta por estado:
• Encuesta continua:
Cuando el programa principal decide realizar una operación de E/S ejecuta el siguiente algoritmo:
Reg = leer_registro_estado
While
Reg NO_PREPARADO hacer
Reg= leer_registro_estado
Fwhile realizar_operaciones_E/S
Ejemplo: teclado
Pongamos que el ciclo de la CPU para recibir un carácter es de 10μs yque una persona puede teclear 10 teclas (caracteres)/segundo.
El tiempo que transcurre entre el tecleo de dos caracteres es 106 μs/10 carácter = 105 μs/carácter. De los cuales 10 μs serán necesarios para recibir el carácter y 99.990 μs quedarán libres => % 99,99 PERDIDO
• Encuesta periódica:
si en el momento de leer el registro de estado el periférico no está disponible, el programa principal puede realizar otras acciones y posteriormente volver a analizar el estado del periférico. El algoritmo a ejecutar en el programa principal es el siguiente:
Reg = leer_registro_estado
While
Reg NO_PREPARADO hacer
Otras_acciones
Reg= leer_registro_estado
Fwhile
realizar_operaciones_E/S
Si se realiza una encuesta periódica existe la posibilidad de que el programa principal detecte demasiado tarde que se puede realizar la operación de E/S. Por ejemplo, puede ocurrir que durante el tiempo en que el programa está esperando o haciendo otras cosas el usuario pulse 2 teclas y por tanto se pierda la primera de ellas.
Estructura de Computadores: E/S | 12 |
Una alternativa a la encuesta por estado es la encuesta por tiempo.
En este caso, se ha de conocer cuánto tiempo tarda el dispositivo en realizar una operación. Una vez pasado este tiempo se supone que el dispositivo está listo para realizar una operación correcta. En este caso, no sería necesario que el controlador tuviera registro de estado (si sólo se usa para esto). Por supuesto, esta técnica no se puede emplear con aquellos dispositivos para los que no se conoce el tiempo que tardan en estar listos para realizar la transferencia. Un ejemplo típico es el teclado. En este caso, no se puede conocer cuánto tiempo tardará el usuario en teclear un nuevo carácter.
2.- Entrada/Salida por interrupción
Una interrupción no es más que una excepción que ocurre en el computador. Veamos primeramente cuáles son las excepciones posibles en una máquina.
Una excepción es un suceso extraordinario que requiere una atención especial por parte del procesador. Las excepciones se pueden clasificar en:
Síncronas (de software):
La excepción se produce como consecuencia de la ejecución deuna cierta instrucción (síncrona con respecto al flujo del programa). Existen varios tipos de excepciones síncronas:
TRAPS
La instrucción que provoca el «trap» se ejecuta totalmente y una vez acabada,el procesador pasa a ejecutar una rutina de atención a dicha excepción. Por ejemplo, si se produce overflow en una operación en coma flotante, una división por cero, etc.FALLO
La instrucción queda a medio ejecutar pero el procesador queda en unestado conocido de forma que, una vez resuelto el fallo, puede reiniciarse la ejecución de la instrucción que lo provocó. Por ejemplo, error de paridad en una lectura de memoria.
ABORTO
La instrucción queda a medio ejecutar, pero el procesador queda enun estado desconocido, y por tanto, resulta imposible la reanudación del programa. Ejemplos: intento de acceder a una posición de memoria privilegiada, intento de ejecutar una instrucción cuyo código es ilegal (no existe o es privilegiado), etc.
Asíncronas (de hardware):
Son excepciones que se producen independientementede la ejecución de un programa, como consecuencia de algún acontecimiento externo al procesador.
También se denominan interrupciones. Tenemos 2 tipos:
FALLOS HARDWARE
Caída de tensión, rotura de un bus.
ENTRADA/SALIDA
Excepción provocada por un dispositivo de E/S querequiere la atención del procesador. Son estas las que nos interesan y en las que nos vamos a centrar en éste capítulo.
Estructura de Computadores: E/S | 13 |
Cualquier CPU tiene una o varias entradas a través de las cuales los dispositivos externos pueden solicitar su atención e interrumpir a la CPU. Cuando el periférico está listo para una transferencia, activa un bit en el registro de estado (precisamente el que hay que analizar en la sincronización por encuesta); éste, a su vez, activa la señal de salida INT que está conectada a una de las entradas especiales de la CPU.
Cuando la CPU detecta la activación de alguna de estas señales (señales de petición de interrupción
) decide si la interrupción seráservida o no en ese preciso instante (podríaocurrir que la tarea que está realizando sea mucho más importante que la operación de E/S). En caso afirmativo, abandona la ejecución del programa que estaba ejecutándose y se pasa el control a una rutina en la que se atenderá al dispositivo externo que provocó la interrupción. Una vez acabado dicho tratamiento (rutina de atención a la interrupción)
, el procesador reanuda la ejecución del programa interrumpido.
Una rutina de servicio o de atención de interrupción se comporta como una subrutina que no es activada por el programa principal (activación síncrona) sino por un suceso externo (activación asíncrona)
. Esta subrutina efectúa la transferencia de información con el controlador e informa de alguna manera al programa que ordenó la operación de E/S del resultado de la misma. La Figura 3.9 presenta este mecanismo.
Figura 3.9
: esquema para responder a las interrupciones
Estructura de Computadores: E/S | 14 |
La ventaja principal de esta técnica es que la CPU no pierde tiempo realizando la encuesta y puede, por tanto, realizar otros trabajos. El inconveniente es que complica un poco el hardware de la máquina. En concreto, la señal de INT es una entrada más de la unidad de control (U.C.), lo que complica un poco su diagrama o algoritmo de estados.
2.1.- Atención de una interrupción
La secuencia de acontecimientos que tienen lugar durante la atención a una petición de interrupción es, a grandes rasgos, la siguiente:
- Detección de la petición.
- Salvar el estado del programa interrumpido.
- Identificación de la rutina a ejecutar (dependiente del dispositivo que interrumpe).
- Ejecución de la rutina de atención a la interrupción.
- Retorno al programa interrumpido.
Detección de la petición
Una petición de interrupción consiste en la activación de alguna de las líneas de petición que llegan a la CPU. La CPU puede tener una o varias entradas de petición de interrupción. Habitualmente, es mayor el número de dispositivos que pueden interrumpir a la CPU que el número de señales de petición (que frecuentemente es 1). Por tanto, los dispositivos externos han de compartir estas líneas.
La CPU debe muestrear periódicamente el valor de las señales de petición de interrupción. Habitualmente este muestreo se realiza cuando acaba la ejecución de una instrucción y antes de iniciar el fetch o búsqueda de la siguiente. En instrucciones largas, como por ejemplo las de tratamiento de cadenas de caracteres, se suelen muestrear las líneas de petición después de realizar una operación elemental con un carácter. Normalmente, las peticiones de interrupción requieren una atención rápida, y por tanto no sería conveniente retrasar esta atención hasta acabar la ejecución de una instrucción que puede ser muy larga.
Es habitual que la CPU disponga de algún mecanismo que le permita protegerse contra interrupciones, cuando, por ejemplo está ejecutando un programa que no debe ser interrumpido. Generalmente, un conjunto de bits de la palabra de estado determina en cada momento qué peticiones pueden ser atendidas y cuáles no.
En la Figura 3.10 se puede ver el esquema para el caso de una sola señal de interrupción.
Estructura de Computadores: E/S | 15 |
IF es el Flag de interrupción (Interrupt Flag). La señal que muestrea la unidad de control es la señal INT*, que es el resultado de enmascarar la señal de petición de interrupción INT que viene de los periféricos. En el caso de que IF = 0 se dice que las interrupciones están inhibidas o deshabilitadas (disabled). Si IF = 1 las interrupciones están permitidas o habilitadas (enabled).
Es importante recalcar que existen entradas de petición de interrupción no enmascarables, NMI (Non Maskable Interrupt).
En caso de tener varias señales de entrada de petición de interrupción existe la posibilidad de inhibirlas todas (mediante IF) o inhibir un subconjunto de ellas mediante una máscara, tal y como se puede observar en la Figura 3.11.
Existen instrucciones de LM para manipular la máscara y el bit IF de la PSW de forma que el programador puede protegerse en cada momento de un cierto conjunto de interrupciones.
A partir de este momento supondremos que la CPU desde que inicia la ejecución de la subrutina de atención a la interrupción hasta que la acaba no atenderá ninguna nueva interrupción. Esto significa que cuando la CPU decide atender una interrupción automáticamente pone el bit IF a 0 y no vuelve a activarlo hasta que acaba la ejecución de la rutina de atención.
Salvar el estado del programa interrumpido
Teóricamente, cuando finaliza la ejecución de la rutina de servicio a la interrupción, se ha de reanudar la ejecución del programa interrumpido. Para que esto sea posible es necesario salvar, en el momento de la interrupción, el estado del programa.
La mínima información que se ha de salvar automáticamente son:
PC: para saber cuál es la instrucción que se tiene que ejecutar a la vuelta de la rutina de atención
PSW (bits de condición y bits de estado): para volver al estado en el que se encontraba antes de ejecutar la rutina de atención, una vez finalizada esta.
Estructura de Computadores: E/S | 16 |
Como hemos establecido, de momento, que una rutina de atención no puede ser interrumpida (un sólo nivel de interrupciones), el estado del procesador puede salvarse en posiciones fijas de memoria. Más adelante veremos que la mayoría de procesadores sí permiten varios niveles de interrupción. En estos casos será necesario salvar el estado del programa en la pila.
Identificación de la rutina a ejecutar
Debido a que son varios los dispositivos externos que pueden interrumpir al procesador y que cada uno requiere un tratamiento especial, una vez que se ha aceptado la interrupción, se inicia una fase en la que hay que identificar el dispositivo que hizo la petición para seleccionar la rutina de servicio correspondiente. Este problema es debido a que varios dispositivos utilizan una misma línea de interrupción. El problema tiene 2 vertientes:
¿Quién ha solicitado la interrupción? ==> Identificación por hardware o por software.
– Si solicitan la interrupción varios dispositivos a la vez: ¿A quién se atiende primero? Se ha de establecer una serie de prioridades entre los dispositivos que realizan la petición por una misma línea.
Identificación software:
Siempre que se produce la activación de una señal INT y las interrupciones están permitidas, la CPU pasa a ejecutar una rutina de atención general determinada (puede existir una por cada línea de petición). Las primeras instrucciones de esta rutina tienen como objetivo determinar, mediante una encuesta, cuál es el dispositivo que realizó la petición. El orden en que se realiza la encuesta determina la prioridad entre los dispositivos. Una vez identificado el periférico (analizando el registro de estado del controlador), se salta a ejecutar la rutina de atención particular para ese periférico concreto. Esta solución es sencilla, pero puede llegar a ser muy lenta. La Nintendo DS es una de las máquinas que utiliza esta solución.
Identificación hardware:
En este caso es el propio dispositivo el que se identifica de forma que la CPU pueda pasar a ejecutar la rutina correcta. Para ello, la CPU dispone de una o varias señales de reconocimiento de petición (tantas como señales de petición) INTA como se ve en la siguiente Figura 3.12.
Figura 3.12: esquema del hardware para la identificación del controlador
Cuando la CPU acepta la petición, activa la señal de reconocimiento adecuada. Esta señal puede ser consultada por los controladores de forma que aquél que realizó la petición, cuando detecta la activación de la señal de reconocimiento envía a la CPU cierta información que será ejecutada para determinar qué rutina se ha de ejecutar.
Si tenemos k líneas de petición INT1,…,k también tendremos k líneas de reconocimiento INTA1,…,k.
La información que el controlador envía a la CPU puede ser: – la propia dirección de la rutina de atención;
-El código de una instrucción determinada que será ejecutada por la CPU. Lógicamente esta instrucción es el salto a la rutina de atención;
– un identificador que es usado por la CPU para acceder a una tabla donde se encuentra la dirección de la rutina a ejecutar. Esta técnica se conoce como interrupción vectorizada (i8086/88).
En cualquier caso se plantea el problema de qué hacer si son varios los dispositivos que piden atención simultáneamente por una misma línea. Si no añadimos nada al esquema propuesto todos los dispositivos que realizan la petición, al detectar la señal de reconocimiento intentarían enviar la información a la CPU simultáneamente. Para resolver ese problema tenemos distintas posibilidades. Vamos a ver una de las posibles soluciones, mediante el mecanismo DaisyChain o cadena de margaritas:
Cuando la CPU recibe la petición de interrupción (y decide aceptarla) activa la señal INTA. Cada controlador tiene una entrada y una salida de INTA. Cuando el controlador detecta la activación de la señal INTA, si no ha pedido él la interrupción activa la señal de salida INTA hacia el siguiente controlador. Este proceso se repite hasta que la señal llega a un controlador que sí ha pedido la interrupción, entonces este controlador no pasa la señal INTA al siguiente y envía a la CPU la información necesaria para que se pase a ejecutar la rutina adecuada.
Con esta técnica, los controladores más próximos a la CPU dentro de la cadena son
Estructura de Computadores: E/S | 18 |
los más prioritarios (reciben antes la señal INTA). Véase la figura 3.13.
Ejecución de la rutina de atención a la interrupción
Una vez localizada la rutina de atención a la interrupción se pasa a ejecutarla. Las operaciones a realizar dependen del periférico y del servicio requerido.
Retorno al programa interrumpido
La última instrucción de la rutina es una instrucción especial RTI (retorno de interrupción) que restaura el programa interrumpido (PC y PSW) de forma que pueda reanudarse su ejecución.
2.2.- Interrupciones multinivel
En la mayoría de los computadores la CPU puede ser interrumpida cuando está ejecutando la rutina de atención a una interrupción previa. En este caso se abandona la ejecución de la rutina y pasa a ejecutarse la rutina de atención a la nueva interrupción. En estas máquinas se ordenan las posibles peticiones de interrupción según prioridades decrecientes. Cuando se produce una interrupción de prioridad n, será atendida si las interrupciones están permitidas y si en ese momento se está ejecutando una rutina de atención a una interrupción menos prioritaria. Es decir, hay establecidos diferentes niveles de prioridad.
En este caso IF no se pone automáticamente a cero durante la ejecución de una rutina de atención a una interrupción.
En la Figura 3.14 se pueden observar las modificaciones que habría que añadir al esquema DaisyChain propuesto para que se pueda trabajar con interrupciones multinivel.
Supongamos que no se ha realizado ninguna petición de interrupción y que todas las señales S están activadas. Cuando el controlador Ki quiera realizar una petición de interrupción activará la señal INT, recibirá la señal INTA, y enviará la información necesaria a la CPU para identificar la rutina de servicio. En ese instante el controlador Ki desactiva la señal S, que indica que se está sirviendo una petición de interrupción para ese dispositivo, desactivándose todas las señales S posteriores (las que usan los dispositivos de menor prioridad a Ki). Si ahora el controlador Ki+1 activa la señal INT para solicitar una interrupción, como la señal Si estará desactivada, la petición de interrupción no llega al procesador. Si la petición la realiza el controlador Ki1, se servirá normalmente ya que Si1 no está desactivada. Será necesario activar la señal S cuando se acabe de servir la petición de interrupción.
2.3.- Controlador de interrupciones
Existe un circuito que se encarga de realizar todas las operaciones mencionadas, el controlador de interrupciones. El controlador de interrupciones hace de intermediario entre la CPU y los controladores de E/S para realizar una gestión eficaz de las peticiones de interrupción. Se encarga de recibir cualquier petición y determinar en función de las prioridades y de las peticiones pendientes y en curso si la nueva petición ha de ser servida. Cuando esta petición es reconocida por la CPU, se encarga de que la información necesaria para identificar la rutina de servicio llegue a la CPU.
Otras posibilidades que puede ofrecer el controlador de interrupciones son: Posibilidad de enmascarar las interrupciones de cada dispositivo por separado.
Posibilidad de programar las prioridades dinámicamente.
Encadenar varios controladores de interrupciones.
Estructura de Computadores: E/S | 20 |
3.- Acceso directo a Memoria (DMA- Direct Memory Access)
Cuando hay que transferir una cantidad muy grande de datos entre la memoria y los periféricos o cuando hay que hacer una tranferencia a gran velocidad el método visto hasta ahora no es efectivo. Si todos los datos tienen que pasar por el procesador la operación de E/S tardará mucho tiempo en llevarse a cabo.
Pongamos que tenemos que hacer una transferencia entre el disco y la memoria (p.Ej. Tenemos que copiar un sector del disco a la memoria):
- Puesto que tenemos que escribir muchos datos, el procesador pasará mucho tiempo haciendo estre trabajo, sin poder dedicarse a ninguna otra cosa.
- Puesto que todos los datos tienen que pasar por el procesador, la transferencia no será “muy rápida” y por lo tanto, no se estarán aprovechando la velocidad del disco y de la memoria.
El esquema que tenemos es el de la Figura 3.15.
Figura 3.15: Esquema de hardware sin DMA
Para que esa transferencia se realice más rápido, introduciremos en el sistema un hardware especializado que se ocupará de los movimientos de datos de los que estamos hablando. Este circuito se denomina controlador de DMA (acceso directo a memoria). El esquema de la Figura 3.15 se transformaría en el de la Figura 3.16.
La entrada/salida mediante DMA sólo se lleva a cabo cuando los datos a transferir se encuentran en posiciones de memoria consecutivas. Los más típicos podrían ser, por ejemplo, los movimientos de datos entre un almacén de datos externo y la memoria principal.
Al iniciar el proceso de lectura/escritura mediante DMA, el procesador programará el controlador
Estructura de Computadores: E/S | 21 |
de DMA (KDMA) para que se ocupe de llevar a cabo el trabajo. Lo que hay que hacer para controlar la entrada/salida normalmente son dos cosas: enviar la dirección en el bus de direcciones y la señal RD/WR en el bus de control. Después, se actualizan la dirección y la cantidad de datos a transmitir y se envía el nuevo dato, así, hasta haber enviado todos los datos.
Como tanto el procesador como el controlador de DMA deben acceder a memoria, es necesario controlar adecuadamente los buses de acceso a la misma, ya que éstos son utilizados por ambos circuitos y podrían surgir conflictos de competencias por el control de los mismos. A continuación vemos algunas soluciones posibles:
A) Una memoria de puerto múltiple
En el caso de la Figura 3.17 existen dos buses. Mientras que la CPU controla uno de ellos, el KDMA controla el otro. Así, mientras se lleva a cabo una transferencia entre P3 (Figura 3.17) y memoria, el procesador, por su lado, podría seguir con su tarea. Una vez finalizada la transferencia, el DMA avisaría al procesador, y punto. La sincronización de este proceso, como hasta ahora, podría hacerse por encuesta (la realiza la CPU) o por interrupción (la realiza el KDMA). Si se utiliza este último método de sincronización, la CPU sólo se interrumpe una vez.
B) Una memoria de puerto único
Las memorias de puerto múltiple son muy caras. Por esa razón, el procesador y el KDMA normalmente comparten el bus de acceso a memoria. La consecuencia es que cuando uno de los dos está utilizando los buses, el otro tiene que estar desconectado, en estado de alta impedancia. El esquema de esta situación puede verse en la Figura 3.18.
Figura 3.18: Esquema del sistema con memoria de puertoúnico
Estructura de Computadores: E/S | 22 |
Por supuesto, en este caso el paralelismo es mucho menor, puesto que mientras uno trabaja (lee o escribe la memoria) el otro se quedará sin trabajo (al menos en cuanto a la memoria se refiere).
3.1- El controlador de DMA
En un controlador de DMA común, normalmente hay varios registros, mediante los cuales se programa el funcionamiento del circuito. Estos son algunos de los registros que suelen tener estos sistemas:
Registro de dirección
Contiene la dirección donde ha de quedar o de donde ha de obtenerse el siguiente dato involucrado en la transferencia.
Registro de longitud (contador): contiene el número de datos que quedan por transferir.
Registro de control
Contiene información que indica al KDMA cómo ha de trabajar. Por ejemplo:
Indica si la operación es de lectura o escritura. Indica si se ha de interrumpir a la CPU al acabar.
Indica si la dirección se ha de incrementar/decrementar después de cada operación elemental E/S.
Veamos con mayor detalle como realizan estos tres pasos:
Inicialización de la transferencia por parte de la CPU
La inicialización de los controladores se realiza como una operación normal de entrada/salida, por ejemplo, mediante encuesta.
- Consultar la disponibilidad del KDMA y KPER
- Programación del KDMA
- Dirección inicial de memoria
- nº de datos a transferir
información de control (dirección, interrupción, tipo de
transferencia)
- Programación del KPER (según el periférico). P.Ej. Un disco
- unidad, cara, cilindro, sector, pista, cantidad de sectores, …
- lectura/escritura, ….
Transferencia
- Cuando el KPER tiene un dato disponible o está dispuesto para recibir otro activa DMAR.
- El KDMA activa BR para pedir a la CPU control sobre los buses.
- La CPU termina el acceso a memoria y activa BG, cediendo los buses al KDMA y dejando sus salidas al bus en alta impedancia.
- El KDMA vuelca sobre el bus de datos la dirección, activa la señal R/W y activa DMAG para indicar al KPER que lea o escriba el dato sobre el bus de datos.
- El KDMA baja la señal BR al acabar la operación para indicar a la CPU que puede retomar el control de los buses.
- Esta operación se repite para cada uno de los datos a transferir.
Esta técnica se denomina transferencia DMA por robo de ciclo, ya que el KDMA roba de vez en cuando un ciclo a la CPU para poder acceder a memoria. Si la velocidad a la que el KPER está listo para realizar una nueva operación es elevada entonces el KDMA está robando constantemente ciclos a la CPU con lo que puede degradar en demásía el rendimiento de la CPU.
Estructura de Computadores: E/S | 24 |
La alternativa a la transferencia por robo de ciclo es la transferencia por ráfagas o por bloque. En este caso, cuando KDMA recibe la señal BG (es dueño del bus) no abandona el control del bus hasta que se ha realizado la transferencia de todo el bloque.
3
Finalización de la transferencia(sincronización)
Una vez finalizada la transferencia del bloque, la CPU y el KDMA tienen que sincronizarse. Esto normalmente se hace por interrupción (aunque es programable). La rutina de atención analiza el registro de estado para ver si todo ha funcionado correctamente. Quien crea la petición de interrupción puede ser tanto el controlador DMA como el controlador del periférico.
2. Un ejemplo de utilización del DMA
Pongamos que queremos leer la información contenida en un sector de un disco (n bytes almacenados consecutivamente). El controlador del disco tiene tres registros: registro de estado, registro de datos y registro de instrucción.
Para llevar a cabo esta operación hay que dar los siguientes pasos:
- Ver si el controlador está preparado.
- Enviar al registro de control el número de pista.
- Enviar el número de sector.
- Enviar la orden de lectura.
- Mientras haya caracteres por leer hacer
- Mirar si el carácter está disponible
- Leer el carácter y guardarlo
Finmientras
- Leer el registro de estado del KDMA para ver si todo ha transcurrido correctamente.
- Si ha habido error, volver a empezar.
- Procesar el sector leído. Seguir.
(a) La CPU tiene que realizar todas las acciones
Si la sincronización se realiza mediante encuesta, entonces los paso (1) y (6) se realizan mediante encuesta y cuando el programa principal pretende leer del disco tiene que realizar el algoritmo completo.
Si por el contrario la sincronización se realiza por interrupción, entonces cuando el controlador este dispuesto para transferir un carácter enviará la petición de interrupción. El programa principal realizará los siguientes pasos:
- Esperar a que el controlador esté disponible.
- Enviar el número de pista.
- Enviar el número de sector.
- Enviar la orden de lectura.
> *
Calcular cualquier otra cosa.
> *
Esperar la señal que indique el FIN de la transferencia.(10) Procesar el sector leído.
Una vez que el programa principal ha enviado la orden de lectura (RD, IN, MOV), cuando
Estructura de Computadores: E/S | 25 |
el controlador tiene un carácter preparado, activará la señal de interrupción. En cuanto la CPU detecta esta señal interrumpe el programa principal, saltando así a la rutina de atención de la interrupción. Al finalizar la ejecución de esta subrutina se reestablece la ejecución del programa principal en el punto en el que se había dejado. Si el disco que está ofreciendo los datos es muy rápido, siempre estará interrumpiendo a la CPU, que pasará gran parte de su tiempo en el proceso de entrada/salida. La rutina de atención a la interrupción es la siguiente:
- Leer el dato (carácter)
- guardar
- Mientras no más datos entonces leer estado
si error entonces
Esperar a que el controlador esté disponible Enviar número de pista
Enviar número de sector
Enviar orden de lectura sino FIN:=TRUE
Finsino finmientras
RETURN de la rutina de atención.
(b) Parte del trabajo lo realiza un controlador de DMA
Este circuito realiza tranferencias de datos entre la memoria y el controlador del periférico. En el caso anterior esta transferencia la realizaba bien el programa principal o la rutina de atención.
En este caso los datos se mueven directamente entre el periférico y la memoria. Cuando la CPU quiere leer un sector del disco, lo que tiene que hacer es lo siguiente:
- Enviar al KDMA la dirección inicial de los datos a transferir. Los datos traídos del disco se situarán en memoria a partir de esa dirección.
- Enviar al KDMA la cantidad de datos a leer (tamaño del sector).
- Programar el controlador del disco (número de pista, número de sector, …
y orden de lectura).
Después de la programación, cuando el controlador del disco tiene un carácter disponible se lo hará saber al KDMA para que este lo lea. Después, el KDMA incrementará el contador de la dirección de memoria y decrementará el contador de datos a transferir. Aún así todavía está sin resolver el problema de la sincronización.
* Sincronización por encuesta
:
Una vez enviada la orden de lectura al controlador del disco, el programa principal hace una encuesta sobre el registro de estado del KDMA hasta que este indica que la transferencia ha finalizado.
Queda bastante claro que esta no es la mejor opción. La CPU no puede trabajar durante toda la transferencia de datos ya que está continuamente leyendo el registro de estado. Por lo tanto no se gana nada comparando con la situación en la que al CPU cargaba con toda la responsabilidad. De ganar algo sería debido a que el KDMA sea más rápido que la CPU
Estructura de Computadores: E/S | 26 |
* Sincronización por interrupción:
El programa principal programa los controladores para dar comienzo a la transferencia de información. Una vez hecho esto, mientras se realiza la transferencia puede ocuparse de realizar otros cálculos (siempre que no utilicen la memoria). Una vez hecha toda la transferencia el KDMA avisa al procesador mediante una interrupción.
El programa principal sería así:
Programal el KDMA.
Programar el KDISKO.
Llevar a cabo trabajo independiente.
Esperar hasta que la variable FIN sea cierta.
Procesar el sector leído.
El KDMA interrumpirá a la CPU cuando se haya leído todo el sector. La rutina que se tiene que ejecutar como respuesta a la interrupción es la siguiente:
Leer el registro de estado
Si error entonces
Programar otra vez el KDMA
Programa otra vez el KDISCO sino
FIN:=verdadero
Finsi
Así se le quita a la CPU parate de un trabajo pesado, que ahora ejecuta un circuito electrónico (KDMA). La CPU sólo se entera una vez leído todo el sector.
PROCESADORES ESPECIALIZADOS EN E/S
En un sistema microcomputador convencional la CPU ejecuta programas de aplicación y programas de E/S. En estos sistemas existe un solo bus que está utilizado tanto por la CPU, como por los controladores de DMA y los periféricos de E/S.
Es evidente que el bus del sistema es un cuello de botella importante. Además si se realizan operaciones de E/S de alta velocidad, la CPU apenas podrá hacer nada. Por tanto, una buena solución de cara a mejorar el rendimiento total del sistema es usar procesadores especializados en E/S. Por una parte descargan a la CPU de realizar operaciones de E/S, a partir de ahora las realizará el IOP (InputOutput Processor = procesador de entrada/salida) , y también aportan soluciones de cara al uso de los buses. En este caso, se incorpora al sistema un circuito aún más inteligente que el KDMA, capaz de realizar, por si sólo, prácticamente todas las operaciones realizadas con la entradasalida.
Con este sistema la CPU queda separada de los dispositivos de E/S. La CPU puede dedicarse por completo a sus tareas de manipulación de datos con un alto rendimiento. El control de todas las operaciones de E/S es realizado por el IOP. La CPU sólo ha de mantener una función de supervisión del sistema y de mandar los comandos necesarios al IOP vía un mecanismo de paso de mensajes hacia el IOP. Es el IOP el que realiza todas las operaciones necesarias para efectuar con éxito la E/S. El IOP es responsable de la inicialización de periféricos, gestión de buffers de memoria, transferencia de datos, transformaciones simples de los datos, control de errores y repetición de operaciones.
La CPU se comunica con el IOP mediante mensajes que se almacenan en una memoria
Estructura de Computadores: E/S | 27 |
compartida. Cuando la CPU desea realizar una cierta operación de E/S simplemente avisa al procesador especializado de que ha de comenzar la ejecución de un programa de E/S almacenado a partir de una cierta posición de memoria. Este programa está escrito en lenguaje máquina del IOP.
El IOP aumenta el rendimiento total del sistema por 3 causas:
- Porque la arquitectura del IOP está especialmente diseñada para las operaciones de E/S y por tanto puede hacerlas a mayor velocidad.
- Porque libera a la CPU del peso de la programación de las E/S.
- Porque la CPU y el IOP actúan totalmente en paralelo, con muy pequeñas interferencias.