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