Vous êtes sur la page 1sur 18

Dispense di Calcolatori Elettronici 1

Capitolo 9 - GESTIONE DELL’I/O

9.1 GENERALITA’
In generale con la sigla I/O si fa riferimento a unità fisiche che comprendono:
• dispositivi di ingresso o uscita veri e propri, denominati per brevità dispositivi di I/O
(per esempio stampanti, nastri, dischi);
• unità di controllo (U.C.) dei predetti dispositivi;
• eventuali canali (detti anche “processori di I/O”: si tratta di apparecchiature,
tipicamente presenti nei grossi calcolatori, che controllano il flusso di dati tra la
memoria primaria e le unita’ di controllo dei dispositivi e che sono programmabili in
modo autonomo).

Le principali funzioni da svolgere nella gestione dell’I/O sono:


1. stabilire quale processo deve ottenere un determinato dispositivo, quando e per quanto
tempo
2. tenere traccia dello stato dei dispositivi
3. assegnare fisicamente un dispositivo ed il suo controllo ad un processo (allocazione )
4. far cessare l’allocazione di un dispositivo ad un processo (deallocazione )

Corrispondentemente il sistema operativo comprende:


a) un modulo che svolge la funzione 1, detto “programmatore dell’I/O” (I/O scheduler )
b) un modulo che svolge la funzione 2, detto “controllore del traffico di I/O”
(I/O traffic controller)
b) un modulo che svolge le funzioni 3 e 4, effettua l’operazione di I/O richiesta, gestisce le
interruzioni ed ottimizza le prestazioni; è detto “gestore del dispositivo di I/O” (I/O
device handler o piu’ comunemente “(device) driver”). Ogni gestore è contenuto in un
processo associato al dispositivo ed ogni dispositivo, o tipo di dispositivo, ha un suo
gestore. Si parla in questo caso di allocazione dinamica per distinguerla dalla
allocazione statica che e’ invece realizzata in alcuni sistemi ma viene gestita dallo
schedulatore dei job e non dai moduli di gestione dei dispositivi.

9.2 TECNICHE DI GESTIONE DEI DISPOSITIVI DI I/O


Un dispositivo di I/O può essere gestito nei seguenti modi:
1. dedicato
2. condiviso
3. virtuale

1 ) Dispositivo dedicato
Si tratta di un dispositivo che viene assegnato ad uno specifico job (solitamente per
l’intera durata del job stesso).
Questa tecnica, obbligatoria per alcuni dispositivi che richiedono azioni manuali (per es.
lettore di nastro magnetico) o lunghe operazioni di I/O (per es. stampante), può
ovviamente originare inefficienze.

2 ) Dispositivo condiviso
Si tratta di un dispositivo che viene utilizzato a turno da più job nello stesso arco di
tempo.
Ad ogni job che usa un dispositivo viene assegnata un’area distinta del dispositivo.
Questa tecnica si usa con i dispositivi che è facile riposizionare per servire più job
Capitolo 9 9.1
Dispense di Calcolatori Elettronici 1
(tipicamente per i dischi); è complessa se si cerca di ottimizzare lo sfruttamento del
dispositivo.

3 ) Dispositivo virtuale
Si tratta di un dispositivo che viene convertito da dedicato in condiviso per mezzo di una
opportuna tecnica (si veda il paragrafo 9.7).

9.3 CLASSIFICAZIONI DELLE UNITÀ DI I/O

Le unità di I/O si possono classificare:

• per funzione
• Dispositivi di I/O vero e proprio
la loro funzione è quella di collegare il calcolatore al mondo esterno
• Unità di memorizzazione
la loro funzione è quella di registrare l’informazione e di renderla disponibile
successivamente

A loro volta le unità di memorizzazione si possono classificare in base al parametro Tij


definito come il tempo richiesto per accedere all’elemento j essendo i l’elemento al quale si
è fatto l’accesso precedente:

• per tipo di accesso


• Dispositivi ad accesso seriale
si tratta di dispositivi per i quali Tij presenta grandi variazioni (per esempio nastri,
con campo di variazione da 1 a 1000)
• Dispositivi ad accesso casuale
si tratta di dispositivi per i quali Tij è costante (per esempio Mp)
• Dispositivi ad accesso quasi casuale
si tratta di dispositivi per i quali Tij presenta variazioni contenute (per esempio
dischi; nei dischi a testine fisse il campo di variazione va tipicamente da 1 a 10, nei
dischi a testine mobili va da 1 a 80).
Questi dispositivi sono anche detti dispositivi di memorizzazione ad accesso diretto
o DASD (Direct Access Storage Device).

9.4 ORGANIZZAZIONE DELLE UNITÀ DI I/O


Lo studio di opportune organizzazioni delle unità di I/O deriva da due fondamentali
considerazioni:
• l’elevato costo dei canali;
• la ridotta contemporaneità di funzionamento dei dispositivi.
Di conseguenza si hanno tipicamente:
• da 1 ad 8 unità di controllo per canale;
• da 1 ad 8 dispositivi per unità di controllo.
La fig. 9-1 riporta un esempio di organizzazione per un sistema di elaborazione piuttosto
semplice.

Capitolo 9 9.2
Dispense di Calcolatori Elettronici 1

Unità
controllo
dischi

Canale
1
Unità
controllo
nastri

Mp

Unità
controllo
stampante

Canale
2
Unità
controllo
dischi

Figura 9-1. Esempio di organizzazione dell’ I/O

Una operazione di I/O può essere avviata solo se è disponibile un percorso fisico tra Mp e
dispositivo. Data la struttura dei collegamenti sopra descritta si possono avere ovviamente
interferenze nel soddisfacimento delle varie richieste.

Per ridurre le interferenze si fa ricorso a diverse tecniche, tra le quali le più comuni sono:
1. Funzionamento indipendente
2. Memorie tampone
3. Percorsi multipli
4. Multiplaggio di blocchi

1. Funzionamento indipendente delle unità


Principio informatore: impegnare canale ed U.C. per il tempo strettamente indispensabile.
Per esempio durante un’operazione di seek che può richiedere 20 ms il canale è
impegnato solo per trasmettere da Mp al disco coinvolto il numero di traccia (il che può
richiedere solo 10 µs).
Realizzazione pratica:
• All’inizio dell’operazione di I/O l’intero percorso tra Mp e dispositivo deve essere
disponibile. La disponibilità per ogni unità è desumibile dai bit di stato (per canale,
U.C., dispositivi) raggruppati per canale e memorizzati in posizioni prestabilite di Mp.

Capitolo 9 9.3
Dispense di Calcolatori Elettronici 1
• Solitamente al completamento dell’I/O da parte di canale, U.C., dispositivo sono
generati distinti segnali di interruzione che vanno ad aggiornare i corrispondenti bit
di stato.

2. Uso di memorie tampone (buffer)


Principio informatore: ridurre l’impegno del canale accumulando le informazioni nei
dispositivi e nelle U.C.
Per esempio l’immissione di un comando da tastiera richiede in generale alcuni secondi;
se la tastiera ha un buffer, il trasferimento del comando in Mp puo’ essere fatto in un
centinaio di µs.

3. Percorsi multipli
Principio informatore: fare in modo che ogni dispositivo possa essere raggiunto con percorsi
diversi (in questo modo si aumenta anche l’affidabilità del sistema).
La fig. 9-2 riporta un esempio di applicazione di questa tecnica.

Canale 1 U.C. A Dispositivo C

Mp

Canale 2 U.C. B Dispositivo D

Figura 9-2. Configurazione di I/O con percorsi multipli

4. Multiplaggio di blocchi
Principio informatore: realizzazione, a mezzo dell’hardware, della multiprogrammazione dei
programmi di canale.
Per esempio un canale, non appena incontra una operazione di I/O che, come nel caso
di dispositivi con memoria tampone o con funzionamento indipendente, non richiede il
canale per un certo tempo, passa automaticamente ad occuparsi di un altro programma
di canale pronto per l’esecuzione.

9.5 UNITA’ DI CONTROLLO DEI DISPOSITIVI


Un dispositivo di I/O è costituito tipicamente da:
• una componente elettromeccanica (il dispositivo vero e proprio compreso il meccanismo
che lo fa muovere o “drive”);
• una componente elettronica (l’unità di controllo del dispositivo).

Nei minicalcolatori e nei microcalcolatori solitamente non ci sono canali, le comunicazioni


tra Mp ed unità di controllo usano un unico bus e l’interfaccia tra U.C. e dispositivo è spesso
molto semplice. La fig. 9-3 riporta un esempio di organizzazione di questo tipo.

Capitolo 9 9.4
Dispense di Calcolatori Elettronici 1
Dischi

Stampante

Mp U.C. U.C.
dischi stampante

Figura 9-3. Esempio di organizzazione dell’I/O tipica dei minicalcolatori e dei microcalcolatori

Si considerino i seguenti esempi di funzionamento per una organizzazione senza canali:


Esempio 1:
Se da un disco predisposto per la registrazione (“formatted”) con 8 settori da 512 byte per
traccia si vuole inviare un settore in Mp, il disco invia alla propria U.C. una sequenza di bit
costituita dall’header seguito dai 4096 bit di un settore e da qualche forma di codice di
rilevazione di errore (si veda il paragrafo 3.7).
La U.C. riceve i bit, di solito li memorizza in un buffer, li trasforma in un blocco di byte, ne
verifica la correttezza e, in assenza di errori, segnala al S.O. di essere pronta per mezzo di
una interruzione.
Esempio 2:
Se si vuole presentare della informazione sullo schermo, la U.C. del video legge in Mp i byte
che definiscono i caratteri da presentare sullo schermo e genera i segnali che modulano il
pennello elettronico che scrive sullo schermo. Genera inoltre i segnali per far tornare
indietro il pennello alla fine di una riga e per spostare di una riga la schermata quando lo
schermo è pieno.
Il S.O. si limita ad avviare l’attività della U.C. fornendole alcuni parametri (per esempio: n°
di caratteri per riga, n° di righe per schermata).

In assenza di canali le comunicazioni tra U.C. e Pc avvengono per mezzo di registri che
• fanno parte dello spazio di indirizzamento della Mp
oppure
• fanno parte di uno speciale spazio di indirizzamento riservato all’I/O.
Il S.O. esegue le operazioni di I/O inserendo comandi nei registri usati dalla U.C.. Al
completamento dell’I/O la U.C. genera una interruzione che fa sì che il S.O. riassuma il
controllo del Pc per verificare l’esito dell’operazione.

Per migliorare il funzionamento le U.C. fanno ricorso a diverse tecniche: le più comuni sono
l’Accesso Diretto in Memoria (DMA) e l’ Interleaving (per i dischi)
La tecnica DMA, gia’ descritta nel capitolo 5, serve a ridurre l’impegno del Pc. All’inizio
dell’operazione il Pc fornisce all’U.C. non solo l’indirizzo dei dati cercati ma anche l’indirizzo
in Mp a partire da quale i dati vanno trasferiti ed il numero di byte da trasferire. Dopo che
queste due informazioni sono state inserite in appositi registri dalla U.C., che li aggiorna
ogni volta che viene trasferito un byte, il Pc viene liberato. Al termine dell’operazione la U.C.
genera una interruzione ed il S.O. trova i dati in Mp.
L’interleaving si basa sul fatto che, durante i trasferimenti tra U.C. e Mp, il disco continua a
ruotare ed il successivo settore passa sotto la testina. Dato che in generale occorre un tempo
non nullo per trasferire il settore letto in Mp, se i settori logicamente consecutivi sono
fisicamente adiacenti, la U.C. in un giro può leggere un solo settore. In sede di
predisposizione del disco si può però tenere conto di questo fatto numerando i settori in
modo opportuno (interleaving semplice, si veda la fig. 9-4 per il caso di una traccia divisa in 8

Capitolo 9 9.5
Dispense di Calcolatori Elettronici 1
settori). In questo caso si ha a disposizione per completare il trasferimento in Mp il tempo
impiegato dal disco per ruotare di un settore.
Se il trasferimento richiede un tempo maggiore si possono saltare 2 settori (interleaving
doppio, si veda sempre la fig. 9-4) od anche più.
Adottando questa tecnica, la Mp può acquisire settori numerati consecutivamente alla
massima velocità di cui l’hardware è capace.

8 1 6 1
4 5 3 4

7 2 8 7
3 6 5 2

Interleaving semplice Interleaving doppio

Figura 9-4. Interleaving per il caso di una traccia divisa in 8 settori

9.6 GESTIONE DELLE UNITÀ DI I/O


Come già indicato la gestione dei dispositivi viene svolta da:
1. programmatore dell’I/O
2. controllore del traffico di I/O
3. gestori dei dispositivi di I/O

9.6.1 PROGRAMMATORE DELL’I/O

Funzione: il programmatore dell’I/O realizza la disciplina di assegnazione dei dispositivi ai


processi.
Realizzazione: possono essere usate varie discipline; per esempio il programmatore dell’I/O
può assegnare elevata priorità alle richieste di I/O provenienti da processi ai quali lo
schedulatore dei processi ha assegnato una elevata priorità.

Una volta che il programmatore dell’I/O ha determinato l’ordinamento delle richieste di I/O,
il controllore del traffico determina quali possono essere soddisfatte.
Le richieste di I/O, una volta accolte, non sono normalmente interrotte in quanto la maggior
parte di esse si completa in un tempo breve (50 - 100 ms).

9.6.2 CONTROLLORE DEL TRAFFICO DI I/O

Funzione: il controllore del traffico tiene traccia dello stato di canali, U.C., dispositivi e
verifica la attuabilità delle decisioni precisando
• se esiste un percorso disponibile per servire la richiesta di I/O
• se esiste più di un percorso
• se un percorso diviene disponibile
Realizzazione: il controllore del traffico gestisce un archivio dati comprendente
• per ogni dispositivo un blocco di controllo (“Unit Control Block”) contenente
1. identificazione del dispositivo
2. stato
Capitolo 9 9.6
Dispense di Calcolatori Elettronici 1
3. lista delle U.C. collegate
4. lista dei processi in attesa del dispositivo
• per ogni unità di controllo un blocco di controllo (“Control Unit Control Block”)
contenente
1. identificazione dell’U.C.
2. stato
3. lista dei dispositivi collegati
4. lista dei canali collegati
5. lista dei processi in attesa della U.C.
• per ogni canale un blocco di controllo (“Channel Control Block”) contenente
1. identificazione de4l canale
2. stato
3. lista delle U.C. collegate
4. lista dei processi in attesa del canale

Per stabilire l’esistenza di un percorso si deve risalire dal blocco di controllo del dispositivo a
quello del canale.
Per stabilire l’esistenza di più percorsi si procede allo stesso modo; in questo caso la scelta
deve cadere su di un percorso che presenti il minor numero di potenziali conflitti con altri
percorsi, specie per configurazioni di I/O asimmetriche, come quella riportata per esempio in
fig. 9-5.
Per sapere che un percorso è divenuto disponibile i blocchi di controllo vanno aggiornati ogni
volta che si presenta una interruzione per completamento di I/O: vengono resi disponibili
dispositivo, U.C., canale impegnati nell’I/O, e si deve fare la ricerca tra i processi in attesa
del dispositivo liberatosi.

Canale A U.C. D Dispositivo G

Mp
Canale B U.C. E Dispositivo H

Canale C U.C. F Dispositivo I

Figura 9-5. Esempio di configurazione di I/O asimmetrica

9.6.3 GESTORI DEI DISPOSITIVI DI I/O

Funzione: solitamente esiste un gestore per ciascun tipo di dispositivo. Esso avvia e gestisce
l’I/O fisico, gestisce interruzioni ed errori, ottimizza le prestazioni a mezzo di specifici
algoritmi di gestione.
Realizzazione: l’algoritmo di gestione cambia col tipo di dispositivo ed ha l’obiettivo di ridurre
il tempo totale richiesto dallo smaltimento delle richieste di I/O tenendo conto del fatto
che in presenza di richieste di I/O in attesa il relativo tempo di accesso può variare
notevolmente.

Tre esempi di algoritmi usati per dispositivi rotanti (dischi) sono:


1. ordinamento circolare
Capitolo 9 9.7
Dispense di Calcolatori Elettronici 1
2. uso di indirizzi alternativi
3. ordinamento delle operazioni di “seek”

9.6.3.1 ORDINAMENTO CIRCOLARE


In base a questo algoritmo le richieste vengono smaltite tenendo conto dell’ordine con il
quale i settori si presentano sotto le testine di lettura.
Si consideri, per esempio, la traccia di un disco che contiene 4 settori. Il disco compie una
rotazione in 20 ms, ossia impiega 5 ms per settore. Esiste un percorso disponibile tra disco e
Mp, esiste una testina sulla traccia e sono in attesa 4 richieste relative alla traccia in
questione e pervenute nel seguente ordine:
1. leggere il settore 4
2. leggere il settore 3
3. leggere il settore 2
4. leggere il settore 1
Si supponga inoltre che l’utilizzazione delle informazioni lette in un settore non richieda di
ritardare la lettura di un nuovo settore.

4 1

3 2

Figura 9-6. Organizzazione della traccia dell’esempio.

Si può procedere nei seguenti modi:

a) se le richieste sono evase nell’ordine 4, 3, 2, 1 e se con T?4 si denota il valor medio del
tempo di latenza necessario per arrivare a leggere il settore 4, il tempo totale richiesto è

T?4 + T43 + T32 + T21 + 4 letture = 10 + 10 + 10 + 10 + 20 = 60 ms

b) se le richieste sono evase nell’ordine 1, 2, 3, 4 il tempo totale richiesto (essendo T12 = T23 =
T34 = 0) è

T?1 + T12 + T23 + T34 + 4 letture = 10 + 20 = 30 ms

c) se si sa che la testina è posizionata all’inizio del settore 4 grazie ad HW specifico


(“rotational position sensing”), la sequenza 4, 1, 2, 3 dà luogo ad un tempo totale pari a

T41 + T12 + T23 + 4 letture = 0 + 20 = 20 ms

Se nelle operazioni sono coinvolte più tracce e se si può leggere (o scrivere) su di una traccia
alla volta, le richieste che si riferiscono ad uno stesso settore su tracce diverse sono
mutuamente esclusive: pertanto occorre anche stabilire in quale rotazione soddisfare quale
richiesta.
I conflitti possono essere ridotti se è possibile leggere o scrivere contemporaneamente su più
tracce (occorrono naturalmente più U.C., più canali e più hardware nel dispositivo).

9.6.3.2 USO DI INDIRIZZI ALTERNATIVI


Questo algoritmo si usa per ridurre il tempo di accesso ai settori e consiste nel registrare
una stessa informazione in più settori (o indirizzi alternativi).
Capitolo 9 9.8
Dispense di Calcolatori Elettronici 1
Se, per esempio, su di un disco con tracce divise in 8 settori le informazioni sono registrate
in settori contrapposti (0 e 4, 1 e 5, 2 e 6, 3 e 7) il valor medio del tempo di latenza si
dimezza.
Ovviamente con questo algoritmo si riduce la capacità di memorizzazione: se si fanno n
copie dei dati, la capacità è ridotta ad 1/n, e si usa dire che il dispositivo è stato “ripiegato”
(folded) n volte.

9.6.3.3 ORDINAMENTO DELLE OPERAZIONI DI “SEEK”


Si applica naturalmente nei dischi a testine mobili.
L’individuazione dell’informazione per una unita’ a disco fisicamente costituita da piu’ dischi
solidali e sovrapposti (il cosiddetto “pacco di dischi”) è solitamente fatta attraverso
n° cilindro, n° traccia, n° settore
Il cilindro era stato definito (Cap. 3) come l’insieme delle tracce omologhe sui vari dischi ed il
numero di traccia consente in questo caso di individuare la specifica superficie di disco
interessata all’operazione.
L’algoritmo ideale dovrebbe mirare ad ottenere il “minimo tempo di servizio” tenendo conto sia
del tempo di seek (che varia in modo monotono crescente ma non lineare rispetto al numero
di cilindri di spostamento) sia del tempo di rotazione, sia infine dell’eventuale arrivo di nuove
richieste.
Se si suppone per esempio che la testina sia inizialmente posizionata all’inizio del settore 15
nel cilindro 1 per un disco con 20 settori, date le richieste
1 - 2 - 1, 16 - 6 - 9, 40 - 3 - 3, 1 - 5 - 7
se il tempo di seek è trascurabile il minimo tempo di servizio si ottiene con l’ordinamento
circolare delle richieste a prescindere dalla traccia ossia
1 - 2 - 1, 40 - 3 - 3, 1 - 5 - 7, 16 - 6 - 9
mentre se il tempo di seek è dominante, l’ordinamento migliore è quello che smaltisce tutte
le richieste di un cilindro prima di passare agli altri cilindri:
1 - 2 - 1, 1 - 5 - 7, 16 - 6 - 9, 40 - 3 - 3
In pratica l’algoritmo ideale è approssimato con algoritmi che prevedono successioni di
movimenti unidirezionali.

Esempi di algoritmi pratici


La descrizione che segue è relativa al movimento della testina in una unità a disco costituita
da un solo disco e nella quale l’informazione è memorizzata su una sola faccia del disco: in
questo caso non si parla di cilindri ed il numero di traccia è sufficiente per la sua
individuazione univoca. Gli algoritmi sono peraltro applicabili a qualunque organizzazione di
dischi.
Per l’unità sopra descritta si possono avere i seguenti algoritmi:
• C–Scan (C sta per “circular”): la testina si muove dalla traccia col numero più basso
alla traccia col numero più alto e si riposiziona (velocemente) sulla traccia col numero
più basso;
• Scan: la testina si muove dalla traccia col numero più basso alla traccia col numero
più alto e viceversa evadendo richieste nelle due direzioni di movimento;
• C–look: la testina si muove dalla traccia col numero più basso tra quelle per le quali vi
sono richieste alla traccia col numero più alto, sempre tra le tracce per cui vi sono
richieste, e si riposiziona (velocemente) sulla traccia col numero più basso, sempre tra
quelle per le quali vi sono richieste da evadere;
• Look o Ascensore: la testina si muove dalla traccia col numero più basso tra quelle
per le quali vi sono richieste alla traccia col numero più alto, sempre tra le tracce per
cui vi sono richieste, e viceversa evadendo richieste nelle due direzioni;
• FCFS (First Come First Served): le richieste vengono evase seguendo l’ordine di arrivo;
• SSTF (Shortest Seek Time First): la testina si sposta ogni volta verso quella delle tracce
per le quali vi sono richieste da evadere che dista meno, come numero di tracce, dalla
traccia sulla quale si trova.

Capitolo 9 9.9
Dispense di Calcolatori Elettronici 1
Per i predetti algoritmi l’U.C. stabilisce il da farsi sulla base delle richieste da evadere al
momento in cui deve prendere la decisione e non tiene quindi conto di eventuali richieste
che arrivino durante lo spostamento della testina.

9.6.3.4 OSSERVAZIONI CONCLUSIVE


Gli algoritmi descritti o richiedono tempo di Pc od impongono un maggior costo
dell’hardware se incorporati in esso. In genere i più raffinati sono usati con Pc veloci ed in
presenza di molte richieste di I/O per diminuire il tempo di attesa dei job.
I gestori dei dispositivi si occupano anche:
a) della protezione delle aree di memoria usate da un job in Mp ed in Ms (in quanto le
istruzioni di I/O sono solitamente “privilegiate”, ossia avviabili solo dal S.O.);
b) delle attività di caricamento di pagine e di conversione di indirizzi richieste
dall’eventuale uso della memoria virtuale.

9.7 DISPOSITIVI VIRTUALI


Si e’ già rilevato (paragrafo 9.2) che alcuni dispositivi di I/O (per es. stampante, tracciatore
di grafici) pongono i seguenti problemi:
• devono essere dedicati ad un job alla volta
• sono bene utilizzati in presenza di un flusso continuo di richieste che arrivino ad un
ritmo compatibile con le loro caratteristiche fisiche.
La multiprogrammazione e le memorie tampone attenuano i problemi, ma la vera soluzione
comporterebbe l’uso di dischi per tutte le operazioni di I/O, il che ovviamente non è
possibile.

In questi casi si può superare il problema trasformando i dispositivi dedicati in dispositivi


condivisi. Possibili soluzioni sono le seguenti:
a. funzionamento di periferiche fuori linea
b. uso di calcolatori con accoppiamento diretto
c. uso di calcolatore di supporto
d. uso della tecnica di “SPOOL”

a. Funzionamento di periferiche fuori linea


La soluzione, molto usata negli anni sessanta ma oggi abbandonata, si attuava secondo lo
schema di fig. 9-7.
Essa presentava alcuni inconvenienti:
• necessità di interventi umani
• necessità di acquisire apparecchiature di uso altamente ristretto
• possibile allungamento del tempo di risposta
• difficoltà di programmazione dei job da parte dello schedulatore a lungo termine

b. Uso di calcolatori con accoppiamento diretto


Si attua secondo lo schema di fig. 9-8.
Vengono eliminati gli inconvenienti della soluzione a. ma ne nascono di nuovi:
• conflitti nell’accesso ai dischi
• maggiore complessità del S.O. per la necessità di coordinare il funzionamento dei
due calcolatori

c. Uso di calcolatore di supporto (“attached support processor”)


Si attua secondo lo schema di fig. 9-9. Il processore di supporto produce l’effetto di far
“vedere” al calcolatore principale periferiche ad altissima velocità.
Esiste il rischio di sottoutilizzare i processori. Lo schema è oggi normalmente usato quando
il calcolatore principale è costituito da un “supercalcolatore”.

d. Uso della tecnica di SPOOL (“Simultaneous Peripheral Operation On Line“)


Capitolo 9 9.10
Dispense di Calcolatori Elettronici 1
Affida a job residenti permanentemente in Mp (e facenti parte del S.O.) le funzioni svolte dal
calcolatore di supporto (si veda la fig. 9-10).
Questa tecnica è usata tipicamente per lettori di dati a bassa velocita’ (per es. un dischetto)
e stampanti. Nel caso di un lettore di dati un apposito programma (di spooling) legge tutte i
dati che servono in ingresso ad un programma e li copia su disco; successivamente
intercetta le richieste di lettura di dati originate dai processi e le converte in letture da disco.
Il lettore reale è cosi’ trasformato in tanti lettori virtuali quanti sono i processi che leggono
dati.
In pratica lo spooling usa il disco come una grande memoria tampone, acquisendo l’input il
più in anticipo possibile e memorizzando l’output sino a che i dispositivi di output non sono
in grado di accettarlo. In questo modo lo spooling sovrappone l’attività di I/O di un job con
l’attività di calcolo di altri job.

La tecnica di SPOOL produce interazioni con le gestioni di memoria, processori, dispositivi


ed informazione. Peraltro il ruolo dei programmi di SPOOL è modesto in un S.O. complesso
mentre può essere rilevante in un S.O. semplice.

Per poter funzionare correttamente occorre che:


• i programmi di SPOOL facciano parte del S.O.
• siano disponibili, nell’ipotesi di sistema con lettore di dati in input e stampante come
output, due speciali funzioni ( SVC ) del S.O. denotate
CALL READNEXT ( BUFFER ), per leggere il dato successivo
CALL PRINTNEXT ( BUFFER ), per stampare la riga successiva.
Un sistema di SPOOL comprende in tal caso le quattro componenti di fig. 9-11 e sfrutta sia
le funzioni predette sia le interruzioni provenienti dai dispositivi periferici.

Lo SPOOL impegna spazio in Mp. Per esempio, in un sistema con 4 unita’ di ingresso, 3
stampanti e 8 job in esecuzione, se si usano buffer da 10 KB per ogni “area” di SPOOL attiva
(4 per gli ingressi, 1 per l’input ed 1 per l’output di ciascun job, 3 per le uscite) la memoria
richiesta è pari a

(4 + 8 x 2 + 3) x 10 = 230 KB

Le prestazioni di un sistema di SPOOL possono essere migliorate anche combinando record


logici in record fisici di maggiori dimensioni, tenendo conto del fatto che letture e scritture
sul disco di SPOOL sono sempre sequenziali.
Per esempio, un disco di medie prestazioni può leggere un record di 100 B in 60 ms, uno di
1 KB in circa 61 ms, uno di 10 KB in circa 70 ms. Se, pur avendo a che fare con record
logici di 100 B, si leggono e scrivono sempre record fisici di 1 KB o di 10 KB, da inserirsi in
buffer delle corrispondenti dimensioni, dopo la lettura o scrittura occorre scomporre il
contenuto del buffer in record logici. Supponendo che questa operazione richieda circa 1 ms,
il tempo di accesso effettivo diventa allora rispettivamente, per ogni record da 100 B:

con record fisico da 1 KB: (61+1)/10 =~ 6 ms

con record fisico di 10 KB: (70+1)/100 =~0.7 ms

Capitolo 9 9.11
Dispense di Calcolatori Elettronici 1
Passo 1

Job 3 Job 1

Job 1
Programma di
Job 3
ingresso

Job 2
Calcolatore 1 Job 4
Job 4 Job 2 ( calcolatore
periferico )
Pacchi di schede in ingresso

Disco di ingresso

Passo 2

Job 1
Job 1
Job 1 Job 2
Job 3
Job 2
Job 2
Job 3
Job 3
Job 4
Calcolatore 2

( calcolatore
Disco di ingresso principale ) Disco di uscita

Passo 3

Job 1

Job 2
Job 1
Programma di
Job 2
uscita

Calcolatore 3
Job 3
( calcolatore Job 3
periferico )

Disco di uscita
Tabulati in uscita

Figura 9-7. Schema di funzionamento di periferiche fuori linea

Capitolo 9 9.12
Dispense di Calcolatori Elettronici 1

Job 9 Job 7 Job 1

Job 2

Programma di
Job 3
ingresso / uscita
Job 10 Job 8
Calcolatore
Unita’ di ingresso periferico Tabulati in uscita

Job 7 Job 8 Job 4 Job 2


Job 4

Job 6 Job 5
Job 3
Job 5
Job 6
Job 5
Calcolatore
principale
Job 6
Job 4

Disco di ingresso Disco di uscita

Figura 9-8. Uso di calcolatori con accoppiamento diretto

Capitolo 9 9.13
Dispense di Calcolatori Elettronici 1
Disco di ingresso Disco di uscita

Job 6 Job 4 Job 5 Job 1

Job 7 Job 5 Job 3 Job 3 Job 4 Job 2

Job 8 Job 7

Job 1
Programma di
ingresso / uscita

Calcolatore
di supporto
Job 2
Job 9 Job 6

Unita’ di ingresso
Job 3
Tabulati in uscita
Job 4

Job 5
( a ) Configurazione reale
Calcolatore
principale

Job 3

Job 3

Job 4

Job 4 Job 3

Job 4

Job 5 Job 5
Job 5

( 3 lettori ad
alta velocità ) ( 3 stampanti ad
alta velocità )
( b ) Configurazione apparente ( virtuale )

Figura 9-9. Uso di processore di supporto

Capitolo 9 9.14
Dispense di Calcolatori Elettronici 1
Disco di ingresso Disco di uscita

Job 5 Job 3 Job 4 Job 1

Job 4 Job 2 Job 3 Job 2

Job 6 Job 5

Job per Job per Job per Job per Job 1


memorizzazione prelievo memorizzazione prelievo
dell’ingresso dell’ingresso dell’uscita dell’ uscita
( lettura ) ( stampa )
Unita’ di ingresso
Tabulato in
uscita

Job 2

Job 3

Job 4

Calcolatore

Figura 9-10. Uso della tecnica di SPOOL

CALL READNEXT
Basi di dati ( BUFFER )
condivise
Interruzione per
completamento I/O
(unita’ di ingresso)
Memorizzazione Prelievo
Lato
dell’input dell’input
input
(lettura)

Prelievo
Memorizzazione Lato
dell’output
dell’output output
(stampa)
Interruzione per
completamento I/O
(stampante)
CALL PRINTNEXT
Lato Lato ( BUFFER )
interruzione chiamata

Figura 9-11. Componenti di un sistema di SPOOL


Capitolo 9 9.15
Dispense di Calcolatori Elettronici 1

9.8 PROGRAMMAZIONE DEI DISPOSITIVI DI I/O


9.8.1. ULTERIORE CLASSIFICAZIONE DEI DISPOSITIVI
Dal punto di vista della programmazione si è soliti attuare la seguente suddivisione dei
dispositivi di I/O:
• Dispositivi che gestiscono blocchi
Gestiscono informazione sotto forma di blocchi di dimensione prefissata (usualmente 128
-1024 B), ciascuno con un proprio indirizzo.
Un programma in un qualunque momento può leggere o scrivere un qualsiasi blocco.
Esempio: disco.
• Dispositivi che gestiscono caratteri
Gestiscono informazione sotto forma di stringhe di caratteri, che non hanno struttura e
non sono indirizzabili.
Esempi: tastiera, mouse, stampanti a righe.

La classificazione non è esauriente ma adeguata per chiarire gli aspetti della


programmazione dei dispositivi di I/O.

9.8.2. OBIETTIVI DEL SOFTWARE DI I/O


In generale si struttura il software di I/O secondo un insieme di livelli: gli inferiori con il
compito di celare le peculiarità dell’hardware dai superiori, i superiori con il compito di
presentare una interfaccia semplice ed uniforme agli utenti.

In particolare il software di I/O deve inoltre fornire:


• Indipendenza dai dispositivi
Deve essere possibile scrivere programmi che, senza modifiche, possano essere usati con
archivi disposti su dispositivi diversi.
• Denominazione uniforme
L’identificazione di un file o dispositivo non deve dipendere dal dispositivo.
• Gestione degli errori
Deve aver luogo il più possibile vicino all’hardware, anche per la transitorietà di taluni
errori (per esempio dovuti a polvere depositatasi su di un disco): dovrebbe quindi
coinvolgere innanzi tutto il gestore del dispositivo e solo successivamente l’unità di
controllo.
• Gestione di dispositivi condivisi e dedicati
Si deve tener conto delle diverse esigenze di gestione.
• Trasferimenti sincroni e asincroni
Deve consentire trasferimenti sincroni (o bloccanti ) e asincroni (pilotati da interruzione).
La maggior parte dell’I/O fisico è asincrono (il Pc fa partire l’operazione e poi fa dell’altro
sino all’arrivo di una interruzione) mentre i programmi utente sono più facili da scrivere
se le operazioni di I/O sono bloccanti (in una operazione read il programma si immagina
sospeso sinché i dati non sono disponibili nel buffer). Occorre quindi del software che
attui la relativa trasformazione.

9.8.3 ORGANIZZAZIONE DEL SOFTWARE DI I/O


Sulla base delle precedenti considerazioni il software coinvolto nelle operazioni di I/O può
essere strutturato su 4 livelli, crescenti (da inferiori a superiori) nel verso della freccia:
• gestori delle interruzioni
• gestori dei dispositivi
• software indipendente dai dispositivi
• processi di I/O degli utenti

9.8.3.1 GESTORI DELLE INTERRUZIONI


Capitolo 9 9.16
Dispense di Calcolatori Elettronici 1
Allorché si emette un comando di I/O, il gestore del dispositivo si blocca ed attende una
interruzione.
Allorché l’interruzione si presenta, la procedura di interruzione fa quanto è necessario per
sbloccare il gestore del dispositivo.

9.8.3.2 GESTORI DEI DISPOSITIVI ( DEVICE DRIVER )


Comprendono tutto il software dipendente dai dispositivi: pertanto ogni gestore va bene per
un solo dispositivo o per un insieme di dispositivi identici.
Accettano richieste indifferenziate provenienti dal software dei livelli superiori e le eseguono
tenendo conto delle peculiarità dei dispositivi.
Dopo il completamento dell’operazione, devono verificare l’assenza di errori e, se non ve ne
sono, trasferire eventualmente dati al software indipendente dai dispositivi (per esempio i
dati appena letti); devono inoltre segnalare il proprio stato al processo chiamante e restare
in attesa di nuove richieste, se non ve ne sono, o selezionarne una ed eseguirla, se ve ne
sono.
Esempio: nel caso di un disco il gestore deve stabilire dove si trova il blocco richiesto,
verificare che il disco sia in rotazione, determinare se la testina è posizionata sulla traccia
giusta, e così via. Ne risulta definita una sequenza di operazioni da eseguire: i relativi
comandi sono inseriti nei registri dell’U.C. (uno alla volta o tutti insieme).
A questo punto se le operazioni richieste si completano in un tempo non trascurabile il
gestore deve attendere che l’U.C. le svolga e si blocca sino a che non si presenta una
interruzione; se invece le operazioni richieste si completano in un tempo trascurabile il
gestore non si blocca.

9.8.3.3 SOFTWARE INDIPENDENTE DAI DISPOSITIVI


Il confine tra gestori di dispositivi e software indipendente dai dispositivi è variabile, in
quanto alcune funzioni possono essere attribuite all’uno od all’altro livello (per esempio per
motivi di efficienza).
Tipiche funzioni svolte da questo livello di software sono:
• Realizzazione di una interfaccia standard verso i gestori
• Passaggio dai nomi simbolici dei dispositivi ai loro gestori
• Protezione dei dispositivi
Questa funzione occorre per evitare che un utente acceda a dispositivi che non gli è
consentito usare (nella maggior parte dei microcalcolatori non vi è alcuna protezione;
nella maggior parte dei mainframe un processo utente non può accedere ai dispositivi di
I/O).
• Standardizzazione della dimensione dei blocchi.
Si tenga conto che si possono avere diverse dimensioni nei settori dei dischi, e che più
settori possono essere trattati come un unico blocco; nel caso di dispositivi che gestiscono
caratteri, alcuni forniscono un carattere alla volta (per esempio tastiera), altri ne possono
gestire numerosi (per esempio stampanti a righe).
• Realizzazione della funzione di buffer.
Questa funzione è importante per tutti i dispositivi.
Nei dispositivi che gestiscono blocchi la lettura e la scrittura si fanno sempre un blocco
alla volta, ma i processi utente sono liberi di leggere o scrivere dati in quantità arbitraria.
Se, per esempio, un processo utente scrive solo mezzo blocco, il software di sistema
memorizza temporaneamente l’informazione fino a quando non è possibile riempire un
blocco, e solo allora il blocco è mandato al disco.
Nei dispositivi che gestiscono caratteri i processi utente possono produrre dati più
velocemente di quanto possano essere materialmente fatti uscire dal dispositivo: occorre
quindi un buffer per non perderli. Lo stesso problema si presenta per una tastiera dalla
quale l’input può arrivare prima che sia richiesto dal processo utente.
• Allocazione dello spazio nei dispositivi a blocchi.
• Allocazione e deallocazione di dispositivi dedicati.
• Segnalazione di errori.

Capitolo 9 9.17
Dispense di Calcolatori Elettronici 1
Questa funzione non si occupa della gestione degli errori, per la maggior parte fortemente
dipendenti dai dispositivi, ma fornisce la segnalazione di eventuali errori non rimediabili
al processo chiamante.

9.8.3.4 PROCESSI DI I/O DEGLI UTENTI


Comprendono procedure di biblioteca e di spooling.
La maggior parte del software di I/O rientra nel S.O. ma vi sono biblioteche di procedure che
sono collegate ai programmi degli utenti: per esempio le chiamate al sistema (incluse quelle
di I/O) sono attuate da procedure che vengono collegate al programma ed incorporate nel
codice binario presente in memoria al momento dell’esecuzione.
La maggior parte di queste procedure si limita ad inserire parametri nelle chiamate al
sistema; alcune invece svolgono effettiva attività (per esempio per modificare il formato in
input od output, come può essere richiesto per passare da una stringa che contiene un
numero intero decimale codificato nel codice ASCII alla sua espressione in forma binaria.
Per quanto concerne lo spooling, in alternativa allo schema prima visto si può definire uno
speciale processo, detto diavoletto (“daemon”), ed uno specifico elenco, detto spooling
directory. Per stampare un file, un processo utente lo genera completamente e lo pone nella
spooling directory: il diavoletto è l’unico processo autorizzato ad accedere al file usato dalla
stampante per la stampa ed a deciderne l’effettivo svolgimento.
Questo meccanismo è usato anche nei trasferimenti di file su rete. Gli utenti creano file e li
pongono nello spooling directory della rete; in seguito il diavoletto della rete li preleva e li
invia a destinazione.

La fig. 9-12 riassume la struttura hardware-software descritta in questo paragrafo.

Richieste Risposte Principali funzioni svolte:


di I/O dell’I/O

Processi degli utenti Effettuare: le chiamate di I/O; la formattazione


dell’I/O; lo spooling

Definire: denominazione; protezione; struttura


SW indipendente dai
dei blocchi; buffer; allocazione
dispositivi

Pilotare i registri dei dispositivi;


Gestori dei dispositivi
tener traccia dello stato

“Svegliare” i gestori dei dispositivi quando


Gestori delle interruzioni
l’I/O è finito

Hardware Eseguire le operazioni di I/O

Figura 9-12. Interazione tra i livelli del software di I/O e l’hardware

Capitolo 9 9.18

Vous aimerez peut-être aussi