Il sistema di I/O
•
•
•
•
•
Hardware di I/O
Interfaccia di I/O per le applicazioni
Sottosistema per l’I/O del kernel
Trasformazione delle richieste di I/O in operazioni dell’hardware
Prestazioni
Operating System Concepts
12.1
Silberschatz and Galvin1999
Hardware di I/O
•
•
•
•
Esiste una incredibile varietà di dispositivi di I/O.
Concetti comuni:
– Porta
– Bus (daisy chain o accesso diretto condiviso)
– Controller (host adapter)
Le istruzioni di I/O controllano i dispositivi.
I dispositivi hanno indirizzi usati da:
– Istruzioni dirette di I/O
– Memory-mapped I/O
Operating System Concepts
12.2
Silberschatz and Galvin1999
Polling
•
•
Determina lo stato di un dispositivo:
– command-ready
– busy
– error
Si ha un ciclo busy-wait per attendere l’I/O dal dispositivo.
Operating System Concepts
12.3
Silberschatz and Galvin1999
Interrupt
•
•
•
•
•
La linea di richiesta dell’interrupt della CPU viene settata dal
dispositivo di I/O.
Il gestore di interrupt (interrupt–handler) riceve gli interrupt.
Alcuni tipi di interrupt possono essere mascherati, per ignorarli
definitivamente o rimandarne il servizio.
Il vettore degli contiene gli indirizzi di memoria dei gestori
specializzati.
– Basato su priorità
– Alcuni sono non mascherabili
Il meccanismo di interrupt viene impiegato anche per le
eccezioni.
Operating System Concepts
12.4
Silberschatz and Galvin1999
Ciclo di I/O guidato da interrupt
Operating System Concepts
12.5
Silberschatz and Galvin1999
Accesso diretto alla memoria – DMA
•
•
•
Viene impiegato per evitare l’I/O programmato (PIO) per
trasferimenti di grandi quantità di dati.
Richiede un controller di DMA.
Si evita così di sovraccaricare di compiti la CPU: è il controller di
DMA che si occupa di trasferire i dati direttamente tra il
dispositivo di I/O e la memoria.
Operating System Concepts
12.6
Silberschatz and Galvin1999
Passi di un trasferimento DMA
Operating System Concepts
12.7
Silberschatz and Galvin1999
Interfaccia di I/O per le applicazioni
•
•
•
Le chiamate di sistema di I/O incapsulano i comportamenti dei
dispositivi in classi generali.
Lo strato dei driver dei dispositivi nasconde al sottosistema di I/O
del kernel le differenze fra i controller dei dispositivi di I/O.
I dispositivi possono differire per molteplici aspetti:
– Character–stream o block–stream (trasferimento a flusso di
caratteri o di blocchi);
– Accesso sequenziale o casuale;
– Dispositivo sincrono o asincrono, condivisibile o dedicato;
– Velocità di funzionamento;
– Lettura e scrittura, sola lettura o sola scrittura.
Operating System Concepts
12.8
Silberschatz and Galvin1999
Dispositivi con trasferimento a blocchi o a caratteri
•
•
Dispositivi con traserimento a blocchi comprendono
principalmente drive di dischi:
– Il dispositivo comprende istruzioni del tipo read, write, seek;
– Raw I/O (I/O di basso livello);
– Possibilità di accesso ai file mappato in memoria.
Dispositivi a caratteri comprendono tastiere, mouse, porte seriali:
– Comandi classici sono get, put;
– Con l’uso di librerie appropriate permettono l’accesso per
righe e la gestione di un buffer.
Operating System Concepts
12.9
Silberschatz and Galvin1999
Dispositivi di rete
•
•
•
Variano molto dai dispositivi per il trasferimento di I/O a blocchi
e/o caratteri fino a presentare una propria interfaccia specifica.
Unix e Windows/NT comprendono un’interfaccia socket:
– Separa il protocollo di rete dalle operazioni di rete;
– Include la funzionalità select.
Gli approcci variano molto (pipe half–duplex, FIFO full–duplex,
stream full–duplex, code di messaggi, socket)
Operating System Concepts
12.10
Silberschatz and Galvin1999
Clock e Timer
•
•
•
Forniscono il tempo corrente, il tempo trascorso, regolano un
timer per avviare l’operazione X al tempo T.
Se impiega un interval timer per la tempificazione: con questo
meccanismo è possibile avere interrupt periodici.
La system call ioctl (su UNIX) controlla vari aspetti di I/O come
clock e timer.
Operating System Concepts
12.11
Silberschatz and Galvin1999
I/O bloccante e non bloccante
•
•
•
I/O bloccante: il processo viene sospeso fino al completamento
dell’operazione di I/O.
– Facile da usare e da comprendere;
– Per alcuni scopi è insufficiente.
I/O non-bloccante: la chiamata ad I/O ritorna appena possibile
(dopo aver iniziato il trasferimento di dati).
– Utile per processi utente, e per trasferimento dati, ad
esempio da disco a schermo (I/O bufferizzato);
– Viene implementato per mezzo di multi-threading;
– Ritorna rapidamente con il numero di byte letti o scritti.
I/O asincrono: il processo prosegue mentre avviene l’I/O.
– Difficile da usare;
– Il sottosistema di I/O segnala al processo il completamento
dell’I/O.
Operating System Concepts
12.12
Silberschatz and Galvin1999
Sottosistema di I/O del kernel
•
•
Scheduling
– Alcune richieste di I/O sono ordinate per mezzo di code in
ciascun dispositivo;
– Il sistema operativo è equo: nessuna applicazione deve
ricevere un servizio carente, da maggiore priorità ad
applicazioni inficiate da un ritardo nel servizio.
Buffering: si memorizzano i dati in memoria mentre avviene il
trasferimento fra dispositivi.
– Utile per gestire la differenza di velocità dei dispositivi;
– Per gestire la differenza di dimensione dei blocchi di
trasferimento dei dispositivi;
– Per mantenere la “semantica di copia”.
Operating System Concepts
12.13
Silberschatz and Galvin1999
Kernel I/O Subsystem
•
•
•
Caching: una regione di memoria veloce che serve per
mantenere copie di certi dati. L’accesso a queste copie è più
rapido che l’accesso agli originali.
Spooling: è un buffer contenente output per un dispositivo che
non può accettare flussi interfogliati di dati (ad esempio, una
stampante).
Prenotazione di un dispositivo: fornisce accesso esclusivo ad
un dispositivo.
– System call per allocazione e deallocazione dei dispositivi;
– Responsabilità di evitare i deadlock.
Operating System Concepts
12.14
Silberschatz and Galvin1999
Gestione degli errori
•
•
•
Un sistema operativo che usi la protezione della memoria può
recuperare varie situazioni di errore, ad esempio, errori di lettura
di un disco, errori per dispositivi non disponibili o errori di scrittura
momentanei.
La maggior parte dei sistemi operativi restituisce un codice di
errore quando una richiesta di I/O fallisce.
I file log di errori possono essere consultati per avere statistiche
sul funzionamento del sistema.
Operating System Concepts
12.15
Silberschatz and Galvin1999
Strutture dati del kernel
•
•
•
Il kernel mantiene informazioni sullo stato dei componenti
coinvolti nelle operazioni di I/O, come la tabella dei file aperti e la
tabella delle socket.
Moltissime strutture dati complesse tengono traccia
dell’allocazione dei vari buffer, dell’allocazione della memoria e
dei blocchi “dirty”.
Alcuni sistemi operativi utilizzano metodologie object-oriented e
message passing per l’implementazione dell’I/O.
Operating System Concepts
12.16
Silberschatz and Galvin1999
Trasformazione delle richieste di I/O in operazioni hardware
•
Si consideri la lettura di un file su disco da parte di un processo:
– Si determina il dispositivo su cui il file è memorizzato;
– Si opera la traduzione fra nome del dispositivo e suo driver
fisico;
– Si leggono i dati dal disco in un buffer;
– Si rendono i dati disponibili al processo che li ha richiesti;
– Si ritorna il controllo al processo richiedente.
Operating System Concepts
12.17
Silberschatz and Galvin1999
Schema di esecuzione di una richiesta di I/O
Operating System Concepts
12.18
Silberschatz and Galvin1999
Prestazioni
•
L’I/O è un fattore fondamentale per le prestazioni dell’intero
sistema:
– Richiede un notevole impegno della CPU per l’esecuzione
del codice dei driver e per lo scheduling dei processi;
– Produce numerosi context switch dovuti agli interrupt;
– Sovraccarica il bus della memoria durante i trasferimenti di
dati tra i controller e la memoria fisica e tra i buffer del
kernel e lo spazio di indirizzamento delle applicazioni.
Operating System Concepts
12.19
Silberschatz and Galvin1999
Comunicazione fra computer
Operating System Concepts
12.20
Silberschatz and Galvin1999
Come migliorare le prestazioni
•
•
•
•
•
Ridurre il numero di context switch.
Ridurre il numero di trasferimenti di dati.
Ridurre il numero di interrupt, trasferendo grossi volumi di dati,
utilizzando controller intelligenti e polling.
Utilizzare il DMA
Equilibrare le prestazioni della CPU, della memoria, del bus e
dell’I/O, dato che il sovraccarico di una componente qualsiasi
provoca il basso utilizzo delle altre.
Operating System Concepts
12.21
Silberschatz and Galvin1999