CAPITOLO 3 – Operazioni di I/O
Transcript
CAPITOLO 3 – Operazioni di I/O
CAPITOLO 3 – Operazioni di I/O OPERAZIONI DI I/O Nella slide sono distinti tre differenti tipi di operazioni di I/O che possono essere I/O Programmato o I/O Interrupt-Driven oppure di tipo DMA, Direct Memory Access. I/O PROGRAMMATO Eseguito a seguito di una istruzione di I/O di un programma Il modulo di I/O esegue soltanto l’azione richiesta È compito del processore controllare lo stato e l’avanzamento del modulo di I/O tramite: istruzioni di controllo (attivazione) istruzioni di test (verifica dello stato) operazioni di lettura e scrittura L’I/O Programmato è eseguito da un’istruzione di programma ed è eseguito soltanto a richiesta, è compito del processore controllare l’avanzamento del modulo di I/O. I/O INTERRUPT DRIVEN Alleggerisce il processore della fase di test del modulo Per l’I/O Interrupt-Driven è l’azione esterna delle interruzioni che abilita le operazioni di trasferimento. di I/O È il modulo di I/O che quando ha terminato le proprie operazioni informa il processore sul proprio stato con una interruzione Tutto il flusso di dati, tuttavia, passa per il processore DIRECT MEMORY ACCESS Consente di trasferire i dati in modo diretto fra memoria e modulo di I/O Un comando DMA contiene: richiesta di operazione (lettura o scrittura) indirizzo del dispositivo di I/O-locazione di partenza della memoria numero di parole da trasferire Processore e modulo DMA condividono solo il bus del sistema Il modulo d’accesso diretto alla memoria manda un segnale di interruzione al processore, che risulta impegnato solo all’inizio e alla fine del trasferimento, a questo punto il modulo DMA effettuerà il trasferimento delle parole via bus da un registro all’altro, parola dopo parola, o se vogliamo da un buffer all’altro. INPUT OUPUT Passiamo ad analizzare le operazioni di Input/Output che altro non sono che dei flussi di esecuzione con e senza interruzioni FUNZIONI DI I/O Possono essere controllate dal processore il processore controlla il flusso dei dati fra memoria e dispositivo periferico Possono essere demandate al dispositivo di controllo (controller) del dispositivo, ovvero il modulo di I/O il processore demanda le funzioni al modulo di I/O che accede direttamente alla memoria (DMA Direct Memory Access) Si è visto che il trasferimento può aver luogo, attraverso o sotto il controllo diretto del processore, e quindi il processore controlla il flusso dei dati tra la memoria e il dispositivo periferico, oppure può essere sotto il controllo del modulo di I/O. Nel caso del trasferimento sotto il controllo del modulo di I/O si ha un accesso diretto al modulo, ossia si ha un’esecuzione del DMA. Vediamo in concreto di che cosa si tratta. Il trasferimento non ha bisogno che la CPU stia a definire l’indirizzo della locazione di partenza e della locazione di arrivo per ogni operazione, ma è sufficiente che un registro di indirizzamento, uno dopo l’altro, indirizzi le locazioni di memoria da cui si deve fare il prelievo e un altro registro indirizzi, uno dopo l’altro, con l’autoincremento la locazione della memoria in cui deve essere depositato il file in considerazione. In questo caso è sufficiente impostare la prima locazione di memoria da cui deve essere prelevato il primo dato e la locazione di memoria in cui deve essere depositato il primo dato del file e poi autoincrementandosi si trasferiscono, occupando solo il bus del registro. Nel frattempo la CPU può fare altre cose. Questo è il concetto di DMA che è venuto fuori con le macchine pdp 11 alla fine degli anni ’60. 1 INTERRUZIONI Nella slide vediamo la presentazione del concetto d’Interrupt. L’Interrupt è un’azione che può essere generata dall’esterno, e serve per interrompere il normale prosieguo del processore arrestando alla fine del ciclo di istruzione il processo. Perché è stato inventato alla fine degli anni ’60 il concetto d’Interrupt? Per migliorare l’efficienza dell’elaborazione, cioè era necessario trovare un meccanismo per interrompere l’avanzamento ordinario dei processi all’interno della macchina. Uno dei primi dispositivi periferici su cui fu usato fu la teletype che per stampare un carattere anziché stare ad impegnare il processore nel controllo continuo dello stato della stampante, quando l’operazione di stampa del carattere era finito, mandava un segnale al processore per avvertirlo che poteva avviare il trasferimento di un altro dato. CLASSI DI INTERRUZIONI Le classi più comuni di interruzione sono di: Programma errore di esecuzione Timer operazioni pianificate I/O operazioni di I/O Errore hardware problemi fisici È una generalizzazione delle interruzioni ed evidenzia le diverse classi d’interruzioni. Persino un errore d’esecuzione all’interno del programma finisce per generare un Interrupt che è più propriamente definito come trap nelle macchine. Nell’uso di sistemi operativi, vedremo quelli generati da time sharing, dove normalmente è il timer che dopo aver contato il tempo trascorso e confrontato con quello preassegnato genera una interruzione per avvertire il sistema operativo che deve cambiare il processo in avanzamento. Le operazioni di I/O ne sono un altro esempio, ma ci possono essere anche degli errori legati a problemi fisici che devono dare avvio a routine di allarme agli operatori. Per esempio si può montare un nastro magnetico, montato male, o non riavvolto, allora si può generare un Interrupt per avvertire l’operatore che il nastro è montato male, quindi quello che normalmente avviene è di avvertire, con una routine di stampa sulla consolle, cosa è successo. ACQUISIZIONE DATI CON INTERRUPT In questa slide si presenta il meccanismo di funzionamento dell’interruzione. E’ riportato un semplice programma che permette l’acquisizione uno dopo l’altro dei caratteri che sono digitati durante la scrittura. Naturalmente, le macchine attuali non fanno questo, infatti esse memorizzano tutta la stringa di riga dei 132 caratteri in un buffer e poi trasferiscono in memoria centrale tutto il record di 132 caratteri. In questo caso particolare lo supponiamo, perché è interessante notare il funzionamento dell’Interrupt. Si suppone che il processore lavori per conto suo ed ogni volta che si pigia un carattere il carattere è trasferito dal buffer periferico, cioè dal buffer della teletype o della keyboard, in una locazione di memoria. Allora, innanzitutto, bisogna definire da quale locazione di memoria si inizia a memorizzare, si suppone che l’inizio della memoria destinata a conservare i caratteri pigiati è la locazione di memoria 1.000, quindi, come si vede, si inserisce l’indirizzo della locazione di memoria nel registro R0 e poi il processore si ferma. Occorre dopo precisare che realmente il processore non si ferma ma può elaborare altri programmi, però in questo caso che stiamo descrivendo si suppone che il processore si fermi. Allora accade che si pigia un carattere e in quel momento si genera l’Interrupt. Realmente l’Interrupt manda in funzione una routine di interruzione che si trova registrata a partire dalla locazione di memoria 2.000, quindi praticamente si potrebbe battere più di 1.000 caratteri, perchè se la locazione di memoria da 2.000 in avanti è occupata dalla routine di servizio le locazioni tra la 1.000 e la 2.000 sono le uniche disponibili. Questo fa capire che i problemi della protezione della locazione di memoria sono problemi consistenti e reali. Naturalmente, bisogna considerare la priorità in cui è eseguita la routine d’interruzione, ossia di trasferimento dal buffer nella locazione di memoria. Normalmente i processi utenti avanzano con priorità 4 nella macchina, è chiaro quindi che la routine d’interruzione dovrà avere una priorità più alta, perché si è fatto l’esempio che il processore stia fermo, ma normalmente il processore può fare altre cose e le fa con la priorità 4, mentre quando il segnale d’interruzione arriva con la priorità 5, questa messa nella Program Status Word, permette alla routine di interruzione di avere il privilegio rispetto agli altri programmi utenti. In quel punto, accade che il contenuto del buffer della teletype o della keyboard, è spostato nel registro, nella locazione di memoria indirizzata dal registro R0, che si sa è 1.000, e non appena è indirizzato, il contenuto di R0 si autoincrementa e dalla locazione di memoria 1.000 passa a 1.001 o 1.002, dipende da com’è stato organizzato l’hardware, dopodiché la routine di spostamento si conclude con un ritorno dall’Interrupt. Quando sarà pigiato un altro tasto sarà generata un’altra interruzione e sarà riavviata la routine di controllo della interruzione e verranno trasferiti uno dopo l’altro tutti i caratteri che sono stati digitati. A questo punto si nota qual è il meccanismo 2 della generazione degli Interrupt, è necessario quindi vedere le linee d’interconnessione tra le diverse componenti e cioè vedere se c’è il bus o anche ci sono i bus dipende dall’architettura della macchina. Se si prendono le linee di bus, si vede che ci sono delle linee di dati, delle linee d’indirizzo e ci sono delle linee riservate alle interruzioni. Normalmente nei primi calcolatori quelli abbastanza semplici, perché in quelli moderni il meccanismo d’interruzione si sviluppava tutto via software tranne il segnale hardware che deve far viaggiare per forza le informazioni sulla richiesta d’interruzione, venivano di solito riservate alcune linee erano 5-6 linee, cioè quando si pigiava il tasto la linea chiamata Interrupt mandava un segnale, il segnale raggiungeva l’Interrupt Control Board cioè la scheda di controllo delle interruzione, e cominciava un dialogo tra la CPU e il dispositivo periferico che aveva mandato questo Interrupt. La prima cosa che si faceva era una risposta da parte del processore di acknowledgment, cioè di riconoscimento del segnale, però quel segnale serviva ad aprire la linea su cui stava un altro segnale che definiva il livello di priorità. Il livello di priorità poteva essere priorità 5, priorità 6, priorità 7, oppure Non Process Request, cioè una richiesta forzata di interruzione con priorità superiore a tutte le altre. L’azione di scambio terminava con il riconoscimento attraverso un grant e varie bus request line erano servite da varie bus grant. La concessione del bus era fatta al dispositivo periferico, perché il dispositivo periferico doveva mandare due parole. Una prima parola che era la Program Status Word, cioè la priorità con cui doveva essere eseguita la routine di servizio del dispositivo e una seconda parola era l’indirizzo in cui si trovava il programma che doveva essere eseguito. In quest’esempio il programma che deve essere eseguito è a partire dalla 2.000. Il programma a quel punto è eseguito con la priorità assegnata messa nella Program Status Word nel trasferimento della prima parola, perché la richiesta di priorità deve essere di livello 7, ma poi l’esecuzione della routine collegata a quel livello di priorità può essere di livello più basso, o anche può accadere il contrario, anche se è un po’ difficile. Dopodiché si esegue la routine e poi si ritorna dall’Interrupt. Il meccanismo delle interruzioni, molto velocemente presentato, fa capire che classi d’interruzioni ce ne possono essere molte. Per esempio ci possono essere interruzioni che si completano una dopo l’altra, ci possono essere interruzioni all’interno delle interruzioni con livelli multipli quanti se ne vuole. L’importante è che devono esistere, in realtà, nelle macchine meccanismi tali da poter bloccare i processi in avanzamento e dare la possibilità alle routine di servizio delle interruzioni di poter essere eseguite. FLUSSI DI ESECUZIONE La slide mostra concetti riguardanti il flusso di controllo del programm a con e senza Interrupt. TIPOLOGIA DELLE INTERRUZIONI Le interruzioni possono essere: Hardware (Interrupt) Praticamente quasi tutte le interruzioni sono hardware Software (Trap) Si tratta di specifiche istruzioni privilegiate del linguaggio di macchina che svolgono le stesse funzioni degli interrupt hardware La slide mostra le due tipologie d’interruzioni che ci possono essere. Le interruzioni hardware o Interrupt, che sono la maggior parte, e le interruzioni software o trap che corrispondono ad istruzioni privilegiate del linguaggio di macchina e svolgono le stesse funzioni degli Interrupt hardware. 3 GESTIONE DELLE INTERRUZIONI Per gestire le interruzioni, al ciclo di istruzione, si aggiunge il ciclo di interruzione Alla fine del ciclo di istruzione , se è stata fatta una richiesta di interrupt, il programma in esecuzione viene interrotto e viene lanciato un nuovo programma, quello invocato dalla interruzione. L’interrupt viene sempre processato alla fine di un ciclo di istruzione. Non può essere processato alla fine di un ciclo di macchina. Nei moderni calcolatori, per gestire le interruzioni, al ciclo d’istruzione si aggiunge il ciclo d’interruzione. Quindi, se è stata fatta una richiesta d’Interrupt alla fine del ciclo d‘istruzione il programma in esecuzione è interrotto ed è lanciato un nuovo programma invocato dalla interruzione. Si precisa che l’Interrupt è sempre processato alla fine di un ciclo di istruzione e non alla fine di un ciclo di macchina. SCHEMA DI GESTIONE DELLE INTERRUZIONI? Una rappresentazion e più generale dei meccanismi d’interruzione è mostrata nella figura, dove si vede che una volta che un processo inizia, cioè un programma va in esecuzione, le varie istruzioni, ciclo dopo ciclo, passando attraverso la fase di fetch e la fase di esecuzione, sviluppano il programma stesso, tranne se è abilitata la linea dei comandi di interruzione, infatti, essa può essere abilitata o disabilitata quindi essere o no avviato un ciclo di interruzione che si immette nel ciclo ordinario di fecht ed execute. ELABORAZIONE DELLE INTERRUZIONI Nella Slide si descrive il meccanismo di generazione delle interruzioni e la sua elaborazione. Vediamo che il controller del dispositivo, che può essere la stampante, il monitor o qualunque altro dispositivo, controlla l’emissione dell’interruzione. Il processo in esecuzione completa il ciclo di macchina relativo all’istruzione in elaborazione, segnala contemporaneamente l’interruzione e salva il Program Counter del processo in esecuzione e il valore della Program Status Word nello stack. Contemporaneamente carica, perché trasferito dal dispositivo che ha mandato il comando d’interruzione, il valore della nuova Program Status Word e, di conseguenza, l’inizio della routine di interruzione nel Program Counter elabora il programma relativo alla interruzione e successivamente il valore del Program Counter, riavviando il processo che era stato sospeso. 4 MOLTEPLICITÀ DELLE INTERRUZIONI Le interruzioni possono essere di molteplicità: Singola (interruzioni semplici) Quando si verifica una sola interruzione alla volta. Multipla (interruzioni multiple) Quando si verificano interruzioni nelle interruzioni. In questa slide sono riportati i meccanismi d’interruzione che possono essere di livello singolo o anche multiplo. Il livello singolo avviene quando il processo che è in avanzamento è interrotto quindi è eseguita la routine d’interruzione e poi com’è stato descritto in precedenza si ha il ripristino dello stato relativo al processo interrotto. Se però durante l’esecuzione della routine d’interruzione si presenta un Interrupt nell’Interrupt si è di fronte a Interruzioni Multiple. INTERRUZIONI MULTIPLE Esistono due modi di gestire le interruzioni multiple: Disabilitare le ulteriori interruzioni mentre ne viene elaborata una metodo semplice, ma poco efficiente Definire delle priorità di esecuzione delle interruzioni multiple metodo elaborato, ma flessibile Nella slide sono presentati i due modi di gestire le Interruzioni Multiple. Il primo disabilita le interruzioni mentre sono elaborate. Si tratta di un metodo semplice ma poco efficiente. Il secondo definisce delle priorità in modo che un’interruzione di più alta priorità interrompa quella di più bassa priorità. Questo metodo è elaborato ma flessibile. GESTIONE DELLE INTERRUZIONI MULTIPLE Nella figura sono rappresentati alcuni meccanismi di elaborazioni sequenziali con interruzioni semplici a sinistra, mentre, sulla destra viene rappresentato il meccanismo delle Interruzioni Multiple. MULTIPROGRAMMAZIONE Anche utilizzando le interruzioni il processore non è utilizzato al meglio sono possibili cicli di attesa del processore anche lunghi Una soluzione a questo problema consiste nel permettere a più programmi utente di essere in esecuzione contemporaneamente si ottimizza l’uso del processore meccanismi, illustrati fino ad ora, sono quelli che già all’inizio degli anni ’70 erano noti e hanno formato una nuova generazione di calcolatori in quelli anni. L’uso del D.M.A. e delle interruzioni hanno agevolato grandemente l’utilizzazione delle risorse del computer tra i quali si annovera anche il processore. La slide pone però un problema diverso, cioè nonostante tutti questi meccanismi di utilizzazione al massimo delle risorse di un computer, e più in particolare di un processore, le cose non andavano ancora bene. Si è allora pensato alla multiprogrammmazione come meccanismo per utilizzare la risorsa processore. In poche parole, attraverso la multiprogrammazione, utilizzando i meccanismi d’interruzione, si può far in modo che più programmi avanzino contemporaneamente. Questo non è possibile se non in maniera apparente, cioè il parallelismo non può che essere apparente nella macchina. Supponendo che un ciclo d’istruzioni duri un micro secondo significa che in un secondo si possono fare un milione di istruzioni. Si nota, però, che se si divide il programma in esecuzione in una serie di cento istruzioni, un milione diviso cento significa diecimila programmi che potrebbero essere eseguiti in quell’intervallo di tempo di un secondo, naturalmente i riferimenti tecnologici precisi non sono quelli che si sono usati adesso ma si è enfatizzata la questione per intendere la necessità della multiprogrammazione, cioè questi diecimila programmi avanzano, step by step, in un secondo tutti diecimila contemporaneamente dando l’illusione all’operatore di essere eseguiti contemporaneamente. 5 ESECUZIONE DI PIÙ PROGRAMMI La sequenza di esecuzione dipende da: priorità relativa del programma presenza di interruzioni prioritarie in attesa per operazioni di I/O Il gestore interruzioni gestisce in modo organico la gerarchia delle priorità La slide spiega come il meccanismo della multiprogrammazione sfrutta pesantemente i meccanismi di interruzione e le assegnazioni di priorità. 6