Dispositivos de bloque y dispositivos de caracteres



Descargar 155.69 Kb.
Página1/2
Fecha de conversión01.05.2018
Tamaño155.69 Kb.
  1   2
Capítulo 3
Entrada y salida
Principios del hardware de E/S
Entenderemos por hardware de E/S como la programación de los dispositivos de entrada y salida.
Los dispositivos de E/S se dividen en dos categorías: dispositivos de bloque y dispositivos de caracteres. Los dispositivos de bloque transfieren la información en bloques direccionables de tamaño fijo. Los dispositivos de caracteres aceptan o entregan un flujo de caracteres sin importar la estructura.
Controladores de dispositivo
Los dispositivos constan de una parte mecánica y otra electrónica. A la parte electrónica se le llama controlador o manejador del dispositivo. El sistema operativo trata generalmente con el controlador. La figura 1 muestra una arquitectura típica

Figura 1. Modelo para conectar la CPU, memoria, controladores y dispositivos de E/S.


El trabajo del controlador es convertir un flujo de bits en serie en un bloque de bytes y realizar cualquier corrección de errores que se necesite. La figura 2 muestra los vectores de interrupción y direcciones de memoria asignadas a los controladores en una IBM PC.

Controladores de E/S

Direcciones de E/S

Vector de interrupción

Reloj

040-043

8

Teclado

060-063

9

RS232 secundaria

2F8-2FF

11

Disco duro

320-32F

13

Impresora

378-37F

15

Despliegue monocromático

3B8-3BF

-

Despliegue de color

3D0-3DF

-

Disco flexible

3F0-3F7

14

RS232 primaria

3F8-3FF

12

Figura 2. Algunos ejemplos de controladores, sus direcciones de E/S y sus vectores de interrupción en la IBM PC.

Acceso directo a memoria DMA
El acceso directo a memoria se requiere para liberar a la CPU en la transferencia de bloque de información de o hacia la memoria. La CPU debe especificarle al controlador de DMA la dirección de la memoria donde se dirige el bloque y el número de bytes a transferir, como se muestra en la figura 3.

Figura 3. Una transferencia DMA es efectuada completamente por el controlador.


Al terminar la transferencia del bloque, el DMA informa mediante una interrupción al sistema operativo. En el caso de un disco, si durante el tiempo que transcurre la transferencia el controlador no logra leer otro bloque de información porque la cabeza ya pasó sobre el siguiente sector, se pueden numerar los sectores alternadamente, a este método se le llama intercalación (interleave). La figura 4 muestra un disco sin intercalación, con intercalación sencilla y doble.

Figura 4. (a) Sin intercalación. (b) Intercalación sencilla. (c) Doble intercalación.


Principios del software de E/S
La idea del software de E/S es ocultar los detalles del manejo los dispositivos y suministrar una interfaz agradable a los usuarios.
Objetivo del software de E/S
Un concepto importante es el de independencia del dispositivo. Esto quiere decir que los archivos deben utilizarse de la misma manera independientemente de si están en un disco duro o en un disco flexible. Un comando como
sort output
debe poderse ejecutar aun si la entrada es el teclado y la salida es la terminal.
Otro aspecto importante es el de nominación, esto es, los archivos y dispositivos deben reconocerse con nombres que no dependan del dispositivo en ninguna manera, como en UNIX. Por otro lado el manejo de errores debe hacerse en los estratos más bajo. Y solo se deberá informar a los estratos superiores si el estrato bajo no puede manejarlo.
Los dispositivos se clasifican en compartibles y dedicados. Los compartibles son como los discos, varios usuarios pueden hacer uso de ellos al mismo tiempo sin crear conflictos. Los dedicados como las impresoras, solo aceptan un usuario a la vez.
El software de E/S se divide en cuatro estratos para conseguir estos resultados.
1. Manejadores de interrupciones

2. Manejadores de dispositivos

3. Software del sistema operativo independiente del dispositivo

4. Software a nivel del usuario


Manejadores de interrupciones
Las interrupciones son indeseables, una forma de ocultarlas es bloquear los procesos de E/S siempre que ocurra un comando de E/S y se espere una interrupción. Al recibir la interrupción, el procedimiento de interrupciones desbloquea al manejador mediante un semáforo o mediante señales.
Manejadores de dispositivos
En términos generales, el trabajo de un manejador de dispositivo consiste en aceptar solicitudes abstractas del software independiente del dispositivo que está sobre él y observar que se cumpla la requisición. Después de que la operación se ha completado debe verificar si hubo errores. Si todo está bien, el manejador puede hacer que pasen los datos al software independiente del dispositivo.
Software del sistema operativo independiente del dispositivo
La función básica del software independiente del dispositivo consiste en ejecutar las funciones de E/S que son comunes a todos los dispositivos y proporcionar una interfaz uniforme al software a nivel del usuario.
El software independiente del dispositivo se hace cargo de describir los nombres simbólicos de dispositivos en el manejador adecuado. Un nombre como /dev/tty0, especifica a un nodo i de un archivo especial y este nodo i contiene un número de dispositivo mayor, el cual se pasa como parámetro al manejador para especificar la unidad que se leerá o se escribirá. En cuanto a protección, se utilizan lis bits rwx.
El tamaño real del bloque que manejan los dispositivos debe ser ocultado por el software independiente del dispositivo proporcionando un tamaño lógico. Similarmente, para dispositivos orientados a caracteres, el número real de bytes que transmiten o reciben deberá ser ocultado.
Para dispositivos de bloques los usuarios deben tener la libertad de escribir o leer fracciones de bloques. Para dispositivos de caracteres, como el teclado, se puede enviar entrada si que se la necesite.
El manejo de errores es efectuado por los manejadores. El software independiente del dispositivo solo se entera de que ocurre y toma la acción dependiendo de la gravedad del error. La tabla de la figura 5 muestra las funciones del software de E/S independiente del dispositivo.


Sincronización uniforme de los manejadores de dispositivos

Nominación de dispositivos

Protección de los dispositivos

Proporción de un tamaño de bloque independiente del dispositivo

Separación

Asignación del almacenamiento en dispositivo de bloque

Asignación y devolución de dispositivos dedicados

Informe de errores

Figura 5. Funciones del software de E/S independiente del dispositivo.
Software a nivel del usuario
Las llamadas al sistema, entre ellas las llamadas al sistema se E/S, normalmente son realizadas por procedimientos de biblioteca. Estos procedimientos hacen un poco más que colocar sus parámetros en el sitio adecuado para la llamada al sistema.
Otro software a nivel de usuario es el manejo de la cola de impresión. La cola es controlada por un software llamado demonio impresor, el cual maneja un directorio especial llamado directorio de manejo de cola de impresión. Los demonios también se utilizan en la transferencia de archivos de un sistema a otro. La figura 6 muestra los estratos de E/S y las funciones principales.

Figura 6. Estratos del sistema de E/S y las funciones principales de cada estrato.


Estancamientos
Supóngase que una computadora tiene una unidad de cinta y una graficadora. El proceso A solicita la cinta y B, la graficadora. Ahora A pide la graficadora (sin renunciar a la cinta) y B pide la cinta (sin renunciar a la graficadora), de manera que ambos procesos se bloquean indefinidamente. A esta situación se le llama estancamiento. En la figura 7 se muestra esta situación, los procesos se representan con círculos, los recursos con cuadros, una flecha de un recurso a un proceso indica que el recurso esta concedido a ese proceso.

Figura 7. Gráficas de asignación de recursos. (a) Contención de un recurso. (b) Solicitud de un recurso. (c) Estancamiento.


Un ciclo en una gráfica indica la presencia de un estancamiento. La figura 8 muestra una situación más complicada, tres procesos A, B y C, compiten por tres recursos, R, S y T.

Figura 8. Ejemplo de la forma en que ocurre el estancamiento y como se puede evitar.


Hay cuatro condiciones para que haya estancamiento:
1. Condición de exclusión mutua. Cada recurso se asigna por lo regular exactamente a un proceso o bien esta disponible.
2. Condición de contención y espera. Los procesos que regularmente contienen recursos otorgados antes pueden solicitar nuevos recursos.
3. condición de sin prioridad. Los recursos previamente otorgados no pueden extraerse por la fuerza de un proceso. Deben ser liberados en forma explícita por el proceso que lo contiene.
4. Condición de espera circular. Debe haber una cadena circular de dos o más procesos, cada uno de los cuales esté esperando un recurso contenido en el siguiente miembro de la cadena.
Existen cuatro estrategias para trabajar con los estancamientos.
1. Simplemente se ignora el problema por completo.

2. Detección y recuperación.

3. Prevención, anulando una de las cuatro condiciones necesarias.

4. Evitación dinámica por medio de una distribución cuidadosa de los recursos.


Algoritmo del avestruz
En unix simplemente se ignora el problema. Hay que tomar en cuenta que se pueden producir estancamientos por causas como: número limitado de ranuras para procesos (la llamada fork podría fracasar), el número máximo de archivos abiertos por el tamaño de la tabla de nodos i, el espacio para intercambio (swap) limitado, etc.
Detección y recuperación
Esta técnica consiste en eliminar los ciclos cuando estos se produzcan, esto se hace eliminando un proceso si se produce un ciclo al concederle un recurso.
Prevención del estancamiento
Esta técnica consiste en garantizar que nunca se produzcan las cuatro condiciones para conducir al estancamiento. Esto se hace, por ejemplo, con el demonio impresor, ya que es el único capacitado para solicitar la impresora teniendo, por tanto, exclusión mutua.

Figura 9. (a) Recursos ordenados numéricamente. (b) Gráfica de recursos.

Para prevenir el estancamiento se puede tratar de impedir que se produzca alguna de las cuatro condiciones que lo producen. La primera se elimina quitando la exclusión mutua, sin embargo, es difícil o imposible manejar todos los dispositivos de esta manera.
El segundo punto se resolvería si todo proceso solicitará con antelación todos los recursos que necesita. Si todo está disponible, se le asignan los recursos si no esperaría. Nuevamente, esta solución no es muy adecuada en términos de eficiencia.
La tercera condición (sin prioridad) es aun más difícil de eliminar.
La cuarta condición puede eliminarse mediante un esquema de numeración. A cada recurso se le asigna un número, un proceso que tenga un recurso i, solo puede solicitar otro con número j tal que j > i. De esta manera es posible mostrar que no se producen ciclos como se muestra en la figura 9.
La figura 10 resume los diversos métodos para prevención de estancamientos.


Condición

Método

Exclusión mutua

Todo se maneja por cola de impresión

Contención y espera

Inicialmente se piden todos los recursos

No hay prioridad

Se retiran los recursos

Espera circular

Los recursos se ordenan numéricamente

Figura 10. Resumen de métodos para la prevención de estancamientos.
Evitación del estancamiento
Existen algoritmos que impiden que se produzcan estancamientos. a continuación veremos algunos de ellos.
El algoritmo del banquero para un solo recurso
Este algoritmo esta diseñado para un solo tipo de recurso. En la figura 11(a) se observan cuatro clientes, a cada uno se le ha otorgado cierto número de unidades de crédito. El banquero sabe que no todos los clientes necesitarán su límite de crédito máximo de inmediato, de manera que solo ha reservado 10 unidades en lugar de las 22 para darles servicio (en esta analogía los clientes son procesos, las unidades son, por ejemplo, unidades de cinta y el banquero es el sistema operativo).
En cierto momento, la situación es como se muestra en la figura 11(b), A una lista de clientes que muestra el dinero que ya se prestó y el máximo de crédito disponible se le llama estado del sistema con respecto a la asignación de recursos.

Figura 11. Tres estados de asignación de recursos. (a) Seguro. (b) Seguro. (c) Inseguro.


Se dice que el estado es seguro si existe una secuencia de otros estados que lleva a todos los clientes que obtienen préstamos hasta sus límites de crédito. El estado de la figura 11 (b) es seguro porque con dos unidades restantes, el banquero puede demorar cualquier solicitud salvo la de Marvin, con lo que se permite que Marvin termine y devuelva sus cuatro recursos. Con cuatro unidades en las manos, el banquero puede permitir que Susane o Bárbara tengan las unidades que necesitan y así sucesivamente.
Considérese lo que sucedería si en la figura 11 (b) se otorga una solicitud a Bárbara de más de una unidad. Se tendría la situación de la figura 11 (c), que es riesgosa. Si todos los clientes solicitarán sus límites máximos, el banquero no podría complacer a ninguno y habría un estancamiento.
El algoritmo del banquero consiste en considerar cada requisición cuando ocurre y advertir sí su concesión nos lleva a un estado seguro. Si lo hace, se aprueba la solicitud; de lo contrario, se pospone para más adelante.
Trayectorias de recursos
En la figura 12 se aprecia un modelo para trabajar con dos procesos y dos recursos, una graficadora y una impresora. El eje horizontal representa el número de instrucciones ejecutadas por el proceso A. El eje vertical denota el número de instrucciones ejecutadas por el proceso B, en I1 A solicita la impresora; en I2 necesita una graficadora. La primera la devuelve en I3 y la segunda en I4. El proceso B necesita la graficadora de I5 a I7 y la impresora de I6 a I8.
Cada punto del diagrama representa un estado de enlace de los dos procesos. Inicialmente, el estado es p. Si el planificador decide ejecutar A, se llega a q, en q la trayectoria se vuelve vertical al ejecutarse B hasta llegar a r. Al volver ejecutar a de r a s, se atraviesa I1, A solicita la impresora y se le otorga, cuando B llega a t, solicita la graficadora. Si se entra en la caja delimitada por I1 e I2 e I5 e I6, se llegará a la situación de que A solicite la graficadora y B la impresora, produciéndose un estancamiento. Lo más seguro es continuar ejecutando A hasta que haga uso de la impresora y la graficadora.

Figura 12. Dos trayectorias de recursos de un proceso.


El algoritmo del banquero para múltiples recursos

En la figura 13 se aprecian dos matrices. La de la izquierda muestra cuántas unidades de cada recurso se asignan corrientemente a cada uno de los procesos. La de la derecha muestra cuántos recursos sigue necesitando cada proceso para terminar. Los tres vectores de la derecha muestran los recursos existentes, E, los recursos poseídos, P , y los disponibles, A. El algoritmo para verificar si un estado es seguro es:

1. Búsquese un renglón, R, cuyo recurso no satisfecho necesite todos los menores que A. Si no existe tal renglón, el sistema se estanca porque no ningún proceso puede ejecutarse hasta terminar.

2. Supóngase que el procesos del renglón elegido solicita todos los recursos que necesita (lo que garantiza que es posible) y termina. Márquese este proceso como terminado y súmese todos sus recursos al vector A.

3. Repítase los pasos 1 y 2 hasta que todos los procesos se marquen terminados, en cuyo caso el estado inicial era seguro, o bien hasta que ocurra un estancamiento, en cuyo caso era riesgoso.

Figura 13. El algoritmo del banquero con múltiples recursos.



Panorama general de la e/s en minix
Daremos un breve panorama de la E/S en minix.
Manejadores de interrupciones en minix
Muchos de los manejadores de dispositivos dan inicio a algún dispositivo de E/S y después se bloquean, esperando la llegada de un mensaje. Otros no dan inicio a ningún dispositivo físico de E/S (por ejemplo, la lectura de un disco RAM) y no esperan un mensaje de un dispositivo de E/S.
Manejadores de dispositivos en minix
Para cada clase de dispositivo de E/S presente en minix, existe una tarea de E/S aparte (manejador de dispositivo). Estos manejadores son procesos desarrollados, cada uno con su estado, mapa de memoria, etc. Los manejadores de dispositivos se comunican entre sí y con el sistema de archivos a través de mensajes. Cada manejador se escribe como un archivo fuente individual, como clock.c o floppy.c. Los manejadores se enlazan en un solo ejecutable y comparten un solo espacio de memoria. En minix un proceso lee un archivo enviando un mensaje al proceso de sistema de archivo. El sistema de archivo, a su vez, puede enviar un mensaje al manejador de disco pidiéndole que lea el bloque que se necesita (figura 14a). En unix todos los procesos tienen dos partes: una parte del espacio del usuario y otra parte del espacio del kernel (figura 14b). Cuando se hace una llamada al sistema, el sistema operativo cambia de la parte del espacio de usuario a la del espacio del kernel en forma un tanto mágica.

Figura 14. Dos maneras de estructurar la comunicación entre el usuario y el sistema.


Los manejadores de dispositivos en unix son simplemente procedimientos del kernel que son llamados par la parte del espacio del kernel del proceso. Cuando un manejador necesita esperar una interrupción, éste llama a un procedimiento del kernel que lo bloquea hasta que algún manejador de interrupciones lo desbloquea.
El método de unix es más eficiente, puesto que las llamadas a los procedimientos son mucho más rápidas que la emisión de mensajes.
Para dispositivos de bloques, los campos de los mensajes de solicitud y contestación se muestran en la figura 15.
SOLICITUDES

Campo

Tipo

Significado

m.m_type

Int

operación solicitada

m.DEVICE

Int

Dispositivo menor que se usa

m.POSITION

Long

Posición en el dispositivo menor

m.PROC_NR

Int

Proceso del usuario que solicita la E/S

m.ADDRESS

char *

Dirección dentro de PROC_NR

m.COUNT

Int

Bytes por transferir

CONTESTACIONES



Campo

Tipo

Significado

m.m_type

int

Siempre TASK_REPLY

m.REP_PROC_NR

int

Igual que PROC_NR en la solicitud

m.REP_STATUS

int

# de bytes transferidos o # de error

Figura 15. Campos del mensaje m, enviados a y por manejadores de dispositivos de bloque.
El programa principal de cada manejador es estructuralmente el mismo y se perfila en la figura 16. Cuando el sistema recién llega, cada uno de los manejadores es activado a su vez para darles una oportunidad de inicializar tablas internas y cosas semejantes. Después cada uno se bloquea intentando tomar un mensaje. Cuando llega un mensaje, se guarda la identidad del solicitante y se llama a un procedimiento para efectuar el trabajo, con un procedimiento diferente invocado para cada operación disponible. Después de que el trabajo se ha terminado, se envía una contestación al solicitante, después la tareas regresa a la parte superior del ciclo para esperar la siguiente solicitud.
message mess; /* buffer de mensajes */
io_task()

{

int r, caller;


inicialize(); /* sólo se hace una vez, durante la inic. del sistema */
while (TRUE) {

receive(ANY, &mess); /* espera una solicitud para trabajar */

caller = mess.m_source; /* proceso del cual provino el mensaje */

switch(mess.m_type) { /* maneja cada tipo de solicitud posible */

case READ: r = do_read(); break;

case WRITE: r = do_write(); break;

case OTHER: r = do_other(); break;

default: r = ERROR;

}

mess.m_type = TASK_REPLY;



mess.REP_STATUS = r; /* código del resultado */

send(caller, &mess); /* enviar mensaje de contestación al solicitante */



}

}

Figura 16. Perfil del procedimiento central de una tarea de E/S.


Cada uno de los procedimientos do_xxx maneja una de las operaciones que el manejador es capaz de realizar. Este produce un código de condición que indica lo que sucedió. El código de condición, que se incluye en el mensaje de contestación como el campo REP_STATUS, es el conteo de bytes que se transfiere (cero o positivo) si todo salió bien, o el número de error (negativo) si algo salió mal. Este conteo puede diferir del número de bytes solicitado. Por ejemplo, en las terminales cuando mucho se produce una línea, aun si el conteo solicitado es mayor.
Software de E/S independiente del dispositivo en minix
El proceso del sistema de archivo de minix contiene todo el código de E/S independiente del dispositivo. El sistema de E/S se relaciona tan íntimamente con el sistema de archivo que se unieron en un solo proceso.
Software de E/S a nivel de usuario en minix
El modelo general que se perfiló antes en este capítulo también se aplica aquí. Se dispone de procedimientos de biblioteca para hacer llamadas al sistema y para convertir de binario a ASCII y de ASCII a binario. La configuración estándar de minix no contiene demonios de manejo por cola de impresión.
Manejo del estancamiento en minix
Se ignora el problema por completo. minix no contiene dispositivos dedicados de E/S, aunque si alguien deseara colocar una unidad de cinta magnética estándar industrial de 9 pistas en una IBM PC, elaborando software para ella, no ocasionaría ningún problema especial. El único sitio en que pueden ocurrir estancamientos es con los recursos compartidos implícitos, como las ranuras de la tabla de procesos, ranuras de la tablas de nodos i, etc.
Existen algunos sitios donde se debe tener consideración para evitar problemas. El principal es la interacción del sistema de archivo y el manejador de memoria. El manejador de memoria envía mensajes al sistema de archivos para leer un archivo binario (programa ejecutable) durante una llamada al sistema exec, así como en otros contextos. Si el sistema de archivo no está ocioso cuando el manejador de memoria intenta enviarle un mensaje, el manejador de memoria se bloqueará. Si el sistema de archivo debe después intentar enviar un mensaje al manejador de memoria, también descubrirá que la cita falla y se bloqueará, provocando un estancamiento.
Este problema se ha evitado mediante la construcción del sistema en forma tal que el sistema de archivo nunca envíe mensajes de solicitud al manejador de memoria, solo contestaciones, con una excepción mínima. La única excepción es que al activarse el sistema de archivo informa su tamaño al manejador de memoria, que se garantiza lo está esperando.
Discos de RAM
El disco de RAM es un buen ejemplo para ser estudiado porque tiene todas las propiedades de los dispositivos de bloque en general (a excepción de la E/S real, porque el "disco" es realmente una parte de la memoria). El disco flexible muestra como se ve un manejador de disco real, con defectos y todo. El reloj es importante porque todo sistema tiene uno y porque es completamente diferente a los otros manejadores. El manejador de la terminal es importante por derecho propio y, además, es un buen ejemplo de dispositivo de caracteres.
Hardware y software en discos de RAM
La idea que ostenta un disco de RAM es simple. Un dispositivo de bloque es un medio de almacenamiento con dos comandos: la escritura de un bloque y la lectura de un bloque. Normalmente estos bloques se almacenan en memorias rotatorias, como discos flexibles o duros. Un disco de RAM es más simple. Un disco de RAM tiene la ventaja de tener acceso instantáneo, haciéndolo adecuado para almacenar programas o datos que sean accesados con frecuencia.
Al colocar el directorio raíz en al disco RAM, el único disco flexible puede montarse y desmontarse a voluntad, permitiendo que haya medios removibles. Al tener el dispositivo raíz en el disco de RAM el sistema se vuelve altamente flexible: cualquier combinación de discos flexibles y duros puede montarse en él.
Con los sistemas de archivo montados, el dispositivo raíz siempre está presente y en una localidad fija, y los sistemas de archivo removibles pueden montarse en el árbol de archivos para formar un sistema de archivo integrado. Una vez que todo se ha montado, el usuario no necesita preocuparse en absoluto por el dispositivo en el cual está el archivo.
En contraste, en los sistemas como ms-dos, el usuario debe especificar la localidad de cada archivo, ya sea en forma explícita como en B:FILE o mediante ciertas omisiones (dispositivo corriente, directorio corriente, etc.).
La figura 17 muestra la idea implicada por el disco de RAM. El disco de RAM se divide en n bloques, según la cantidad de memoria que se le haya asignado. Cada bloque es del mismo tamaño que el tamaño de bloque de los discos reales. Cuando el manejador recibe un mensaje para leer o escribir un bloque, simplemente determina el sitio en la memoria del disco de RAM donde yace el bloque y lee o escribe en él. Normalmente la transferencia se hará llamando a un procedimiento de lenguaje ensamblador que copie en o del programa del usuario a la máxima velocidad de que el hardware es capaz.

Figura 17. Un disco de RAM.


Un manejador de disco de RAM puede tener varias áreas de la memoria utilizadas como disco de RAM, cada una distinguida por un número de dispositivo menor diferente. Por lo general, estas áreas serán distintas, pero en algunas situaciones puede convenir hacer que se superpongan.
Manejador del disco de RAM en minix
El manejador de disco de RAM es en realidad cuatro manejadores íntimamente relacionados en uno. Cada mensaje que se le envía especifica un dispositivo menor como sigue:
0: /dev/ram 1: /dev/mem 2: /dev/kmem 3: /dev/null
El primer archivo especial que se listó antes, /dev/ram, es un disco de RAM verdadero. Los dos dispositivos menores que siguen se utilizan para leer y escribir memoria física y la memoria del kernel, respectivamente. Cuando /dev/mem se abre y se lee, produce el contenido de las localidades de memoria física que comienzan en 0 absoluto (vectores de interrupción). El archivo especial /dev/kmem es como /dev/mem, salvo que el byte 0 de este archivo es el byte 0 de la memoria del kernel (dirección física 0x600 o bien 1536 decimal en minix).
El último archivo de este grupo, /dev/null, es un archivo especial que acepta datos y los desecha. Se utiliza comúnmente en comandos del shell cuando el programa solicitado genere una salida que no se necesita.
La estructura integral del manejador de disco de RAM sigue el modelo de la figura 16. El ciclo principal acepta mensajes y los despacha a do_mem para lectura y escritura o bien a do_setup para el mensaje especial que indica al manejador dónde está localizado el disco de RAM. El código para manejar, /dev/ram, /dev/mem y /dev/kmem es idéntico. La única diferencia entre ellos es que cada uno corresponde a una porción diferente de memoria, indicada por los arreglos ram_origin y ram_limit, cada uno indexado por el número de dispositivo menor.
Discos
Hardware del disco
Todos los discos reales están organizados en cilindros, donde cada uno contiene tantas pistas como haya cabezas apiladas verticalmente. Las pistas se dividen en sectores, donde el número de sectores en torno a la circunferencia en comúnmente de 8 a 32. Todos los sectores contienen el mismo número de bytes. Los parámetros de un disco flexible de la IBM PC se muestran en la figura 18.


Número de cilindros

Pistas por cilindro

Sectores por pista

Sectores por disquete

Bytes por sector

Bytes por disquete



40

2

9



720

512


368640

Tiempo de localización (cilindros adyacentes)

Tiempo de localización (caso promedio)

Tiempo de rotación

Tiempo de arranque/detención del motor

Tiempo para transferir un sector


6 ms

77 ms


200 ms

250 ms


22 ms

Figura 18. Parámetros de los discos flexibles de la IBM PC.
Software del disco
El tiempo para leer o escribir un bloque del disco se determina por tres factores: el tiempo de localización (tiempo para mover el brazo al cilindro adecuado), la demora rotatoria (tiempo para que el sector adecuado gire hasta quedar debajo de la cabeza) y el tiempo real de transferencia.
Algoritmos de planificación del brazo del disco
Un algoritmo consiste en leer siempre el cilindro más cercano (SSF). La figura 19 muestra como funciona para la secuencia 11, 3, 29, 14, 31, 9 y 12, el algoritmo seguiría el orden 11, 12, 9, 14, 3, 29 y 31.

Figura 19. Algoritmo de planificación de disco, primero la localización más breve (SSF).


Con un disco muy cargado, el brazo tendrá que quedarse a la mitad del disco la mayor parte del tiempo, de manera que las solicitudes en cualquier extremo tendrán que esperar hasta que una fluctuación estadística en la carga ocasione que no haya solicitudes en la proximidad del centro.
El algoritmo del elevador sigue otra estrategia. Esta consiste en recordar la dirección en que se mueve el brazo y continuar haciendo ese movimiento hasta agotar todas las solicitudes. La figura 20 muestra la respuesta de este algoritmo para la secuencia de solicitudes anterior, en este caso el orden de atención sería 11, 12, 14, 29, 31, 9 y 3.

Figura 20. Algoritmo del elevador para programar solicitudes del disco.


Manejo de errores
Algunos de los más comunes son:
1. Error de programación (por ejemplo, solicitud de un sector no existente).

2. Error transitorio de la suma de verificación (por ejemplo, ocasionado por polvo en la cabeza).

3. Error permanente de la suma de verificación (por ejemplo, bloque del disco físicamente dañado).

4. Error de localización (por ejemplo, el brazo se envió al cilindro 6 pero se fue al 7).

5. Error del controlador (por ejemplo, el controlador se niega a aceptar comandos).
Corresponde al manejador del disco manejar cada uno de éstos de la mejor manera que pueda.
Los errores de programación ocurren cuando el manejador indica al controlador que debe localizar un cilindro no existente, leer un sector que no existe, utilizar una cabeza inexistente o bien realizar una transferencia a o de una memoria que no existe.
Los errores transitorios de la suma de verificación son provocados por partículas de polvo que hay en el aire y que se meten entre la cabeza y la superficie del disco. La mayor parte del tiempo éstos se pueden eliminar simplemente repitiendo la operación algunas veces. Si el error persiste, el bloque tiene que marcarse como bloque erróneo y evitarse.
Algunos controladores inteligentes reservan algunas pistas que normalmente no están disponibles para los programas de usuario. Cuando se formatea una unidad de disco, el controlador determina cuáles bloques son erróneos y automáticamente sustituye una de las pistas de reserva por la errónea.
Los errores de localización son provocados por problemas mecánicos en el brazo. El controlador lleva en el interior el registro de la posición del brazo. Para realizar una localización, éste emite una serie de pulsaciones al motor del brazo, una pulsación por cilindro, cuando el brazo llega su destino, el controlador lee el número real del cilindro. Si el brazo está en un sitio erróneo, ha ocurrido un error de localización.
El manejador maneja este error emitiendo un comando recalibrate, para mover el brazo lo más afuera posible y posicionarse en el cilindro 0.
Panorama general del manejador del disco flexible en minix
El manejador del disco flexible no utiliza SSF o el algoritmo del elevador. Es estrictamente secuencial y acepta una solicitud y la ejecuta antes de llegar a aceptar la siguiente solicitud (FCFS).
La figura 21 muestra la relación entre los procedimientos principales dentro del manejador. En condiciones normales (es decir, sin errores), do_rdwt llama a otros cinco procedimientos, cada uno de los cuales realiza parte del trabajo de una transferencia. El primero, dma_setup, construye los registros del chip DMA, de manera que una operación de lectura, después de que el controlador haya leído los datos de su buffer interno, el chip DMA se hará cargo de la solicitud de ciclos del bus para transferir los datos a la memoria sin molestar a la CPU.

Figura 21. Procedimientos principales que forman el manejador del disco flexible.


El siguiente procedimiento, start_motor, verifica si el motor está en funcionamiento. Si lo está, el procedimiento simplemente regresa. Si está apagado, el motor se enciende.
Seek (localización) verifica si la unidad ya esta posicionada en el cilindro correcto. Si lo está, ordena al controlador haga una localización y después efectúa una operación receive para esperar un mensaje de interrupción que se envía cuando se haya completado la localización.
El comando real para leer o escribir el disco es emitido por transfer (transferencia). Este también realiza una operación receive después de emitir el comando para esperar a que termine. Cuando el comando ha terminado, transfer inspecciona los registros de condición del controlador para observar si ocurrió algún error. Si ocurrió un error de la suma de verificación, el procedimiento devuelve un código de error a do_rdwt, de manera que la transferencia puede volver a intentarse.
El procedimiento final envía un mensaje a la tarea del reloj pidiéndole llamar a cierto procedimiento (parte del conductor del disco) en 3 segs.
Algunos procedimientos de subsidio que se usan en el conductor del disco se enlistan a continuación:
1. stop_motor: detiene el motor de la unidad.

2. fcb_out: emite un comando al controlador.

3. fcb_result: extrae los resultados del comando del controlador.

4. recalibrate: vuelve a calibrar una unidad después de un error de localización.

5. reset: vuelve a establecer el controlador después de un error grave.

6. send_mess: se hace cargo de la emisión real de un mensaje.


Relojes
Los relojes controlan la hora del día y evitan que algún proceso monopolice a la CPU, entre otras cosas.
Hardware del reloj
El reloj más simple es el que utiliza la frecuencia de la línea como frecuencia primaria. El otro tipo de reloj utiliza un cristal de cuarzo, como se muestra en la figura 22. El contador se carga con algún valor y se disminuye en cada pulso. Cuando el contador llega a cero se genera una interrupción a la CPU.

Figura 22. Reloj programable.


En el modo no repetido, se genera un solo pulso. En el modo de onda cuadrada, se genera un tren de pulsos. Estas interrupciones se llaman pulsaciones de reloj.
Software del reloj
Las funciones del manejador de reloj son, entre otras:
1. Conservación de la hora del día.

2. Prevención de que los procesos se ejecuten más tiempo del que tienen autorizado.

3. Conteo para uso de la CPU.

4. Manejo de la llamada al sistema alarm que hacen los procesos de los usuarios.

5. Provisión de cronómetros guardianes para cuidar partes del sistema en sí.

6. Realización de perfiles, monitoreo y recolección de estadísticas.


Para conservar la hora del día simplemente se incrementa un contador en cada pulsación del reloj. En la figura 23 se muestran tres maneras de conservar la hora del día.

Figura 23. Tres maneras de conservar la hora del día.


Cuando un proceso es iniciado, el planificador debe inicializar un contador con el valor de la cantidad de ese proceso en pulsaciones de reloj. En cada interrupción del reloj, el manejador disminuye el contador de la cantidad en 1. Cuando el contador llega a cero, el manejador del reloj llama al planificador para formar otro proceso.
La contabilidad se puede llevar a cabo dando inicio a un cronómetro, distinto del que corresponde al sistema central, siempre que se de inicio a un proceso, cuando el proceso se detiene, se lee el cronómetro para indicar cuanto tiempo se ha ejecutado el proceso.
Es posible simular varios relojes con un solo reloj físico. Se puede utilizar una lista enlazada como en la figura 24. Cada captación de la lista indica cuántas pulsaciones del reloj después de la anterior se debe esperar antes de producir una señal. En este ejemplo, las señales están pendientes para 4203, 4207, 4213, 4215 y 4216.

Figura 24. Simulación de cronómetros múltiples con un solo reloj.


Algunas partes del sistema también necesitan establecer cronómetros. Estos se conocen como cronómetros guardianes, como se vio antes para el manejador del disco. El mecanismo es similar al de las señales del usuario. La diferencia es que cuando el cronómetro se agota, en vez de producir una señal, el manejador del reloj llama a un procedimiento proporcionado por el solicitante.
Panorama del manejador del reloj en minix
El manejador acepta cuatro tipos de mensajes como sigue:
1. SET_ALARM (número de proceso, procedimiento por llamar, demora)

2. GET_TIME

3. SET_TIME (la nueva hora en segundos)

4. CLOCK_TICK


SET_ALARM permite a un proceso fijar un cronómetro que se agote en un número especificado de pulsaciones de reloj. También lo utilizan las tareas para los cronómetros guardianes.
GET_TIME produce el tiempo real corriente con el número de segundos que han transcurrido desde el 1 de enero de 1970 a las 12:00 a.m. SET_TIME fija el tiempo real.
CLOCK_TICK es el mensaje que se envía al manejador cuando ocurre una interrupción de reloj.

Terminales
La tarea del manejador de la terminal es ocultar la diferencias entre las diferentes terminales, de manera que la parte independiente del dispositivo del sistema operativo y los programas de los usuarios no tengan que rescribirse para cada tipo de terminal.
Hardware de la terminal
Las terminales se pueden dividir en dos amplias categorías: las terminales que hacen interfaz por medio de la norma RS-232 y las terminales delineadas en la memoria. En la figura 25 se muestra esta división.

Figura 25. Tipos de terminales.


Las terminales RS-232 son dispositivos que contienen un teclado y un despliegue y que se comunican mediante el uso de una interfaz serie, un bit a la vez. La conversión entre datos en serie y paralelo la leva a cabo un UART (transmisor receptor asíncrono universal). La figura 26 muestra como se establece la comunicación.

Figura 26. Una terminal RS-232 se comunica con una computadora a través de una línea de comunicación, un bit a la vez. La computadora y la terminal son completamente independientes.


Para imprimir un carácter, el manejador de la terminal escribe el carácter en la tarjeta de la interfaz, donde éste se separa y después se intercambia por una línea en serie, un bit a la vez, por medio de la UART.
Las terminales RS-232 pueden dividirse en varias categorías. Las más simples son ls terminales de copia dura. Las CRT tontas (tty de vidrio) trabajan en la misma forma, sólo que en una pantalla en lugar de papel. Las CRT inteligentes son de hecho computadoras en miniatura. Tienen una CPU y memoria, y contienen programas complejos, en ROM. Es capaz de aceptar ciertas secuencias de escape. Por ejemplo, al enviar el carácter ESC de ASCII (033), seguido de otros varios caracteres, puede ser posible mover el cursor a cualquier posición en la pantalla, etc.
Terminales delineadas en la memoria
Estas no se comunican con la computadora por una línea serie. Son parte integral de la computadoras mismas. Las terminales delineadas en la memoria son sincronizadas por una memoria especial llamada RAM de video, la cual forma parte del espacio de la computadora y es direccionada por la CPU en la misma forma que el resto de la memoria, (figura 27).

Figura 27. Las terminales delineadas en la memoria escriben directamente en la RAM de video.


También en la tarjeta de RAM de vídeo hay un chip llamado controlador de vídeo. Este chip extrae bytes de la RAM de vídeo y genera la señal de vídeo que se usará para manejar el despliegue.
La IBM PC emplea un despliegue delineado por caracteres para la consola. En la figura 28 se muestra una porción de la RAM de vídeo, la cual inicia en la dirección 0xB0000 para el despliegue monocromático y en 0xB8000 para el despliegue de color. Los caracteres desplegados se almacenan en la RAM utilizando dos bytes, uno para el código ASCII y otro para el atributo.

Figura 28. (a) Una imagen en la RAM de vídeo de un despliegue monocromático de la IBM. (b) La pantalla correspondiente. Los xs son bytes de atributos.


Cuando se presiona una tecla se interrumpe a la CPU y el manejador del teclado extrae el carácter leyendo de un puerto de E/S. Las interrupciones se generan al presionar y al soltar la tecla. Todo lo que entrega el teclado es el número de la tecla no el código ASCII.
Software de la terminal
El teclado y el despliegue son dispositivos casi independientes y se tratarán por separado.
Software de entrada
La tarea de éste es aceptar la entrada y pasarla sin modificaciones. El manejador se hace cargo de la edición entre líneas y simplemente entrega las líneas corregidas a los programas de los usuarios o bien puede suministrar los caracteres tal y como los recibe. El primer modo es el modo elaborado y el segundo el modo no elaborado.
Los caracteres se pueden manejar de dos maneras; una es mediante un buffer central y la otra mediante buffers por cada terminal como se muestra en la figura 29.

Figura 29. (a) La reserva del buffer central. (b) Buffer dedicado a cada terminal.


Cuando se opera en el modo elaborado, varios caracteres de entrada tienen significados especiales. En la figura 30 se muestran los caracteres especiales de minix.



Carácter

Comentario

Retroceso de un espacio

Retrocede y suprime un carácter

@

Suprime la línea corriente

\

Escape (acepta el siguiente carácter literalmente

tab

Posiblemente se extienda a espacios en la salida

CTRL-S

Detiene la salida

CTRL-Q

Inicia la salida

DEL

Interrupción del proceso (SIGINT)

CTRL-\

Obliga un vaciado del núcleo (SIGQUIT)

CTRL-D

Fin de archivo

Figura 30. Caracteres que se manejan especialmente en modo elaborado.
minix suministra la llamada ioctl para definir el modo de la terminal, entre otras cosas.
ioctl(file_descriptor, request, argp);
La variable request se utiliza para especificar si los parámetros de la terminal se van a leer o a cambiar, y cuales son estos. La variable argp es el apuntador a la estructura sgtty o tchars que se define en h/sgty.h. La palabra del modo de la terminal, se muestra en la figura 31.

Figura 31. Palabra de control de la terminal. Los bits sombreados no se utilizan.



  1   2


La base de datos está protegida por derechos de autor ©bazica.org 2016
enviar mensaje

    Página principal