Ingresso/Uscita
 Materiale
in:
– Queste trasparenze, non basta il testo!
– Tanenbaum 2.4.1, 5.6.4, 5.6.5, 5.7.3
Comandi ai dispositivi di I/O
 Si
usano due metodi per mandare informazioni
a un dispositivo:
– Istruzioni specifiche di I/O
– I/O mappato in memoria (memory mapped)
Istruzioni specifiche contengono:
 L’identificatore
del dispositivo e una parola
di comando
– Identificatore del dispositivo: la CPU comunica
l’identificatore per mezzo di fili dedicati che
fanno parte del bus di I/
– Parola di comando: normalmente viaggia sui
fili dedicati ai dati
Memory-mapped I/O:
 Parte
dello spazio di indirizzamento è dedicato
all’I/O
 Letture e scritture agli indirizzi di I/O sono
interpretati come comandi di I/O
 I programmi utente non possono eseguire
direttamente operazioni di I/O:
– Lo spazio di inidirizzamento di I/O è protetto per
mezzo della protezione degli spazi di indirizzamento
(vedere in seguito l’argomento memoria virtuale)
Esempio
Significato degli indirizzi
 A ciascun
indirizzo sono assegnati uno o
piu’ dati e/comandi
 Leggere e scrivere hanno spesso degli
effetti collaterali, ad esempio svuotare un
buffer.
Esempio di lettura da tastiera
generica
I
dati arrivano a intervalli casuali e uno alla
volta
 I dati arrivano lentamente
 La tastiera puo’ avere o non avere un dato
disponibile
 La tastiera puo’ essere rotta
Esempio di lettura da tastiera
generica, cont.
 Registri
(logici) di interfaccia:
– Ready (un carattere disponibile) 1 bit
– Errori (overrun cioe’ carattere perso e errore hardware)
2 bit
– Dati in uscita 7-8 bit
– Quanti indirizzi? Anche uno solo in sola lettura
– Comandi? Se carattere disponibile allora cancella il
dato dal buffer

Mappabili in un solo word!
Esempio di scrittura su terminale
seriale
I
dati si possono mandare quando si vuole
ma non se il dispositivo sta ancora
processando il carattere precedente
 Non occorre mandare i dati molto
velocemente
 Il terminale puo’ essere rotto
Esempio di scrittura su terminale
seriale, cont.
 Registri
(logici) di interfaccia:
– Busy, non puo’ accettare un nuovo carattere; 1
bit
– Errore: malfunzionamento generico, fornito
carattere troppo presto; 2 bit
– Dati in ingresso: 7-8 bit
– Quanti indirizzi? Uno solo ma in lettura e
scrittura: leggi i bit di stato e scrivi i dati
Come i dispositivi di I/O
comunicano con l’OS
 L’OS
deve sapere quando:
– Un dispositivo ha completato un’operazione
– Un’operazione ha causato un errore
 Ci
sono due modi di implementare questa
comunicazione tra OS e dispositivo:
– Polling
– Interrupt
Polling:
 Il
dispositivo mette le informazioni in un
registro di stato (possibilmente mappato in
memoria)
 L’OS controlla periodicamente il registro di
stato
Interrupt:
 Quando
un dispositivo ha bisogno dell’attenzione
della CPU fa in modo di interrompere
l’esecuzione delle istruzioni e fa passare l’OS a
gestire il dispositivo (vedere in seguito come
questo è possibile).
 L’interruzione avviene SEMPRE tra un’istruzione
e l’altra.
 Il programma interrotto non si accorge di nulla (a
meno che le cause per l’interruzione abbiano a che
fare con il programma stesso)
Polling: I/O programmato
CPU
Dati pronti?
Memoria
controllore
no
si
Leggi
dati
dispositivo
Memorizza
dati
I controlli dello stato
Di I/O possono essere
Inseriti tra codice “compute
Intensive”
no
finito?
 Vantaggi:
“busy loop”, poco
Efficiente soprattutto
Se la CPU è veloce
si
– Semplice: la CPU è totalmente in controllo e fa tutto il
lavoro
 Svantaggi:
– L’overhead di polling può sprecare molte risorse
Polling, esempio di prestazioni
 Assumiamo
400 cicli per ciascuna
operazione di polling, compreso
riattivazione del programma utente e un
processore che esegue 500 milioni di
istruzioni al secondo
 Mouse: 30 eventi al secondo, 30 x 400 =
12000 cicli al secondo; 12 mila / 500
milioni = 0.002 %
Polling, esempio di
prestazioni, cont.
 Assumiamo
400 cicli per ciascuna operazione di
polling, compreso riattivazione del programma
utente e un processore che esegue 500 milioni di
istruzioni al secondo
Floppy: 50 Kbyte/sec, due byte alla volta, circa 25
mila accessi/sec X 400 =10 milioni di istruzioni al
secondo o 2% del processore
 CHIARAMENTE la gestione di un disco in
polling non ha senso

Polling, esempio di
prestazioni, cont.
 Assumiamo
400 cicli per ciascuna operazione di
polling, compreso riattivazione del programma
utente e un processore che esegue 500 milioni di
istruzioni al secondo

Disco: 4 Mbyte/sec in 16 byte alla volta da’ 250K
operazioni al secondo X 400 = 100 milioni di
istruzioni al secondo o 20% della CPU
Trasferimento con interrupt
CPU
(1) I/O
interrupt
add
sub
and
or
nop
Programma
utente
(2) salva PC
Memoria
controllore
(3) Indirizzo
Di gestione
interrupt
dispositivo
 Vantaggi:
(4)
ritorno
read
store
... :
rti
memoria
– L’avanzamento del programma utente si ferma solo
durante il trasferimento effettivo

Svantaggi, ci vuole hardware particolare per:
– Generare un interrupt (nel dispositivo)
– Riconoscere un interrupt (CPU)
– Salvare lo stato per riprendere dopo l’interrupt (CPU)
Procedura
Di servizio
interrupt
Interrupt, esempio di prestazioni
 Come
per il disco dell’esempio di polling
precedente:
– 500 istruzioni per gestire l’interrupt ed
acquisire 16 byte, 250K X 500 = 25% della
CPU
– MA se il disco e’ attivo solo il 5% del tempo in
questo caso il 5% di 25% = 1.25% !!
– L’interrupt vince perche’ una periferiche non e’
mai SEMPRE attiva.
Eccezioni, come per l’interrupt
 Interruzioni
del flusso di esecuzione per
cause legate all’esecuzione stessa (invece
che cause legate a eventi INDIPENDENTI)
 Esempi:
– Divisione per zero
– Passaggio al sistema operativo (trap, system
call)
Gestione delle eccezioni,
sospensione programma corrente
1.
2.
3.
Il processore deve terminare (se puo’)
l’esecuzione dell’istruzione corrente o
comunque andare in uno stato ben definito
(cio e’ talvolta difficile in processori
implementati in modo molto sofisticato)
Il program counter deve essere salvato
Lo stato deve essere salvato
Salvataggio stato, cont.
 Lo
stato deve essere salvato in una struttura
a pila o tale da garantire la possibilita’ di
salvare piu’ volte prima di ritornare, cioe’
quando un interrupt interrompe la gestione
di un altro interrupt.
Salvataggio stato
 Puo’ essere
fatto sia in hardware che con un
misto di hardware e software.
 E’ critico che, se fatto in software,
l’hardware provveda a salvare quanto il
sofware non puo’ (tipicamente almeno il
program counter).
 Il sofware deve essere molto attento a non
modificare lo stato prima di salvarlo
Gestione delle eccezioni,
gestione del problema
 La
seconda fase dopo aver salvato lo stato e’
individuare il problema e decidere quale codice
eseguire.
 Anche qui la gestione puo’ essere
preminentemente software o hardware
– Registro di stato (es. MIPS)
» Un registro contiene un codice che identifica l’errore
– Vettore (es. X86)
» L’hardware forza l’esecuzione a un indirizzo che dipende dal
tipo di errore (e dove presumibilmente si e’ messo del codice
apposito)
Gestione del problema
 Sarebbe
pericoloso gestire il problema (o
l’I/O) nello stesso spazio di esecuzione
dell’utente e quindi ci vuole un passaggio di
livello che viene implementato al momento
della chiamata al codice di gestione
dell’interrupt (questa e’ un’altra funzione
implementabile solo in hardware)
Ritorno da interrupt
 Infine
bisogna tornare, se possibile, al
programma utente ripristinando il suo stato.
– Hardware: cambiamento di livello
– Software o hardware: ripristino stato.
Priorita’
 Dalla
descrizione precedente e’ chiaro che un
interrupt potrebbe essere interrotto a sua volta.
Occorre:
– Stabilire una gerarchia di interrupt per evitare che si
creino dei problemi
» Logici se il codice interrotto esegue delle funzioni che mettono
temporaneamente la macchina in uno stato non corretto, ad
esempio cambiando strutture dell’OS
» Prestazionali se il codice interrotto aveva delle necessita’
temporali che non sono piu’ rispettate a causa della sua
interruzione
Eccezioni, esempi
 Overflow
aritmetico (puo’ tipicamente essere
inibita)
 Divisione per zero
 Risultato non normalizzabile di un’operazione
floating-point
 Accesso a dati non allineati
 Istruzione non definita
 Chiamata a OS, questa ovviamente non e’ una
condizione di errore!!
 Accesso a memoria non esistente, l’istruzione non
puo’ essere terminata!! Ma deve essere ripresa
dopo aver sistemato il problema
Interrupt rispetto a eccezioni
 Un
interrupt è come un eccezione solo che:
– Un interrupt è asincrono
– Richiede che dell’informazione ulteriore venga fornita dal
dispotivo
– Un interrupt non è associato con una specifica istruzione
– Un interrupt non impedisce che un’istruzione termini
» La CPU può gestire un interrupt quando desidera (ovviamente
prima possibile)
 L’interrupt
è più complicato di un eccezione:
– Deve acquisire l’identità del dispositivo che l’ha causato
– Le richieste di interrupt possono avere diversi livelli di
urgenza:
» Le richieste di interrupt devono essere ordinate secondo priorità
Esempio, gestione in interrupt
della tastiera
 Si
deve assegnare al bit di “carattere disponibile”
un interrupt
 Il codice del “driver” gestisce un piccolo buffer
– Se l’utente chiede un carattere lo fornisce dal buffer o
ritorna un errore se il buffer e’ vuoto.
– NON FA ALTRO

Il codice di interrupt se viene attivato legge il
carattere e lo mette nel buffer del driver.
– In caso di errore del dispositivo o di buffer troppo
pieno segnala al sistema operativo la condizione di
errore
» L’OS puo’ semplicemente loggare il problema o terminare il
programma utente.
Delegazione della responsabilità
La CPU comunica l’indirizzo di partenza
per l’I/O: DMA
Direzione e dimensioni al controllore.
Poi dà il comando di partire
 Direct
Memory Access
(DMA):
– Esterno alla CPU
– Master del bus
– Trasferisce interi blocchi
senza l’intervento della
CPU
CPU
Memoria
DMAC
controllore
dispositivo
DMAC fornisce tutti i segnali
Per la memoria e per il controllore
Di I/O
DMA: concetti base
 Il
DMA e’ potenzialmente indipendente dal tipo di
I/O usato (memory mapping, polling, interrupt)
anche se usa tipicamente l’interrupt.
 Il DMA non fa che eseguire quello che la CPU
avrebbe eseguito.
 Alla fine dell’operazione il DMA si comporta
rispetto alla CPU come un dispositivo che segnala
la fine dell’operazione.
Delegazione della responsabilità
per l’I/O: IOP
D1
IOP
CPU
D2
main memory
bus
Mem
. . .
Dn
I/O
bus
(1) Manda
istruzione
all’IOP
(4) IOP
interrompe la
CPU alla fine
CPU
IOP
(3)
Un tipico I/O Processor e’
il famoso Canale IBM
Nome dispositivo
Dove sono i
comandi
OP Device Address
IOP leggi i comandi dalla memoria
(2)
memory
I trasferimenti sono controllati
Dall’IOP
IOP utilizza cicli di memoria.
OP Addr Cnt Other
Cosa fare
Dove
Mettere
I dati
Richieste
speciali
Quanti
dati
Compiti del sistema operativo
 Il
sistema operativo agisce da interfaccia tra:
– L’hardware e il programma che ha chiesto l’I/O
 Tre
caratteristiche del sistema di I/O:
– Condiviso da più programmi
– Usa l’interrupt per comunicare informazioni
riguardanti l’I/O.
» Gli interrupt devono essere gestiti dall’OS perchè
richiedono un accesso “protetto” alla CPU
– Il controllo di un dispositivo di I/O può essere
molto complesso:
» Gestione una serie di eventi concorrenti
» Le necessità di un particolare dispositivo possono essere
molto complesse
Compiti del sistema operativo
 Protegge
risorse condivise
– Garantisce che un utente acceda a un dispositivo o a una
parte di esso solo se ne ha il diritto
 Fornisce
un’astrazione per l’accesso ai dispositivi:
– Fornisce funzioni per gestire un dispositivo
 Gestisce
gli interrupt
 Fornisce una condivisione di accesso che garantisce
accesso a tutti gli utenti
 Organizza gli accessi per migliorare le prestazioni
– Es. Buffer disco
Comunicazione tra I/O e OS
 Il
sistema operativo deve prevenire:
– Accesso diretto dei programmi ai dispositivi
 Se
gli utenti potessero fare I/O direttamente:
– Le risorse condivise non sarebbero protette
 Tre
tipi di comunicazione sono richiesti:
– L’OS deve poter dare comandi
– Il dispositivo deve poter notificare l’OS in caso di
terminazione o errori
– Deve trasferire i dati
Sommario
 Le
prestazioni dipendono dal componente meno
performante della catena
 Comunicazione con i dispositivi di I/O:
– Polling: spreca cicli di CPU
– I/O interrupt: come le eccezioni ma asincrono
 Delegazione
di responsabilità:
– DMA
– IOP
 Alcuni
dispositivi, ad esempio quelli
multimediali, creano problemi