Hardware di gestione dell’I/O | |||
I dispositivi di l/O (I/0 devices) possono essere suddivisi in due categorie fondamentali: dispositivi a carattere e dispositivi a blocchi.
Tutti i dispositivi di I/0 citati sono gestiti in hardware da opportune routine software chiamate device driver. I dispositivi di I/O, in genere, sono costituiti da:
La parte elettronica è classificata come il device controller o device adapter. In genere i device controller possono gestire più dispositivi identici. L'interfaccia tra dispositivo vero e proprio e controller diviene talvolta uno standard, de facto o de jure, soprattutto perché spesso i dispositivi di I/0 sono realizzati da costruttori diversi da quello dell'elaboratore vero e proprio. Si pensi, ad esempio, al caso dei controller per disco dotati, a seconda dei casi, di interfacce IDE, SCSI, ecc. II sistema operativo interagisce non con il dispositivo vero e proprio bensì con il suo controller. L'interfaccia tra controller e dispositivo è in genere di bassissimo livello. Un disco, ad esempio, può essere formattato con 8 settori da 512 byte per traccia: quello che in realtà viene trasmesso è una stringa di bit che inizia con un preambolo seguita dai 4096 bit (512 byte di una traccia) e termina con una stringa di controllo (checksum). Il preambolo, costruito durante la formattazione del disco, contiene informazioni quali numeri del settore e del cilindro, dimensione del settore e altro. È il controller a convertire la stringa seriale di bit in un blocco di byte e a compiere il controllo degli errori. I bit letti sono assemblati in un buffer all'interno del controller; il controllo compiuto una volta completata la lettura ricerca un errore che potrebbe essere derivato, ad esempio, da un settore parzialmente danneggiato o (nel caso dei floppy) da polvere che ha comportato una lettura parzialmente falsata. Se il controller rivela l'errore comanda una seconda lettura, una terza, ecc. prima di segnalare l'errore. Se il controllo non rivela errori, il blocco viene trasferito alla memoria principale. Il controller di un terminale video funziona in modo analogo: riceve dalla RAM condivisa i byte di dato e genera i segnali necessari per modulare il pennello di raggi elettronici che, nel caso di uno schermo CRT ad esempio, eccitano i fosfori sulla parte frontale del tubo catodico. Ciascun controller è dotato di alcuni registri usati per comunicare con la CPU. Il sistema operativo produce dell'I/O scrivendo opportuni comandi nei registri del controller: ad esempio il controller del floppy del PC IBM accetta comandi quali READ WRITE, SEEK, FORMAT, RECALIBRATE, ciascuno con i suoi parametri anch'essi copiati nei registri. Quando il comando è stato accettato, la CPU smette di comunicare con il controller e questo compie l'operazione richiesta. Al termine invia un interrupt per ottenere il controllo della CPU la quale verifica il risultato dell'operazione leggendo il contenuto dei registri del controller; ciò fatto, il sistema operativo gestisce il risultato dell'operazione (ad esempio, legge in memoria il blocco copiato dal disco). |
|||
Interfacce parallela e seriale | |||
Alcuni dispositivi esterni agli elaboratori richiedono interfacce con caratteristiche per certi versi opposte a quelle viste finora. Per le stampanti, ad esempio. velocità quali quelle dei bus sono superflue, in quanto il collo di bottiglia è nella parte meccanica del dispositivo, mentre sono importanti la robustezza, la facilità d'uso e, naturalmente, il costo. I moderni personal computer e workstation sono pressoché sempre dotati di una o più interfacce seriali e parallele, utili per il collegamento di stampanti, modem, altri computer (magari di classe differente, come i notepad, i PDA e i notebook) o dispositivi di basso costo per i quali la realizzazione di una scheda per un bus costerebbe più del dispositivo stesso. Le interfacce seriali e parallele realizzano un collegamento diretto tramite cavi elettrici tra due soli dispositivi, a differenza dei bus che sono condivisi tra molti. In origine:
Tuttavía, la diffusa disponibilità a basso costo ne ha fatto diffondere l'utilizzo per applicazioni diverse, soprattutto per i personal computer:
Proprio tenendo in conto queste possibili applicazioni le velocità di queste interfacce sono via via aumentate; in particolare, le seriali dai 9600 b/s (bit al secondo) degli anni ' 80 hanno superato oggi i 100 Kb/s. |
|||
I collegamenti tra canali e periferiche | |||
Come è noto le principali componenti dell’unità centrale, in particolare CPU, memoria e dispositivi di I/O, sono interconnesse tramite bus che consentono il trasferimento di indirizzi, dati e istruzioni e segnali di controllo. Il bus è dunque un tipo di canale (channel) che può essere di tipo seriale o parallelo. I bus di I/O hanno caratteristiche specifiche che hanno ripercussioni rilevanti sul resto del sistema in quanto tutti i dispositivi esterni da connettere (dischi, nastri, stampanti, video, etc.) devono essere collegati tramite opportune schede di interfaccia (dotate di opportuni connettori) ad essi compatibili. Ai bus possono essere anche connessi più componenti per gestire la comunicazione con i dispositivi periferici (controller). I dispositivi collegati al bus possono trovarsi sia nella condizione di dover trasmettere (master) che in quella di dover ricevere (slave). Ad esempio quando la CPU ordina al controller del disco di leggere o scrivere un blocco, la CPU si comporta da master ed il controller da slave. In genere tutti i dispositivi possono funzionare sia come master sia come slave eccetto la memoria che si comporta sempre da slave. I dispositivi di I/O più veloci, supportano una modalità di trasferimento dei dati da e verso la memoria centrale detta DMA (Direct Memory Access) che non richiede l’uso della CPU poiché è gestito da uno specifico controller. Il gestore delle periferiche ha anche il compito di sovrintendere alle operazioni dei processori di canale di I/O che, come abbiamo visto, sono dei processori dedicati. In pratica, i canali eseguono esclusivamente dei programmi di I/O, detti per l'appunto programmi di canale. Sarebbe ovviamente auspicabile disporre di un processore di canale per ogni tipo di periferica, ma, a causa dell'alto costo dell'hardware, molto spesso il numero di canali utilizzati all'interno del sistema è di gran lunga inferiore a quello delle periferiche. |
|||
![]() |
|||
È evidente a questo punto che, per effettuare il trasferimento dati dalla memoria ad una periferica, è indispensabile che esista almeno una linea che unisca la memoria alla periferica, in modo che quest'ultima possa essere assegnata al processore di I/O. Per decidere se un percorso può essere assegnato ad un processore di I/O, il controllore del traffico di I/O dovrà verificare lo stato di ogni dispositivo, consultando la lista dei descrittori delle periferiche e dei canali. Così, ad esempio se un processo P1 vuole accedere al disco D1, verrà occupata alla linea che unisce la memoria al disco attraverso il canale A. Se a questo punto un secondo processo P2 chiede di accedere al disco D2, questo gli sarà negato, poiché l'unico percorso che unisce D2 alla memoria passa attraverso il canale A già occupato. |
|||
![]() |
|||
Si vengono così a creare dei "colli di bottiglia" che possono pregiudicare il buon rendimento del sistema. Per ovviare a quest'inconveniente sono state sviluppate diverse tecniche hardware tendenti a minimizzare questo fenomeno e quindi ad ottimizzare l'uso dei dispositivi di I/O per verificare se tutti i componenti che formano la linea di trasmissione sono disponibili: |
|||
|
![]() |
![]() |
Canali multiplexati (consentono di sfruttate appieno le potenzialità delle periferiche indipendenti e bufferizzate) |
Periferiche indipendenti | |||
Una prima soluzione consiste nell'utilizzare delle periferiche dotate di opportuni dispositivi, i quali consentono alle stesse di effettuare alcune delle operazioni necessarie per il trasferimento dati, senza l'assistenza costante da parte del canale. In questo modo, mentre la periferica opera autonomamente, il processore di canale potrebbe essere usato per inizializzare una nuova operazione di I/0 su una periferica diversa. Ad esempio, si potrebbe pensare di sfruttare la capacità delle unità a disco di effettuare autonomamente il posizionamento della testina, per ridurre i tempi di occupazione del canale. Infatti, mentre l'unità a disco effettua il posizionamento della testina in base all'indirizzo ricevuto dal canale, quest'ultimo potrebbe essere assegnato alla gestione di operazioni similari su altre periferiche. Per poter sincronizzare opportunamente le operazioni di I/0 su tutte le periferiche collegate allo stesso canale, si usano opportuni segnali di interruzione (interrupt), che vengono attivati ogni volta che un dispositivo (canale o periferica) ha terminato il proprio lavoro. Queste interruzioni, dette interruzioni di fine I/0, vanno ad influenzare alcuni bit della parola di stato del canale (Channels Status Word), che definiscono lo stato di ciascuno dei componenti presenti sulla linea di trasmissione, dando una panoramica completa dei dispositivi disponibili per nuove operazioni.
Con un'organizzazione di questo tipo, sarà compito del sistema operativo andare a controllare, ogni volta che viene richiesta un'operazione di I/0, la parola di stato del canale coinvolto, per verificare se tutti i componenti che formano la linea di trasmissione sono disponibili. |
|||
Periferiche bufferizzate | |||
Una seconda soluzione consiste nell'usare periferiche dotate di aree di memoria autonome (buffer), in cui depositare temporaneamente i dati nel corso delle operazioni di I/0. Ciò consente di ridurre i tempi morti legati alla minore velocità della periferica rispetto al sistema e di conseguenza utilizzare il canale solo per il tempo strettamente necessario all'invio dei dati lungo la linea di trasmissione. Così, ad esempio, se si utilizza una stampante bufferizzata, il canale non dovrà attendere la fine dell'operazione di stampa di un dato, prima di inviare il successivo, ma li potrà trasmettere in sequenza fino al completo riempimento del buffer. In questo modo non saranno necessarie continue sospensioni nella trasmissione e l'operazione di I/0 potrà logicamente considerarsi conclusa dopo l'invio dell'ultimo dato, anche se in realtà non tutti i dati trasmessi sono ancora stati stampati. |
|||
Linee multiple | |||
Un'altra tecnica consiste nell'usare collegamenti più flessibili tra canali e periferiche, per far sì che la disponibilità di una periferica non dipenda totalmente da quella di un particolare canale. La soluzione ideale sarebbe quella di collegare tutte le periferiche ad ognuno dei processori di canale presenti nel sistema, in modo da costituire una rete di trasmissione molto flessibile. In generale, però, dato l'alto costo di realizzazione, ci si limita ad implementare solo un certo numero di collegamenti, cercando di privilegiare le periferiche più usate, il cui funzionamento influenza in modo considerevole il rendimento del sistema (ad esempio le unità a disco). |
|||
![]() |
|||
La struttura a linee multiple presenta inoltre un notevole vantaggio: permette di utilizzare i dispositivi periferici anche in presenza di un guasto su uno dei canali, aumentando così l'efficienza del sistema. Infatti, se un’unità a disco (D1) è collegata a più canali ed uno di questi si guasta, è possibile scollegare il canale rovinato senza per questo arrestare il sistema o non utilizzare più D1. | |||
![]() |
|||
Canali multiplexati | |||
Con le unità di canale convenzionali le potenzialità delle periferiche indipendenti e bufferizzate non possono essere sfruttate appieno, in quanto il processore di canale è in grado di servire un unico programma alla volta. Per questo motivo il collegamento tra unità di canale e periferica rimane attivo per tutto il periodo necessario all'esecuzione del programma di canale. Con i canali multiplexati, invece, si introduce una specie di multiprogrammazione a livello di I/0; il processore di canale, in questo caso, è infatti in grado di servire "contemporaneamente" più programmi di canale. Ciò significa, in pratica, che quando viene iniziata un'operazione di I/0 su una periferica bufferizzata o indipendente, non appena tale attività non richiede l'intervento diretto del processore di canale, quest'ultimo viene dirottato automaticamente su un altro programma per assistere una nuova operazione di I/0. Da quanto fin qui detto, appare evidente che le soluzioni presentate sono tra loro complementari e possono essere usate contemporaneamente, onde poter sfruttare tutti i vantaggi che ciascuna di esse presenta. La scelta delle periferiche e delle tecniche da usare per il loro collegamento al sistema deve quindi essere fatta in base alle esigenze di efficienza, economicità e velocità presenti all'interno del centro di calcolo. Così, ad esempio, dovendo gestire molti lavori che richiedono spesso la stampa di lunghi tabulati, sarà conveniente adottare una gestione a spool e collegare al sistema, attraverso uno o più canali multiplexati, una o più stampanti veloci dotate di un buffer piuttosto ampio. Se invece il centro è collegato con molti utenti, i quali lavorano quasi esclusivamente in modo interattivo attraverso dei terminali video, sarà necessario predisporre un adeguato numero di canali e di linee di collegamento, in modo tale da ridurre al minimo la possibilità che una richiesta di I/0 rimanga per molto tempo inevasa. |
|||
Bibliografia | |||
|
|||
Approfondimenti | |||
In certi sistemi, i registri sono costituiti da locazioni della memoria principale (ad esempio nel PC IBM al controller della tastiera è riservata la locazione da 060 a 063. a quello del display monocromatico la locazione da 380 a 3BF a quello del display a colori da 3D0 a 3DF a quello del floppy disk da 3F0 a 3F7, ecc |
|||
Mezzo di trasmissione: mezzo fisico (canale) quale l'etere, il doppino telefonico, la fibra ottica o il cavo coassiale, mediante il quale è possibile trasmettere l'informazione tra due entità, quella Sorgente e quella Destinazione. Il canale di comunicazione è determinante per mantenere fedele all'originale il messaggio trasmesso a destinazione (affidabilità di un canale). Sorgente -> Canale (mezzo trasmissivo) -> Destinazione |