Sistemi Operativi

Gestione dell’I/O

Uno dei compiti principali di un sistema operativo è la gestione ed il controllo dei dispositivi di input/output. Esiste una incredibile varietà di dispositivi di I/O largamente diversi per funzioni e velocità. I metodi di controllo di tali dispositivi sono quindi altrettanto diversi. L’insieme di tali metodi costituisce il sottosistema di I/O del nucleo (kernel) di un sistema operativo. Questo sottosistema di I/O del nucleo è strutturato in moduli chiamati driver, che incapsulano le particolarità e i dettagli dei vari dispositivi. Nonostante l’incredibile varietà dei dispositivi di I/O bastano pochi concetti per capire come tali dispositivi sono connessi al sistema di calcolo e come il sistema operativo li controlla:

Una porta di I/O è formata tipicamente da quattro tipi di registri:

Il controllore specifica il suo stato tramite il bit busy del registro status (1 = occupato, 0 = libero). La CPU comunica le sue richieste tramite il bit command-ready del registro control (viene posto a 1 quando un controllore deve eseguire un comando). Di seguito una tipica struttura di un calcolatore con le sue periferiche:

La comunicazione tra la CPU e i dispositivi avviene tramite la lettura o la scrittura sui registri di controllo. Tale comunicazione può avvenire in due modi:

Di seguito un esempio di negoziazione per la scrittura su una porta da parte della CPU:

La CPU legge ripetutamente il bit busy del registro status finché esso non assume il valore 0 (attesa attiva o interrogazione ciclica)
La CPU pone a 1 il bit write del registro control e scrive un byte nel registro data-out
La CPU pone a 1 il bit command-ready
Quando il controllore si accorge che il bit command-ready vale 1 pone a 1 il bit busy
Il controllore legge il registro control, trova il comando write ed esegue l’operazione di scrittura nel dispositivo leggendo dal registro data-out.
Il controllore pone a 0 il bit command-ready, pone a 0 il bit error nel registro status per segnalare che l’I/O ha avuto esito positivo e pone a 0 il bit busy per indicare che l’operazione è terminata.

La sequenza descritta si ripete per ogni byte. L’interrogazione ciclica può diventare inefficiente se il dispositivo viene trovato pronto raramente consumando inutilmente cicli di CPU. Risulta pertanto più efficiente far si che il controllore del dispositivo possa segnalare alla CPU quando il dispositivo stesso è pronto per una operazione di I/O attraverso un segnale di interruzione. Inoltre quando un dispositivo deve trasferire grandi quantità di dati dal disco non è conveniente trasferire un byte alla volta attraverso i registri del controllore (I/O programmato). Una alternativa a questo approccio che evita il sovraccarico della CPU è l’accesso diretto alla memoria tramite un controllore DMA. In questo modo i dati vengono trasferiti direttamente dal dispositivo di I/O alla memoria senza passare attraverso la CPU. Il sistema operativo deve fornire un’interfaccia tra i dispositivi ed il resto del sistema che sia semplice e facile da usare e le interfacce dovrebbero essere le stesse per tutti i dispositivi (device-independent). I dispositivi possono essere divisi in due grosse categorie:

Per saperne di più consulta i seguenti approfondimenti:






















































Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.