Periferiche e loro gestione
Last updated
Last updated
La CPU utilizza quasi tutto il tempo a caricare le istruzioni dalla memoria ed ad eseguirle. Tuttavia la CPU e la memoria principale sono solo due dei tanti componenti in un computer reale. Un sistema completo contiene altri device (periferiche) come:
Un hard disk o disco allo stato solido per immagazzinare programmi e file. (La memoria principale contiene solo una piccola parte di informazioni in paragone e le immagazzina solo fino a quando il sistema è acceso. Un disco fisso o un disco allo stato solido è utilizzato per l'immagazzinamento permanente di grosse quantità di informazioni, ma i programmi devono essere caricati nella memoria principale prima di essere eseguiti. Un hard disk immagazzina i dati su un disco magnetico, mentre un disco allo stato solido è un device puramente elettronico senza parti in movimento.)
una tastiera o un mouse per input dell'utente;
un monitor o una stampante per mostrare l'output di un computer;
un device audio per permettere al computer di emettere suoni;
una network interface (interfaccia di rete) che permette a un computer di comunicare con altri computer che sono connessi in rete, sia wireless o con cavi;
uno scanner che converte immagini in insieme di byte che possono essere immagazzinati e modificati dal computer.
La lista dei device è aperta, un computer è costruito in modo da essere facilmente espandibile aggiungendo altri device. In qualche modo la CPU deve comunicare e controllare questi device. La CPU può solo fare questo eseguendo delle istruzioni in linguaggio macchina (la CPU sa fare solo questo). Il modo in cui funziona è che per ogni device nel sistema, c'è un device driver (detto anche solo driver), che è un software che la CPU esegue quando deve interagire con il driver. Installare un nuovo device su un sistema generalmente consiste in due step: aggiungere fisicamente il device al computer, e installare il device driver. Senza il driver, il device fisico sarebbe inutilizzabile, perché la CPU non sarebbe in grado di comunicare con esso.
Un computer in quanto ha molti device è organizzato collegando questi device da uno o più bus. Un bus è un insieme di cavi che trasportano diversi tipi di informazioni tra i device connessi da questi cavi. I cavi portano dati, indirizzi e segnali di controllo (comandi). L' indirizzo serve per dirigere il dato a un device particolare o a un registro particolare del device. Il segnale di controllo potrebbe servire per dare comandi al device. Un semplice esempio di computer potrebbe essere:
Ora, device come periferiche, mouse e network interface possono produrre input che devono essere processati dalla CPU. Come fa la CPU a sapere che ci sono dei dati? Un modo semplice, ma non molto soddisfacente, potrebbe essere quello di continuare al controllare da parte della CPU se sono arrivati nuovi dati. Fino a quando non trova il dato e lo processa. Questo metodo si chiama polling, perché la CPU fa il 'polls' (sondaggio) del device di input continuamente per vedere se hanno dei dati di input arrivati. Sfortunatamente sebbene il polling sia molto semplice, è anche molto inefficiente. La CPU può sprecare inutilmente tanto tempo aspettando che arrivi l'input.
Per evitare questa inefficienza, gli interrupt sono generalmente utilizzati. Un interrupt è un segnale inviato dal device alla CPU. La CPU risponde a un segnale di interrupt, mettendo da parte quello che stava facendo in modo da rispondere immediatamente all'interrupt. Una volta che ha gestito l'interrupt, cioè ha fatto tutte le azioni necessarie che richiedeva la periferica che ha mandato il segnale di interrupt, solo allora ritorna a fare quello che stava facendo prima che l'interrupt accadesse. Ad esempio quando voi pigiate un tasto della tastiera del computer, un interrupt della tastiera è inviato alla CPU. La CPU risponde a questo interrupt interrompendo cosa stava facendo, leggendo il tasto che abbiamo premuto, processandolo, a poi ritornando al task (compito) che stava compiendo prima che avessimo pigiato il tasto.
E' da capire che questo è un processo puramente meccanico: Un device segnala un interrupt semplicemente inviano un impulso elettrico su un cavo. La CPU è costruita in modo, che quando arriva il segnale, la CPU salvi abbastanza informazioni di quello che stava facendo, così da poter tornare poi a riprendere quello che stava facendo. Questa informazione consiste nel contenuto di alcuni registri importanti della CPU come il program counter. Allora la CPU salta in alcuni zone di memoria predeterminate e comincia ad eseguire le istruzioni li immagazzinate. Queste istruzione fanno parte dell' interrupt handler (codice che gestisce l'interrupt, detto anche gestore dell'interrupt o routine di interrupt) che fa le operazioni per rispondere all'interrupt. (Questo interrupt handler è parte del software del device driver della periferica che ha inviato l'interrupt). Al termine del interrupt handler c'è un istruzione che dice alla CPU di tornare a cosa stava facendo; lo fa ripristinando lo stato precedentemente salvato.
Gli interrupt permettono alla CPU di gestire eventi asincroni. Nel ciclo normale fetch-and-execute (carica l'istruzione ed eseguila), le cose avvengono nell'ordine predeterminato; ogni cosa che accade è "sincronizzata" con tutte le altre. Il meccanismo degli interrupt permette alla CPU di gestire in modo efficiente eventi che accadono in modo "asincrono", cioè, in momenti non predefiniti.
Un altro esempio di come gli interrupt sono usati, consideriamo cosa succede quando la CPU ha bisogno di accedere a dati che sono immagazzinati sull'hard disk. La CPU può accedere ai dati direttamente solo se sono nella memoria principale. I dati sul disco devono essere copiati nella memoria principale prima che possano essere acceduti. Sfortunatamente, rispetto alla scala di velocità con cui la CPU opera, l'hard disk è molto lento. Quando la CPU ha bisogno di dati dal disco, la CPU invia un segnale all'hard disk dicendo di prendere i dati e prepararli. (Il segnale è inviato in modo sincrono, sotto il controllo di un programma normale) A questo punto, invece di aspettare per un tempo indefinito e lungo (respetto ai tempi della CPU) che l'hard disk completi l'operazione, la CPU va avanti ed esegue qualche altro task (compito - programma). Quando l'hard disk ha i dati pronti, esso invia un segnale di interrupt alla CPU. L'interrupt handler può a questo punto leggere i dati richiesti.
Finora abbiamo analizzato il "cuore" di un elaboratore, ossia la sua unità centrale (processore, memoria principale) e i dispositivi di memorizzazione secondaria (permanente).
Fino ad ora non abbiamo tuttavia analizzato come possa avvenire l'interazione tra l'uomo e la macchina.
Qui analizzeremo brevemente le caratteristiche dei dispositivi di input/output (anche detti "periferiche"), il cui ruolo è proprio quello di rendere possibile (e semplice) l'interazione tra l'uomo e la macchina.
Prima di analizzare in modo specifico i diversi modi e dispositivi di iterazione, è opportuno un discorso generale. Sebbene, in effetti, vi sia un notevole numero di diversi dispositivi di interazione, tutti tali dispositivi hanno delle caratteristiche funzionali comuni che giustificano il fatto che essi vengano usualmente trattati dal punto di vista funzionale come un'unica classe di componenti hardware.
La prima, ovvia, caratteristica comune a tutti i dispositivi, è che la loro funzione primaria è quella di consentire l'immissione di dati all'interno dell'elaboratore (input), o l'uscita di dati dall'elaboratore (output). In molti casi tali comunicazioni avvengono tra l'elaboratore e un utente umano (e questo sarà vero nella quasi totalità dei casi che considereremo); è tuttavia comune avere anche comunicazioni tra elaboratori e altri tipi di apparecchiature (si pensi ai computer di bordo che analizzano e gestiscono un aereo in volo e che interagiscono - in modo attivo o passivo - con la strumentazione dell'aereo o con rilevatori e attuatori situati nella meccanica dell'aereo stesso). La funzione primaria dei dispositivi è dunque quella di effettuare il passaggio di dati da una forma esterna alla forma interna usata dall'elaboratore e/o viceversa.
Una seconda caratteristica dei dispositivi di input/output è quella di avere limitata autonomia rispetto al processore centrale.
In particolare, si dice usualmente che i dispositivi sono "schiavi" del processore centrale nel senso che la loro attività deve essere completamente gestita, controllata e coordinata dal processore centrale (e, in particolare, dal sistema operativo, come vedremo in seguito).
Alcuni dispositivi sono completamente "stupidi" nel senso che non sono in grado di effettuare alcun tipo di elaborazione e gestione dei dati che producono in input o output; altri dispositivi sono più "intelligenti", essendo essi stessi dotati di un processore specializzato e di una memoria, e sono in grado di effettuare elaborazioni di tali dati.
Alla prima categoria appartiene ad esempio un terminale video (o una tastiera) il cui unico ruolo è quello di trasmettere in uscita un carattere fornito dal processore (o trasmettere in ingresso un carattere digitato dall'utente); alla seconda categoria appartengono le stampanti più sofisticate che sono in grado di mantenere in una loro memoria privata le informazioni da stampare e che sono in grado di mantenere in una loro memoria privata le informazioni da stampare e che sono in grado di fare elaborazioni finalizzate alla produzione della stampa stessa.
Indipendentemente dal fatto di essere più o meno intelligenti, una caratteristica comune a tutti i dispositivi è quella di operare in modo "asincrono" rispetto al modo di operare del processore. Consideriamo, ad esempio, un dispositivo che produce dati in input (ad esempio una tastiera). Il momento in cui il dato di input è pronto è del tutto non prevedibile da parte del processore e quindi non può in alcun modo essere controllato dal processore stesso. Allo stesso modo, il momento in cui un dispositivo in output ha terminato di produrre dati in uscita non è in alcun modo prevedibile da parte del processore. Poiché, tuttavia, deve essere il processore a gestire il funzionamento dei dispositivi e, in particolare, a inviare comandi ai dispositivi perché essi svolgano operazioni di input/output, è necessaria una qualche forma di sincronizzazione tra i dispositivi stessi e il processore. L'idea in particolare è che:
un dispositivo di input deve avvertire il processore quando un dato di input è disponibile in modo tale che il processore prelevi tale dato per poterlo utilizzare e ordini al dispositivo stesso di mettersi in attesa di nuovi dati in input;
un dispositivo di output deve avvertire il processore quando ha terminato di produrre dei dati in uscita in modo che il processore possa fornirgli un nuovo ordine per produrre altri dati in uscita.
Tali operazioni di sincronizzazione delle attività sono fondamentali nell'interazione tra processore e dispositivi. Il modo in cui la sincronizzazione viene effettuata verrà discusso più avanti come parte del sistema operativo (in realtà, infatti, i dispositivi sono gestiti dal sistema operativo più che dall'hardware del processore). Intuitivamente l'idea è che al momento in cui hanno terminato un'operazione (e quindi un dato in input è disponibile o si è terminato di produrre dati in output) i dispositivi inviano un segnale hardware (detto "interrupt" o "interruzione") al processore richiedendo l'attenzione del processore stesso. Ad ogni ciclo di clock, l'unità di controllo prima di iniziare l'esecuzione della prossima istruzione del programma in corso, va a verificare se è arrivato un segnale di interrupt da un qualche dispositivo. Se non è arrivato, prosegue normalmente; altrimenti sospende per un attimo l'esecuzione del programma in corso e si preoccupa di dar retta al dispositivo (in sostanza nel caso di un dispositivo di input preleva il dato; in ogni caso invia un nuovo ordine al dispositivo).
Un ultimo aspetto comune ai dispositivi è quello di essere collegati al processore centrale attraverso canali di comunicazione ("bus") su ognuno dei quali viene inserito (dal lato del processore) una componente hardware (il "controller") che gestisce la comunicazione con il dispositivo.
Detto di tali caratteristiche generali, possiamo analizzare in modo più preciso i diversi tipi di dispositivi di uso comune. Distingueremo tra i dispositivi di input e quelli di output e tra i dispositivi "a carattere" (in cui ad ogni operazione viene prodotto in ingresso o in uscita un singolo byte) e quelli "a blocchi" (in cui ad ogni operazione si gestisce un blocco di informazioni). Una osservazione è tuttavia ancora importante. Solitamente anche i supporti di memoria secondaria sono catalogati tra i dispositivi di input/output. In effetti, dal punto di vista della gestione, i dischi e i nastri creano gli stessi problemi degli altri dispositivi nel senso che sono schiavi del processore centrale, operano in modo asincrono e vengono gestiti dal sistema operativo mediante il meccanismo delle interruzioni.