viernes, 7 de junio de 2013

3.4 ACCESO DIRECTO A MEMORIA



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