Muchos controladores, en
particular los correspondientes a los dispositivos de bloque, permiten el
acceso directo a memoria o DMA. Para explicar el funcionamiento del DMA,
analicemos primero la forma en que se lee el disco si no se utiliza este:
En primer lugar, el controlador
lee en serie el bloque (uno o mas sectores) de la unidad bit por bit, hasta que
todo el bloque se encuentre en el buffer interno del controlador. A
continuación calcula la suma de verificación para corroborar que no existen
errores de lectura. Entonces el controlador provoca una interrupción. Cuando el
sistema operativo empieza su ejecución, puede leer el bloque del disco por
medio del buffer del controlador, un byte o una palabra a la vez, en un ciclo,
en el que durante cada iteración se lee un byte o una palabra del registro del
controlador y se almacena en la memoria.
Es claro que un ciclo programado
en la CPU para la lectura de bytes desde el computador, uno a la vez,
desperdicia el tiempo de la CPU. DMA se ideó para liberar a la CPU de este
trabajo de bajo nivel. Al utilizarlo, la CPU le proporciona al controlador dos
elementos de la información, además de la dirección del bloque en el disco: la
dirección en memoria adonde debe ir el bloque y el numero de bytes por
transferir.
Después de que el controlador ha
leído todo el bloque del dispositivo a su buffer y ha corroborado la suma de
verificación, copia el primer byte o palabra a la memoria principal, en la
dirección especificada por medio de la dirección de la memoria DMA. Entonces
incrementa la dirección DMA y decrementa el contador DMA en el numero de bytes
que acaba de transferir. Este proceso se repite hasta que el contador se anula,
momento en el cual el contador provoca una interrupción. Al iniciar su ejecución
el sistema operativo, no tiene que copiar el bloque en la memoria, ya se
encuentra allí.
El controlador no almacena los
bytes en la memoria principal tan pronto llegan al disco, la razón consiste en
que una vez iniciada la transferencia del disco los bits siguen llegando al
disco constantemente, sin importar si el controlador esta listo o no para
recibirlos. Si el controlador intentara escribir los datos en la memoria de
forma directa, tendría que recurrir al bus del sistema para cada una de las
palabras transferidas
. Si el bus estuviera ocupado
debido a que lo utilizara otro dispositivo, entonces el controlador debería
esperar. Si la siguiente palabra llegase antes de que la anterior hubiera sido
almacenada, el controlador tendría que almacenar en alguna parte. Si el bus
estuviese demasiado ocupado, el controlador terminaría por almacenar unas
cuantas palabras y con gran tarea de administración al mismo tiempo. Cuando el
bloque se guarda en un buffer interno, el bus no se necesita sino hasta que el
DMA comienza; por ello, el diseño del controlador es más sencillo, puesto que
la transferencia DMA a la memoria ya no es un aspecto critico del tiempo. (Sin
embargo, algunos controladores si transfieren en forma directa a la memoria,
con una pequeña proporción de almacenamiento en buffers internos, pero si el
bus esta demasiado ocupado, se debe terminar una transferencia con un error de
sobre ejecución).
El proceso de dos etapas de
almacenamiento en un buffer interno descrito arriba tiene importantes consecuencias
en el rendimiento de las entradas y salidas. Aunque los datos se transfieren
del controlador a la memoria, ya sea mediante la CPU o mediante el propio
controlador, el siguiente sector pasará debajo de la cabeza del disco y los
bits llegarán al controlador. Los controladores simples no pueden enfrentarse a
las entradas y salidas simultáneas, de forma, que mientras se lleva a cabo una
transferencia en la memoria, el sector que pasa debajo de la cabeza del disco
se pierde.
Como resultado el controlador solo
podrá leer hasta el siguiente bloque. La lectura de una pista completa se
realizará entonces n dos rotaciones completas, una para los bloques nones y
otra para los bloques pares. Si el tiempo necesario para una transferencia de
un bloque del controlador a la memoria por medio del bus es mayor que el tiempo
necesario para leer un bloque del disco, podría ser necesario leer un bloque y
después saltar dos (o más) bloques.
El salto de bloques, que se
ejecuta para darle tiempo al controlador para la transferencia de datos a la
memoria se llama separación. Al dar formato al disco, los bloques se numeran
tomando en cuenta el factor de separación.
La idea de numerar los bloques de
esta menara es permitir al sistema operativo que lea los bloques con numeración
consecutiva y conserve la máxima velocidad posible del hardware. Si los bloques
estuvieran numerados como en la figura “a”, pero el controlador solo pudiera
leer bloques alternados, un sistema operativo que asignara bloques
consecutivos, a un archivo de ocho bloques necesitaría ocho rotaciones de disco
para leer los bloques cero a siete en orden. (Por supuesto, si el sistema
operativo supiera del problema y acomodara los bloques de otra manera, podría
resolver el problema en software, pero es mejor que el controlador se preocupe
por la separación).
No hay comentarios:
Publicar un comentario