vuoi
o PayPal
tutte le volte che vuoi
Dispositivi di Input/Output
In genere i dispositivi di Input producono i dati che la CPU deve leggere, gli esempi più lampanti sono il mouse e la tastiera; ci sono poi i dispositivi di output che permettono di visualizzare i dati presenti nel computer, cioè i risultati delle elaborazioni della CPU, gli esempi più lampanti sono il monitor, la stampante, gli altoparlanti, le cuffie, e i plotter. Ci sono infine i dispositivi di input/output come il modem che sono in grado sia di trasmettere che ricevere dati al/dal computer. I dispositivi possono essere suddivisi in tre grosse categorie in funzione delle modalità con cui essi "manipolano" i dati su cui operano:- Dispositivi a blocchi: memorizzano e trasferiscono le informazioni in blocchi di dimensione fissa, ciascuno con un suo indirizzo. La dimensione del blocco varia da 512-32,768 byte.
- Dispositivi a carattere: memorizzano e trasferiscono stringhe di byte senza riferimento ad alcuna struttura di blocco.
- Dispositivi di rete:
software offerto da terze parti possa interagire con il resto del Sistema Operativo.
Una componente elettronica che prende il nome di interfaccia, o device controller, che come accennato prima è una sorta di scheda che si occupa di gestire la parte meccanica della periferica (device) permettendo la comunicazione fra il Processore ed il Device attraverso la scrittura/lettura in 3 registri bifilari (cioè che presentano un doppio bus dal/verso il Processore/Device).
Più precisamente un'interfaccia I/O deve:
- fornire porte di ingresso per i dati che devono essere inviati alla CPU e le porte di uscita per i dati che devono essere trasferiti alla periferica (in entrambi i casi è coinvolto il data bus);
- essere in grado di decodificare istruzioni e indirizzi delle porte da utilizzare (le istruzioni viaggiano sul control bus, gli indirizzi sullʼaddress bus);
- fornire eventuali registri o buffer di appoggio per i comandi alla periferica;
- tenere traccia dello stato della periferica e notificare il Processore in caso di eventi o errori.
stato della periferica e delle eventuali condizioni di malfunzionamento o di errore, consentendone la lettura (mediante segnali di stato es. BUSY e READY).
Eseguire le conversioni di formato richieste per il trasferimento dei dati (es. seriale - parallelo). Grazie all'interfaccia I/O il Processore vede un Device sempre allo stesso modo, ovvero come un set di 3 famiglie di registri dai quali può leggere o scrivere. Grazie a questa standardizzazione è possibile sostituire un device senza modificare l'interfaccia oppure il driver.
Data Register DR: Il processore ci scrive i dati da inviare al Device se è di output (ad esempio i dati da stampare sul Monitor) oppure il Device ci scrive i dati da inviare al Processore se è di input (ad esempio i dati letti dalla tastiera). Si tratta quindi di un buffer di transito bidirezionale;
Control Register CR: È un registro di sola scrittura nel quale il Processore ci scrive i comandi rivolti al device.
Deve essere il driver a decidere una logica di controllo con il quale il Processore chiede al device di effettuare determinate operazioni di Input/Output, da solo infatti il Processore non conosce la logica e non è in grado di comunicare ordini al device. Status Register SR: È un registro di sola lettura dal quale il Processore apprende lo stato attuale del device. Esso contiene una serie di flags che sintetizzano lo stato del device (ad esempio pronto, errore, occupato, etc). Anche qui occorre una logica di controllo che fornisca un significato a questa serie di flags.
Affinché il Processore possa comunicare con un Device Controller è necessario risolvere 2 problemi: il primo riguarda la modalità con la quale esso può accedere ai registri, e a tal riguardo vengono fornite 2 alternative:
L'approccio Memory Mapped I/O consiste nell'utilizzare lo stesso bus per indirizzare sia la memoria che i dispositivi, in tal modo i
dispositivi vengono visti dal processore come se fossero locazioni di memoria nello stesso spazio di indirizzamento, questo è l'approccio più utilizzato, ed è tipico del Motorola 68000. Con l'I/O associato a un indirizzo di memoria, ogni istruzione macchina che può accedere alla memoria può essere impiegata per trasferire dati da e verso un dispositivo di I/O, cioè le operazioni di I/O sono diventano esattamente quelle per leggere/scrivere dalla Memoria (load e store).
L'alternativa è un approccio Isolated I/O nel quale si utilizzano bus separati per indirizzare la Memoria ed i dispositivi per cui questi ultimi hanno uno spazio di indirizzamento separato da quello della Memoria. Si adottano istruzioni di I/O dedicate a manipolare i registri, ed a livello Hardware è necessario prevedere degli opportuni meccanismi (I/O bus, linee dedicate) per separare gli indirizzi di I/O da quelli relativi alla Memoria. Ad esempio
Processori Intel adottano la soluzione I/O port: ad ogni registro è assegnato un numero di 8/16 bit che specifica la porta di I/O corrispondente a cui si riferisce usando istruzioni I/O. Il secondo problema riguarda la scelta di un Protocollo per comunicare, ovvero una politica digestione dell'IO, ma queste modalità di gestione delle periferiche vengono trattate a parte nel prossimo paragrafo.1.1.1. Tecniche di Gestione dell'I/O
Siccome le Periferiche devono trasferire dei dati da/verso il mondo esterno queste ultime saranno estremamente più lente rispetto al Processore. Tuttavia il Processore nel suo ciclo di elaborazione, oltre alle operazioni CPU Bound, avrà bisogno anche di utilizzare le Periferiche per effettuare operazioni di Input/Output (meglio note come operazioni I/O Bound), mandando a queste un comando ed attendendo che il risultato sia pronto. L'idea però sarebbe quella che le periferiche lavorassero il più possibile in
parallelo al processore, in modo da usare al massimo le risorseHardware, alternando il più possibile operazioni CPU Bound con quelle I/O Bound, tuttavia data la grandissima differenza di velocità fra Processore e Periferiche il Processore si ritroverà a buttare la maggior parte del suo tempo in attesa del risultato di una qualche Periferica. Per tale motivo una volta effettuata una richiesta di I/O alla Periferica il Processore dovrà continuare la sua elaborazione e prendere il risultato dalla Periferica soltanto quando esso è pronto, a tal riguardo ci sono 3 differenti politiche per acquisire i risultati dalle periferiche solo quando essi sono pronti:
Programmed I/O (o Polling): anche nota come Gestione a Controllo di Programma, o Attesa Attiva, il Processore manda un comando di I/O nel Control Register dell'interfaccia del Device, e verifica se la risposta è pronta leggendo continuamente il bit Ready dallo Status Register mediante un loop di
busy-wait (polling). Questo loop verifica continuamente se il dispositivo è pronto o meno ad accettare dati o comandi, oppure a produrre un output. Il vantaggio di questa politica è che non richiede Hardware aggiuntivo ed è molto semplice da implementare, ma il grosso problema è che la maggior parte del tempo di CPU è sprecato nell'osservare lo stato della periferica in attesa che sia pronta per un nuovo trasferimento, per cui si vincola la CPU ad eseguire istruzioni alla velocità della periferica (che in genere è molto più lenta della CPU), per cui questa politica è efficiente solo se la velocità del dispositivo è paragonabile con quella della CPU. Un miglioramento consiste nel fare un Overlapping dell'IO mediante un Periodic Polling: invece di aspettare il risultato della Periferica il Processore effettua altre operazioni CPU Bound andando a verificare ogni tanto se il risultato della periferica è
pronto.Interrupt Driven I/O: Il Processore manda un comando di I/O nel Control Register dell'interfaccia del Device, dopodiché torna a fare il suo lavoro senza effettuare alcuna lettura dalla Periferica. Quando quest'ultima è pronta essa stessa avvisa il Processore mediante un'interruzione esterna, alla cui ricezione il Processore deve interrompere tutto ciò che stava facendo per servire la richiesta. In altre parole la CPU ordina al controller di abilitare gli interrupt, poi fa altre cose. Quando l'operazione di I/O diventa possibile, il bit Ready del Controller Register viene settato e, poiché lo status register ha cambiato valore, il controller lancia un interrupt che avvisa la CPU. La CPU controlla lo status register, vede settato il bit Ready e fa l'operazione. Questa soluzione elimina tutti i tempi morti di attesa dei risultati del Polling al costo di introdurre un Hardware aggiuntivo dedicato (ad esempio una o più linee).
esterne per ricevere i segnali di interrupt).
DMA: il Processore utilizza un dispositivo Hardware dedicato chiamato Direct Memory Access (DMA) per delegare laddove è possibile i trasferimenti dei dati fra Periferiche e Memoria al posto del Processore. In altre parole dovendo trasferire più words in I/O, la CPU ordina al DMA di eseguire tutte le operazioni, indicando quante word trasferire, l'indirizzo d'inizio dell'area di memoria in cui mettere/prendere le words e la periferica a cui accedere. Poi la CPU può fare altro, mentre il DMA trasferisce i dati senza impegnare la CPU (e i registri della CPU) ma impegnando il BUS (il DMA ha più priorità della CPU nell'accesso al BUS). Finito il trasferimento il DMA lancia un interrupt per avvisare la CPU della conclusione delle operazioni. Il DMA quindi funge da coprocessore ed è utilizzato quando ci sono grosse quantità di dati da trasferire (esempio per gli Scanner).
Essendo il
Il meccanismo più utilizzato in genere è quello delle Interrupt. In questo articolo verrà fornita una panoramica sul funzionamento delle Interrupt, partendo dalla definizione di Interr.