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