A8
Gestione
dell’input/output
Nella parte posteriore del computer si trovano usualmente le connessioni
hardware per i dispositivi di input e di output (come tastiera, mouse, monitor, stampante ecc.).
Lo strumento software «Gestione dispositivi» del panello di controllo di
Windows visualizza tutti i sistemi (i singoli dispositivi, ma anche i generici
«bus» di connessione come USB) di input e di output connessi al computer:
Per ciascun dispositivo di input/output esiste un device driver: il sistema
operativo – i cui programmatori non possono conoscere il tipo di dispositivi che saranno connessi al computer – deve infatti cooperare con questi
moduli software sviluppati dai costruttori dell’hardware e installati, manualmente o automaticamente, dall’utente del computer.
108
A8
Gestione dell’input/output
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica
1
L’interfaccia hardware dei
dispositivi di input/output (I/O)
Molti dispositivi si connettono al computer mediante un’interfaccia standard; la più utilizzata è senza dubbio USB (Universal Serial Bus). Ma il
controllore del bus USB interno al computer, così come i controllori di
altre tipologie di dispositivi – il bus SATA per i dischi, per esempio, o la
scheda video – devono necessariamente interfacciarsi al processore e alla
memoria principale del computer; i controllori dei dispositivi di input/
output sono gestibili mediante le istruzioni eseguite dalla CPU (e quindi
dal codice del sistema operativo) in due diverse modalità:
• alcuni processori prevedono uno spazio di indirizzi speciali per l’I/O e
istruzioni di lettura e scrittura specifiche;
• altri processori riservano una parte degli indirizzi della memoria RAM
come indirizzi di I/O accessibili con le normali istruzioni di lettura/
scrittura della memoria (questa modalità è nota come memory-mapped
I/O).
ESEMPIO
I dispositivi espongono per la loro gestione un insieme di registri, cioè di
locazioni di memoria con scopi specializzati; il controllo delle loro funzionalità avviene mediante la lettura e la scrittura da parte del codice eseguito
dal processore del contenuto di questi registri.
Una semplice tastiera potrebbe esporre un registro
denominato KEY, per la lettura del codice dell’ultimo
tasto premuto, e un secondo registro denominato
STATUS, in cui un singolo bit indica la pressione (1) o
meno (0) di un tasto successivamente all’ultima lettura del registro KEY.
Il codice del driver di gestione della tastiera potrebbe semplicemente implementare l’algoritmo di
FIGURA 1.
Naturalmente i codici dei tasti premuti devono essere
memorizzati per essere resi disponibili ai programmi
applicativi che li richiedono: si tratta della parte dello
schema omessa.
STATUS
F
STATUS
=1?
V
KEY
...
FIGURA 1
La tecnica utilizzata dall’algoritmo illustrato nell’esempio precedente è molto inefficiente: per tutto il tempo che intercorre tra la
pressione di due tasti (tempo che anche nel caso di digitazione veloce da
parte dell’utente è estremamente lungo rispetto alla velocità di esecuzione
del codice da parte del processore) il ciclo di «interrogazione» del registro
STATUS viene inutilmente ripetuto. Questa tecnica prende il nome di
polling (interrogazione ciclica) o busy-wait (attesa attiva) e come vedremo non viene normalmente implementata dai driver dei dispositivi.
OSSERVAZIONE
1
L’interfaccia hardware dei dispositivi di input/output (I/O)
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica
109
La maggior parte dei dispositivi di I/O utilizza la tecnica dell’interruzione (interrupt) per evitare di impegnare inutilmente il processore nell’attesa di un evento. Quando è disponibile un nuovo dato in input, o è
terminato l’output di un dato fornito in precedenza, il dispositivo interrompe il processo attualmente in esecuzione invocando una funzione di servizio dell’interruzione stessa (ISR, Interrupt Service Routine).
L’esecuzione del processo riprende automaticamente una volta servita la
richiesta del dispositivo.
L’esecuzione di una ISR, anche se avviene in modalità
protetta, non prevede – per motivi di efficienza – un vero e proprio
context-switch tra il processo in esecuzione e il sistema operativo: il
processore che riceve una richiesta di interruzione da parte di un dispositivo effettua il salvataggio di parte dello stato del processo in esecuzione per ripristinarlo automaticamente al termine dell’esecuzione
della ISR stessa.
OSSERVAZIONE
Praticamente tutti i driver dei dispositivi sono di tipo interrupt-driven, cioè
eseguono il codice di gestione dei dispositivi stessi in risposta alle interruzioni da essi generate.
ESEMPIO
Dovendo scrivere su disco alcuni blocchi di dati, il driver del dispositivo si limita a
iniziare la scrittura del primo blocco senza attenderne la fine. Quando il controllore
hardware del disco ha terminato la scrittura del blocco genera un’interruzione la
cui funzione di servizio inizia la scrittura del blocco successivo. Quando la funzione di servizio dell’interruzione non dispone di ulteriori operazioni di scrittura
da effettuare invoca il driver del dispositivo per segnalare il completamento delle
operazioni richieste.
La tecnica della gestione interrupt-driven dei dispositivi di input/output è molto più efficiente della tecnica del polling, perché
impegna la CPU solo per il tempo necessario alle operazioni di gestione
dei dispositivi stessi e non per il tempo di attesa effettivo per il completamento di un’operazione di input o di output.
OSSERVAZIONE
Un modo per aumentare ulteriormente le prestazioni delle operazioni
di input/output, liberando al tempo stesso il processore per l’esecuzione
dei processi, consiste nell’adozione della tecnologia nota come DMA
(Direct Memory Access). In questo caso un componente hardware gestisce automaticamente i trasferimenti dei dati dalla memoria al dispositivo di output, o dal dispositivo di input alla memoria, interrompendo
il processore solamente al termine di più operazioni di input/output,
come schematizzato in FIGURA 2.
110
A8
Gestione dell’input/output
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica
CPU
RAM
DMA
I/O
BUS
FIGURA 2
La tecnologia DMA consente di effettuare l’intera operazione di input/output senza utilizzare la CPU per il trasferimento dei
dati nella o dalla memoria RAM; il dispositivo DMA notifica al processore mediante un’interruzione solo la conclusione dell’operazione programmata.
ESEMPIO
OSSERVAZIONE
2
Dovendo inviare alla stampante un blocco di dati corrispondenti a un’immagine, il
sistema operativo programma il dispositivo DMA fornendo l’indirizzo di memoria
iniziale del blocco e la sua dimensione espressa in byte. Il dispositivo DMA gestisce il trasferimento accedendo alla memoria RAM contemporaneamente alla
CPU, che continua la sua normale attività; al termine del trasferimento il dispositivo DMA genera un’interruzione per segnalare al sistema operativo la conclusione
dell’operazione.
La gestione dei dispositivi
di input/output (I/O)
L’aggiunta di un nuovo dispositivo hardware al computer è normalmente seguita dall’installazione del driver software, cioè dall’integrazione del
sistema operativo con un componente specifico – il cui codice viene normalmente eseguito in modalità protetta – per la gestione del dispositivo
stesso.
In alcuni casi, come per molti dispositivi con connessione USB, l’installazione avviene automaticamente. In questo caso il sistema operativo ricerca e scarica il driver software dalla rete dopo avere
identificato il dispositivo hardware.
OSSERVAZIONE
L’installazione di un driver software integra il codice del sistema operativo
con un insieme di funzioni di gestione delle interruzioni che il controllore dell’hardware è in grado di generare e con un insieme di funzioni che
2
Spooling
Molti dispositivi di I/O possono
essere utilizzati da più processi allo stesso tempo, anche
se il sistema operativo deve
garantire la corretta gestione
di queste risorse rispetto alle
richieste.
Dispositivi come la stampante
non sono invece condivisibili
tra più processi: è infatti necessario mettere in coda le richieste di stampa e soddisfarle
una alla volta; questa tecnica
prende il nome di spooling,
dall’acronimo SPOOL (Simultaneous Peripheral Operations
On-Line).
La gestione dei dispositivi di input/output (I/O)
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica
111
Double buffering
Una tecnica piuttosto diffusa
di programmazione del codice
di gestione dei buffer prevede
l’uso di due aree di memoria:
una utilizzata dalle funzioni
ISR e l’altra a disposizione del
driver e del sistema operativo. Quando il buffer è vuoto
(in caso di output), o pieno
(in caso di input), esso viene
scambiato con quello utilizzato dal programma applicativo,
che lo utilizza per elaborare i
dati ricevuti o per predisporre
nuovi dati da inviare.
1 Richiesta di I/O
(chiamata di sistema)
PROGRAMMA
APPLICATIVO
2 Processo in stato
di wait
3
Avvio
operazione di I/O
Esecuzione
operazione di I/O
Richiesta di I/O
completata
SISTEMA
OPERATIVO
7 Processo in stato
di ready
DEVICE
DRIVER
6 Gestione dei dati
e dello stato
INTERRUPT
SERVICE ROUTINE
4
8
5
Generazione
interruzione fine
operazione di I/O
CONTROLLER
HARDWARE
FIGURA 3
– tramite la API del sistema operativo stesso – i programmi applicativi
possono invocare (FIGURA 3).
La frequenza e velocità con cui un dispositivo hardware invia i dati di input o riceve i dati di output sono molto variabili: non è pensabile che un
programma applicativo sincronizzi l’invocazione delle funzioni del sistema
operativo che gestiscono le operazioni di input/output con il flusso di dati
del dispositivo hardware.
ESEMPIO
Per ovviare al fatto che l’esecuzione del programma che richiede dati
di input o produce dati di output è asincrona rispetto all’invio o alla
ricezione dei dati da parte del dispositivo fisico, è necessario bufferizzare i dati memorizzandoli temporaneamente in un’area della memoria principale. La bufferizzazione può essere effettuata dal driver del
dispositivo all’interno del kernel del sistema operativo, oppure dal programma applicativo stesso, o ancora – ed è il caso più comune – a entrambi i livelli.
112
Nel corso del download di un file i dati che lo costituiscono sono forniti dal driver del dispositivo di rete
a blocchi di dimensione variabile; la funzione ISR del
A8
device driver deputata alla gestione dei dati in arrivo
li memorizza in un buffer in attesa che il programma
applicativo li richieda (FIGURA 4).
씰
Gestione dell’input/output
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica
interrupt
dispositivo
buffer
driver
programma
ISR
dati
invocazione
ESEMPIO
FIGURA 4
Per effettuare la stampa di un documento il programma applicativo bufferizza i
dati che la codificano prima di invocare ripetutamente le funzioni che avviano e
alimentano la stampa; a queste funzioni viene fornito come argomento il buffer
contenente i dati da stampare.
ESEMPIO
Il sistema operativo – la cui API deve garantire ai programmi applicativi
un’interfaccia software di gestione dei dispositivi hardware indipendente
dai dettagli realizzativi – espone un’astrazione delle caratteristiche funzionali delle diverse categorie di dispositivi (dispositivi di memorizzazione,
dispositivi audio/video, dispositivi di interazione con l’utente, dispositivi
di stampa ecc.) e incapsula i device driver in modo che essi siano invocati
tramite un’interfaccia standard.
3
Due mouse realizzati da due produttori diversi presentano interfacce hardware
differenziate: i driver software installati per la loro gestione uniformano il funzionamento nei confronti del sistema operativo e per i programmi applicativi la differenza è completamente trasparente.
La gestione dell’input/output
in Linux e Windows
Il sistema operativo Linux deriva da Unix l’idea di rappresentare ciascun
dispositivo di input o di output mediante un file di tipo speciale – usualmente collocato nella directory /dev – collegato al driver del dispositivo
stesso. Questa soluzione («everything is a file») consente ai programmatori
di utilizzare per i dispositivi fisici le stesse funzionalità dell’API di gestione
dei file (apertura, chiusura, lettura, scrittura ecc.). Tradizionalmente Linux
classifica i dispositivi di input/output nelle seguenti categorie:
• character-oriented;
• block-oriented;
• network.
3
Plug & play
Sia Windows sia Linux supportano la tecnologia plug & play,
che consente la connessione
di un dispositivo hardware al
computer senza la necessità
di installare il driver software
e/o di configurare il dispositivo
stesso.
In realtà il sistema operativo riconosce la categoria del
dispositivo (memoria FLASH,
tastiera, mouse, stampante
ecc.) e ne gestisce automaticamente la configurazione
scaricandone, se necessario, il
driver dalla rete.
La tecnologia plug & play necessita della funzionalità di
enumerazione dei dispositivi
connessi al computer.
La gestione dell’input/output in Linux e Windows
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica
113
I dispositivi character-oriented prevedono la ricezione o la trasmissione
di un flusso sequenziale di singoli byte, mentre i dispositivi block-oriented
– come i dischi e le memorie FLASH – hanno la caratteristica di eseguire
la scrittura e la lettura dei dati a blocchi di dimensione prestabilita e necessitano di conseguenza di una gestione separata. In un computer moderno,
infine, i dispositivi di rete costituiscono un elemento fondamentale le cui
prestazioni sono critiche per l’intero sistema.
Nel sistema operativo Windows i device driver dei dispositivi di input/
output sono – come d’altra parte in Linux – caricati dinamicamente dal
kernel, quando necessario. In Windows i driver software sono inoltre «impilabili»: tipicamente «sopra» il driver del bus USB viene installato il driver
di un dispositivo USB come una stampante o uno scanner.
Sia in Linux sia in Windows i driver dei dispositivi di rete
assumono un ruolo speciale nel contesto del sistema operativo. Per esempio il file system può essere integrato con quello di altri computer connessi
in rete in modo trasparente – cioè come se i file e le directory si trovassero sul disco del computer stesso – grazie all’adozione di «protocolli» di
comunicazione specifici come NFS (Network File System), per i sistemi
Unix e Linux, e SMB (Server Message Block), per i sistemi Windows.
OSSERVAZIONE
Sintesi
I dispositivi di input/output espongono
per la loro gestione un insieme di registri, cioè
di locazioni di memoria con scopi specializzati. Il
controllo delle loro funzionalità avviene mediante
la lettura e la scrittura da parte del codice eseguito
dal processore del contenuto di questi registri.
Alcuni processori prevedono uno spazio di
indirizzi speciali per l’I/O e istruzioni di lettura e
scrittura specifiche, mentre altri processori riservano una parte degli indirizzi della memoria RAM
come indirizzi di I/O accessibili con le normali
istruzioni di lettura/scrittura della memoria (questa modalità è nota come memory-mapped I/O).
La maggior parte dei dispositivi di I/O
utilizza la tecnica dell’interruzione (interrupt)
per evitare di impegnare inutilmente il processore
nell’attesa di un evento. Quando è disponibile un
nuovo dato in input, o è terminato l’output di un
dato fornito in precedenza, il dispositivo interrompe il processo attualmente in esecuzione invocando una funzione di servizio dell’interruzione stessa
(ISR, Interrupt Service Routine). L’esecuzione del
processo riprende automaticamente una volta servita la richiesta del dispositivo.
114
A8
Con la tecnologia DMA (Direct Memory
Access) un componente hardware gestisce automaticamente i trasferimenti dei dati dalla memoria al dispositivo di output, o dal dispositivo di
input alla memoria, interrompendo il processore
solamente al termine di più operazioni di input/
output.
L’installazione di un driver software integra il codice del sistema operativo con un insieme
di funzioni di gestione delle interruzioni che il
controllore dell’hardware è in grado di generare e
con un insieme di funzioni che – tramite la API del
sistema operativo stesso – i programmi applicativi
possono invocare.
Per ovviare al fatto che l’esecuzione del
programma che richiede dati di input o produce
dati di output è asincrona rispetto all’invio o alla
ricezione dei dati da parte del dispositivo fisico,
è necessario bufferizzare i dati memorizzandoli
temporaneamente in un’area della memoria principale: la bufferizzazione può essere effettuata dal
driver del dispositivo all’interno del kernel del sistema operativo, oppure dal programma applicativo stesso.
Gestione dell’input/output
Meini, Formichi TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI © Zanichelli 2012 per Informatica