You are on page 1of 42

Entrada/Salida

Sistemas Operativos (SO) Facultat d'Informtica de Barcelona Universitat Politcnica de Catalunya

ndice
Conceptos previos Estructuras Bsicas E/S Sncrona E/S Asncrona Implementacin en Onion Drivers Ejemplos

Entrada/Salida

Introduccin
Funcin del S.O.: controlar los dispositivos de E/S
Cada dispositivo require un tratamiento especial
write_printer write_file write_screen

El S.O. oculta las diferencias y proporciona una interficie comn independiente del dispositivo
Operaciones sobre dispositivos virtuales write

Entrada/Salida

Caractersticas de los dispositivos


Velocidad de transferencia Unidad de transferencia
bloque o carcter

Representacin de los datos Operaciones permitidas Modos de trabajo


echo spool

Entrada/Salida

Tipos de dispositivos
Fsicos
Dispositivos hardware ( disco, teclado, ... )

Lgicos
Dispositivos que:
no tienen dispositivo hardware asociado ( Nul , Random , ... ) aaden funcionalidades sobre el dispositivo hardware ( ficheros ) agrupan varios dispositivos hardware ( Consola )

Virtuales
Abstraccin del Sistema con la que trabajan los usuarios

Entrada/Salida

Tipos de Entrada/Salida
Sncrona
El proceso de usuario se queda bloqueado hasta que finaliza la operacin de E/S

Asncrona
El proceso de usuario se ejecuta concurrentemente mientras se realiza la E/S
El Sistema Operativo notifica la proceso cuando esta finaliza
y/o

El proceso dispone de una interficie para consultar el estado de las operaciones pendientes
esperar cancelar estado_es

Programacin ms compleja
Entrada/Salida 6

Principios de diseo
Uniformidad en las operaciones
Mismas LlaS para todos los dispositivos
Misma semntica sobre todos los dispositivos

El sistema comprueba si la operacin es vlida sobre el dispositivo Aumenta la portabilidad y simplicidad de los procesos de usuario

Entrada/Salida

Principios de diseo (II)


Dispositivos virtuales
El usuario trabaja sobre dispositivos virtuales El sistema proporciona mecanismos para asociar/desasociar un dispositivo virtual a uno fsico/lgico
assignar, desassignar open,close obrir,tancar fork,exit crear_pcb,destruir_pcb

Entrada/Salida

Principios de diseo (III)


Redireccionamiento
El S.O. permite cambiar la asignacin de los dispositivos virtuales antes de iniciar un proceso Permite que el mismo programa se ejecute sobre diferentes dispositivos sin cambiar el cdigo
UNIX: ls > llistat.dat VMS: assign sys$output llista.dat; dir

Entrada/Salida

Independencia del dispositivo


Incrementa la portabilidad de los programas Independencia del perifrico
Dispositivos virtuales

Independencia de la unidad de transferencia


Uniformidad de las operaciones

Incrementa la reusabilidad de los programas


Redireccionamiento

Entrada/Salida

10

Tabla de canales
Guarda las relaciones entre los dispositivos virtuales y los dispositivos fsicos/lgicos
Indexada por n de canal o nombre del dispositivo virtual Una por proceso
aunque puede ser compartida entre threads/clones puede haber otra tabla extra para todo el sistema

S.O. puede asignar los canales (primero libre) o puede dejar que los decida el usuario En Onion: capa Sistema

Entrada/Salida

11

Niveles de Sistema
La E/S tiene dos niveles:
Independiente
Funciones de E/S comunes a todos los dispositivos

Dependiente
Funciones de E/S especifcas de cada dispositivo Aadir un nuevo dispositivo significa modificar este nivel

En Onion la divisin es en la capa de Sistema

Entrada/Salida

12

Descriptor de dispositivo
Estructura que contiene la informacin relacionada con un dispositivo
Punteros a las funciones dependientes especficas del dispositivo Aadir un dispositivo es aadir un descriptor y sus funciones relacionadas Tiene dos partes:
Parte comn:
nombre, apuntadores a las operaciones, N de opens, caractersticas

Parte especfica
p.ej. ficheros: pL/E, modo de apertura, identificador_bfs

Entrada/Salida

13

E/S Sncrona

llegir mov AX, int 40h

Entrada/Salida

14

E/S Sncrona
SISTEMA INDEPENDIENTE trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { }

llegir mov AX, int 40h

Entrada/Salida

15

E/S Sncrona
SISTEMA INDEPENDIENTE trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } BFS

Tabla de canales canal disp.

llegir mov AX, int 40h

Entrada/Salida

16

E/S Sncrona
SISTEMA INDEPENDIENTE trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } SISTEMA DEPENDIENTE Descriptor de Dispositivo llegir Tabla de canales canal disp. llegir_dep (canal,buff,lon) { } BFS

llegir mov AX, int 40h

Entrada/Salida

17

E/S Sncrona
SISTEMA INDEPENDIENTE trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } SISTEMA DEPENDIENTE Descriptor de Dispositivo llegir Tabla de canales canal disp. llegir_dep (canal,buff,lon) { } BFS

llegir mov AX, int 40h

Entrada/Salida

18

Gestores
Proceso de sistema encargado de atender y resolver peticiones de E/S
Hay gestores en los 3 niveles Puede haber 1 o ms gestores por dispositivo pseudo-cdigo
for ( ; ; ) {
esperar peticin recoger parmetros realizar E/S notificar finalizacin E/S

Entrada/Salida

19

Gestores (II)
Sincronizacin proceso de usuario/gestor
Mediante semforos Notificacin de una nueva peticin de E/S
El gestor espera a recibir notificaciones mediante un wait La rutina de E/S realiza un signal sobre el semforo del gestor

Notificacin de finalizacin de E/S


La rutina de E/S espera mediante un wait sobre un semforo
Cada operacin de E/S tiene un semforo prpio

El gestor realiza un signal sobre el semforo cuando finaliza la E/S

Entrada/Salida

20

Gestores (III)
Paso de parmetros
Mediante la estructura IORB (Input/Output Request Block)
Las rutinas de E/S rellenan y encolan los IORBs Cada gestor/dispositivo tiene una cola de IORBs con las peticiones pendientes El contenido de los IORBs vara segn el dispositivo

Retorno de resultado
Mediante la estructura io_fin
Contiene el identificador de E/S y su resultado Una cola de resultados por dispositivo El gestor encola el io_fin y la rutina de E/S lo recoge

Entrada/Salida

21

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir_dep (canal,buff,lon) { llegir }
q_io_fin q_iorb

SISTEMA DEPENDIENTE BFS

llegir mov AX, int 40h

canal

disp.

for ( ; ; ) { wait (sem_gestor)

Tabla de canales

Entrada/Salida

22

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir_dep (canal,buff,lon) { llegir }
q_io_fin q_iorb

SISTEMA DEPENDIENTE BFS

preparar parmetros

llegir mov AX, int 40h

canal

disp.

for ( ; ; ) { wait (sem_gestor)

Tabla de canales

Entrada/Salida

23

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir_dep (canal,buff,lon) { llegir } preparar parmetros signal (sem_gestor) wait (id_io)
q_io_fin q_iorb

SISTEMA DEPENDIENTE BFS

llegir mov AX, int 40h

canal

disp.

for ( ; ; ) { wait (sem_gestor)

Tabla de canales

Entrada/Salida

24

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir_dep (canal,buff,lon) { llegir } preparar parmetros signal (sem_gestor) wait (id_io)
q_io_fin q_iorb

SISTEMA DEPENDIENTE BFS

llegir mov AX, int 40h

canal

disp.

for ( ; ; ) { wait (sem_gestor) escoger IORB realizar E/S }

Tabla de canales

Entrada/Salida

25

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir_dep (canal,buff,lon) { llegir } preparar parmetros signal (sem_gestor) wait (id_io)
q_io_fin q_iorb

SISTEMA DEPENDIENTE BFS

llegir mov AX, int 40h

canal

disp.

Tabla de canales

for ( ; ; ) { wait (sem_gestor) recoger parmetros realizar E/S encolar resultado }

Entrada/Salida

26

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir_dep (canal,buff,lon) { llegir } preparar parmetros signal (sem_gestor) wait (id_io)
q_io_fin q_iorb

SISTEMA DEPENDIENTE BFS

llegir mov AX, int 40h

canal

disp.

Tabla de canales

for ( ; ; ) { wait (sem_gestor) recoger parmetros realizar E/S encolar resultado signal (id_io) }

Entrada/Salida

27

E/S Sncrona con gestor


SISTEMA INDEPENDIENTE Descriptor de Dispositivo trap () { switch (ax) { case llegir: llegir_indep() } } llegir_indep (canal,buff,lon) { } llegir SISTEMA DEPENDIENTE BFS llegir_dep (canal,buff,lon) { preparar parmetros signal (sem_gestor) wait (id_io) recoger resultado }
q_io_fin q_iorb

llegir mov AX, int 40h

canal

disp.

for ( ; ; ) { wait (sem_gestor)

Tabla de canales

Entrada/Salida

28

Gestores (IV)
Simplifican el acceso a las estructuras de datos
Reducen la necesidad de usar exclusiones mutuas

Permiten planificar las peticiones Facilitan la implementacin de E/S asncrona

Entrada/Salida

29

E/S Asncrona
SISTEMA INDEPENDIENTE Descriptor de Dispositivo id_io = llegir () llegir_indep (canal,buff,lon) { } llegir } Tabla de canales llegir_dep (canal,buff,lon) { preparar parmetros signal (sem_gestor) retornar id_io
q_iorb

SISTEMA DEPENDIENTE BFS

...

canal

disp.

res = esperar(id_io)

esperar ( id_io ) { wait (id_io) recoger resultado }

for ( ; ; ) { wait (sem_gestor) recoger parmetros realizar E/S encolar resultado signal (id_io) }

q_io_fin

Entrada/Salida

30

Implementacin en Onion: estructuras


Tabla de canales
1 por proceso guardada en el PCB 5 entradas Apuntador al Descriptor de dispositivo Contador de operaciones pendientes Cola de operaciones pendientes de E/S
5 entradas

PCB

Tabla de Canales
^DD #es id_io id_io id_io

Entrada/Salida

31

Implementacin en Onion: estructuras


Descriptor de dispositivo
nombre propietario modo protecciones # opens ^abrir ^leer ^escribir ^... ^cerrar sem_mutex sem_gestor q_iorbs q_io_fin parte dependiente

IORB io_fin

IORB io_fin

IORB

Entrada/Salida

32

Implementacin en Onion: estructuras


IORB
Buffer:
buffer de usuario donde estan o donde se dejan los datos
IORB
^buffer longitud tipo de operacin id_io ^DD parte dependiente

Tipo de operacin:
Lectura o escritura?

id_io:
Identificador de la E/S que representa el IORB

Entrada/Salida

33

Implementacin en Onion: nivel independiente


abrir ( int canal, char *dispositivo, int modo )
1. Comprobar Canal 2. Buscar dispositivo IMPR DISPOSITIVO ^abrir modo
Tabla de Canales

4. Asociar dispositivo al canal

3. Llamar al nivel dependiente

DISCO

CONSOLA ^DD #es

abrir_dispositivo (int modo) { }

Entrada/Salida

34

Implementacin en Onion: nivel independiente


leer ( int canal, char *buffer, int longitud )
1. Comprobar Canal

DISPOSITIVO

^leer modo

3. Llamar al nivel dependiente

Tabla de Canales 2. Comprobar modo

^DD

#es

4. Encolar peticion e incrementar #E/S

id_io

leer_dispositivo (int buffer,int longitud) { }

Entrada/Salida

35

Implementacin en Onion: nivel independiente


esperar ( int id_io )
1. Buscar canal asociado

DISPOSITIVO q_io_fin id_io


Tabla de Canales

res res res

id_io ^DD #es


^

id_io
2. wait(id_io)

4. Liberar peticion y decrementar #E/S

id_io

id_io

3. Buscar resultado

Entrada/Salida

36

Implementacin en Onion: nivel independiente


cerrar ( int canal )
1. Comprobar canal

4. Liberar el canal

DISPOSITIVO

^cerrar

3. Llamar al nivel dependiente

Tabla de Canales

^DD

#es

2. Esperar que finalice y liberar resultados cerrar_dispositivo (int modo) { }

id_io

id_io

Entrada/Salida

37

Device Driver
Software que se comunica directamente con el hardware ( device controller ) a traves de los registros del dispositivo La comunicacin entre el driver y el controlador puede ser de dos maneras:
por encuesta (polling) por interrupciones

Capa Ncleo

Entrada/Salida

38

Encuesta
La CPU esta constantemente consultando el dispositivo para ver si la operacin ya se ha realizado
preparar E/S while ( consultar_dispositivo != FINALIZADO ); finalizar E/S

Sencillo Muy poco eficiente desde el punto de vista del sistema Solo se ha de usar cuando no se pueda hacer de otra manera

Entrada/Salida

39

Interrupciones
La CPU programa la E/S y recibe una interrupcin cuando esta ha finalizado
El proceso se bloquea y cede la CPU hasta que recibe la interrupcin
mejor uso de la CPU en el sistema

Hay que minimizar siempre el trabajo que se hace en la rutina que atiende a la interrupcin

Entrada/Salida

40

Mejoras de la E/S
Buffering
El dispositivo dispone de un buffer donde guarda los datos a enviados/recibidos
El buffer se va llenando/vaciando mientras los procesos trabajan Permite evitar bloqueos
evitando picos de E/S

Permite evitar la perdida de informacin

Doble buffering
Permite que se produzca a la vez movimiento de datos entre usuario sistema y sistema - dispositivo

Buffering circular
Generalizacin del doble buffering

Entrada/Salida

41

Mejoras de la E/S (II)


Caching
El dispositivo dispone de una cache donde guarda los resultados de operaciones anteriores
Si una operacin esta en la en cache se sirve el resultado de est directamente Aumenta la eficiencia de la E/S si la poltica es buena

Spooling
La E/S se realiza sobre un dispositivo intermedio
El sistema posteriormente la realizar sobre el dispositivo final Permite compartir dispositivos no compartibles El dispositivo intermedio suele ser ms rpido

Gestor auxiliar
Permite evitar bloqueos al gestor principal
Entrada/Salida 42

You might also like