Capitolo 3 - LA MEMORIA
Capitolo 3 3.1
Dispense di CALCOLATORI ELETTRONICI 1
• Memorie Associative
Memorie le cui celle sono identificate da una parte del loro contenuto e non dal loro
indirizzo, come si verifica invece per le ROM e le RAM.
In fig. 3-1 è rappresentato lo schema di principio per l’utilizzo di una memoria ROM o RAM.
Un decodificatore DEC riceve in ingresso l’indirizzo della cella di memoria alla quale si vuole
accedere ed abilita, con uno specifico segnale EN (che sta Enable), la cella selezionata a
porre il suo contenuto sull’uscita della memoria. Il numero di celle selezionabili con n bit di
indirizzo e’ pari a 2n.Il numero di bit contenuti in una cella dipende da come è costruita la
memoria e non ha nessun legame con il numero di bit necessari per indirizzarla.
Celle di memoria
EN
Indirizzo
della cella
DEC
In fig. 3-2 è rappresentato lo schema di principio per l’utilizzo di una memoria di tipo
associativo. Se il dato posto su SELEZIONE è uguale alla etichetta (TAG) di qualche cella,
allora la stessa viene abilitata (tramite il segnale EN) a porre il suo contenuto sull’uscita.
Nell’eventualità in cui non si riesca a trovare alcuna corrispondenza, in uscita non verrà
posto alcun dato significativo: da qui nasce la necessità di un segnale che indichi la
presenza di un’uscita valida (generato tramite OR dei segnali EN).
Capitolo 3 3.2
Dispense di CALCOLATORI ELETTRONICI 1
SELEZIONE
=
EN
=
EN
=
EN
Etichette Dati
Presenza di dato
valido in uscita
Uscita
Compilazione
Ind. RILOCABILE Codice “oggetto”
Linking
Ind. VIRTUALE Codice “ eseguibile “
SOFTWARE
HARDWARE
Gestione della memoria ( MMU )
Ind. FISICO
Codice “in esecuzione”
In questa sua metamorfosi il programma, e quindi anche il tipo di riferimento che utilizza
per indirizzare la memoria, attraversa tre processi: la compilazione, il linking e la gestione
della memoria.
Nel processo di compilazione vengono convertiti gli indirizzi simbolici (gli identificatori di
variabile tipici dei linguaggi di alto livello) in indirizzi rilocabili, cioè in indirizzi che
identificano le locazioni di memoria sommando uno scostamento (“offset”) ad un indirizzo
Capitolo 3 3.3
Dispense di CALCOLATORI ELETTRONICI 1
base generico (per esempio: X + 23, ove X è l’indirizzo base generico). L’indirizzo rilocabile è
pertanto relativo, e prende come punto di riferimento l’indirizzo di memoria da cui si
inserisce il programma (indirizzo base).
Il processo di linking rende assoluto l’indirizzo, collegando tra loro tutti i segmenti di codice
che formano il programma: praticamente viene generato un indirizzo virtuale, e si suppone
che il programma sia sempre inserito in una data posizione, per comodità dall’indirizzo 0 in
poi. Gli indirizzi virtuali, pur essendo numerici, non individuano ancora le locazioni della
memoria fisica dove il programma agirà (indirizzi fisici).
La trasformazione degli indirizzi virtuali in indirizzi fisici per tutti i programmi che vengono
eseguiti in un calcolatore viene svolta dal processo di gestione della memoria, che utilizza
la MMU (Memory Management Unit o Unita’ di gestione della memoria). Utilizzando la MMU
è possibile porre un programma in un qualsiasi punto della memoria fisica (anche in questo
caso, ma con significato diverso da prima, si parla di “rilocabilità”).
E’ bene rilevare che, mentre la compilazione ed il linking avvengono off-line ed una sola volta
per ogni programma prima che questo venga eseguito, la MMU effettua la sua azione di
traduzione da indirizzo virtuale a indirizzo fisico durante l’esecuzione del programma in
tempo reale ed in modo invisibile alla CPU: la CPU genera cioe’ un indirizzo virtuale, che non
corrisponde necessariamente ad un indirizzo fisico, e la trasformazione viene eseguita dalla
MMU che e’ pilotata dal Sistema Operativo.
Nei sistemi operativi monotask la gestione della memoria è semplice (fig. 3-4).
Memoria
Fisica
CPU
Sistema operativo
Monotask
Nel caso, invece, si utilizzi un sistema operativo multitask l’utilizzo del gestore di memoria
MMU diventa importante: infatti senza MMU sarebbe necessario porre nella memoria fisica
tutti i programmi che si intendono eseguire a partire dal primo indirizzo, ottenendo dei
tempi di esecuzione molto alti. Infatti, dopo aver eseguito un pezzo di programma per un
certo periodo di tempo, prima di poter passare al successivo, questo dovrebbe essere
ricaricato in quanto dovrebbe occupare la stessa zona di memoria del precedente.
Questa operazione costringerebbe a caricare dalla memoria secondaria (disco) tutto il codice
eseguibile del programma successivo per inserirlo in memoria fisica al posto del precedente,
ed il tempo richiesto da questo trasferimento peserebbe sul tempo di esecuzione dei
programmi (potrebbe anche essere necessario salvare in memoria secondaria il programma
la cui esecuzione vien interrotta prima di sostituirlo al fine di preservare dei dati che
potrebbero essere riutilizzati in seguito, aumentando ulteriormente i tempi di risposta).
L’utilizzo della MMU permette di porre più programmi in memoria fisica, al fine di eliminare,
o ridurre, gli accessi in memoria secondaria (fig. 3-5).
Capitolo 3 3.4
Dispense di CALCOLATORI ELETTRONICI 1
Memoria
Fisica
TASK 4
L’utilizzo del tempo da parte di più task, come gia’ evidenziato in fig. 1-4, avviene nel modo
indicato in fig. 3-6.
T a sk 1 T ask 2 T a sk 3
T em po
Figura 3-6. Avvicendamento dei task (visione globale)
T em p o d ed ica to a l T a sk 1
S .O . T a sk 1 S .O . T a sk 2 S .O . T ask 3
T em po
Figura 3-7. Avvicendamento dei task (visione dettagliata)
Capitolo 3 3.5
Dispense di CALCOLATORI ELETTRONICI 1
Deve sfruttare la possibilità di eseguire un task occupando meno memoria fisica di quella
necessaria per memorizzare l’intero programma, caricando in essa solo le parti necessarie
e conservando in memoria secondaria il resto.
4. traduzione degli indirizzi
Deve fare in modo, come gia’ detto, che i programmi funzionino indipendentemente dalla
loro posizione nella memoria fisica.
MEMORIA MEMORIA
CPU
PRIMARIA DI MASSA
Un parametro molto importante per qualunque tipo di memoria e’ costituito dal tempo di
accesso, ossia dal tempo che occorre attendere per poter utilizzare l’informazione.
Il tempo di accesso di una memoria primaria di tipo RAM e’ definito come la durata
dell’intervallo di tempo che intercorre tra l’istante in cui un indirizzo diventa stabile nel registro
MAR (si veda la fig. 1-6) e indifferentemente l’istante in cui il contenuto della cella indirizzata
diventa stabile nel registro MDR (operazione di lettura) oppure l’istante in cui il contenuto della
cella risulta stabilmente modificato (operazione di scrittura). Nelle memorie di tipo RAM, in altri
termini, il tempo di accesso ha lo stesso valore sia in lettura che in scrittura.
Alle memorie di tipo ROM nel funzionamento normale si fanno solo accessi in lettura:
pertanto ad esse si puo’ applicare solo la prima parte della definizione. Una memoria
associativa non e’ normalmente collegata a MAR ed MDR: la precedente definizione si puo’
quindi applicare con riferimento rispettivamente al registro usato per indirizzarla ed al
registro usato per ricevere l’informazione o per immetterla in memoria.
Nelle memorie primarie il tempo di accesso e’ costante, ossia non varia al variare della cella
alla quale si fa accesso, e tutte le celle sono accessibili in modo indipendente l’una dalle
altre.
Capitolo 3 3.6
Dispense di CALCOLATORI ELETTRONICI 1
Per la definizione del tempo di accesso della memoria di massa, tipicamente costituita oggi
da dischi o nastri magnetici, si vedano i paragrafi 3.9 e 3.10.
Nelle realizzazioni piu’ moderne la ricerca di migliori prestazioni ha condotto alla
utilizzazione per la memoria di una struttura piu’ complessa, nella quale in particolare la
CPU non vede più direttamente la memoria primaria, ma una memoria più piccola (Cache di
1º livello) che contiene un sottoinsieme dei dati presenti nella memoria primaria; a sua volta
la Cache di 1º livello e’ collegata ad una Cache di 2º livello, di dimensione maggiore ma
sempre minore di quella della Memoria Primaria. La Memoria Primaria interagisce poi con
una Memoria di Massa di 1º livello e questa con una Memoria di Massa di 2º livello (o
memoria di archiviazione), con dimensioni sempre maggiori man mano che ci si allontana
dalla CPU. Lo schema precedente va quindi modificato nel modo indicato in fig. 3-9. Si tratta
di una vera e propria gerarchia di tipi di memoria. La memoria cache e’ genericamente
denotata con Mc.
5
4
3
2
1
MEMORIA MEMORIA
CACHE MEM.
CPU CACHE DI MASSA DI MASSA
1° LIV DI
2° LIV PRIM.
DI DI
1° LIV 2° LIV.
T accesso = L ⋅ dim
La tabella che segue riporta dimensione e tempo di accesso tipici dei cinque livelli nonche’
degli elementi di memorizzazione usati nel processore centrale (registri).
Capitolo 3 3.7
Dispense di CALCOLATORI ELETTRONICI 1
Le memorie denominate “in linea” sono direttamente accessibili dalla CPU, mentre quella
“fuori linea” richiede un collegamento da effettuare di volta in volta (si pensi ai nastri
magnetici).
La gerarchia di memoria cosi’ strutturata funziona, nel senso che produce benefici come
prestazioni (riduzione del valore medio di Taccesso), se risulta soddisfatto il Principio di
Località nel Tempo e nello Spazio:
• nel Tempo: se si usa un dato ad un certo istante è probabile che lo si riutilizzi poco dopo;
• nello Spazio: se si usa un dato con un certo indirizzo, è probabile che si utilizzino anche i
dati con indirizzi adiacenti (in un programma, solitamente, viene eseguita l’istruzione
successiva a quella corrente).
Per poter valutare il valore medio del tempo di accesso ad un dato, si devono introdurre i
seguenti termini:
• Hit: evento che si verifica quando la CPU riesce a trovare l’informazione che sta cercando
in un certo livello di memoria;
• Miss: evento opposto, che si verifica quando la CPU non riesce a trovare l’informazione
che sta cercando in un certo livello di memoria;
• Hit Ratio: probabilita’ H di avere un hit;
• Miss Ratio: probabilita’ M di avere un miss.
Ovviamente per un determinato livello si ha
H+M=1
Sperimentalmente si e’ trovato che per una memoria di dimensione D la Miss Ratio e’ data
da
M(D) = K / D
Cio’ posto, se si suppone (come e’ lecito fare nelle normali applicazioni) che:
-il dato richiesto dalla CPU sia certamente presente nella gerarchia;
- la ricerca della informazione viene effettuata in cascata sui vari livelli partendo dal livello
piu’ vicino alla CPU e la ricerca ad un certo livello e’ avviata solo dopo la conclusione
sfavorevole della ricerca al livello immediatamente piu’ vicino alla CPU;
Capitolo 3 3.8
Dispense di CALCOLATORI ELETTRONICI 1
si puo’ ricavare per la struttura di fig. 3-9 una formula molto semplice per il valore medio
del tempo di accesso alla gerarchia:
In questa formula: TA1, TA2, TA3 sono i tempi di accesso ai primi tre livelli della gerarchia (per
la definizione del tempo di accesso ad una memoria cache si veda il paragrafo seguente); TA4,
TA5 sono i tempi (medi) di accesso ai restanti due livelli; M1, M2, M3, M4 sono i valori della
Miss Ratio per i primi quattro livelli.
Nell’applicare la precedente formula si deve tenere presente che l’accesso alla gerarchia
termina solo quando l’informazione cercata e’ resa disponibile alla CPU. Pertanto nella
formula i tempi TAi (i=2, 3, 4, 5) devono includere i tempi richiesti dai trasferimenti ai livelli
inferiori ed i tempi richiesti per l’accesso a tali livelli. Per es. TA3 include i tempi di accesso
vero e proprio al livello 3, di trasferimento dell’informazione dal livello 3 al livello 2, di
accesso al livello 2, di trasferimento dell’informazione dal livello 2 al livello 1, di accesso al
livello 1.
Si consideri il seguente esempio di confronto tra due gerarchie.
(A) Si ha un calcolatore dotato della sola memoria primaria (livello 3) con TA3 = 200 ns. In
questo caso banalmente
Taccesso medio = TA3 = 200ns
(B) Al calcolatore del caso (A) si aggiunge una memoria cache di livello 1 avente TA1 = 10 ns,
M1 = 0.2, tempo di tasferimento primaria → cache di 80 ns. Il nuovo valore del tempo medio
di accesso risulta
Taccesso medio = TA1 + M1x TA3’ = 10 + 0.2 x (200 + 80 + 10) = 68 ns
IND
CPU n MEM
PRIMARIA
Capitolo 3 3.9
Dispense di CALCOLATORI ELETTRONICI 1
IND
CPU n CACHE MEM
PRIMARIA
Poiché la cache è del tutto trasparente alla CPU, quest’ultima continua ad inviare indirizzi
ad n bit alla memoria primaria. Avendo pero’ la cache una dimensione molto piu’ piccola
della memoria primaria, tale numero di bit nell’indirizzo risulta eccessivo. La cache non può
pertanto essere una RAM in quanto ha indirizzi di ingresso a n bit e un numero di celle
molto minore di 2n mentre la RAM presenta un legame fisso tra il numero di bit dell’indirizzo
e quello delle celle.
La cache deve essere quindi realizzata con una struttura differente. Si puo’ ricorrere per es.
ad una memoria di tipo associativo (si veda il paragrafo 3.1) in cui le celle sono divise in due
parti: il contenuto della prima parte, detto Tag (=etichetta), viene confrontato con l’ingresso;
se coincide, la seconda parte, detta Dato, viene inviata in uscita.
Il tempo di accesso di una memoria cache associativa e’ dato dalla durata dell’intervallo
di tempo che intercorre tra l’istante in cui diventa stabile il contenuto del registro di selezione,
che contiene l’etichetta, e l’istante in cui diventa stabile il contenuto del registro che riceve il dato
in uscita.
Una memoria associativa presenta, però, inconvenienti quali elevata complessita’ circuitale e
alto costo.
Una soluzione alternativa all’uso della memoria associativa consiste nel realizzare la cache
con due memorie RAM: una per i Tag, l’altra per i Dati; questa struttura è detta Direct
Mapping ed e’ rappresentata nello schema di fig. 3-12.
IND
CACHE
RAM RAM
h
TAG DATI
CONFRONTO
Capitolo 3 3.10
Dispense di CALCOLATORI ELETTRONICI 1
Siano n i bit di IND. Gli h bit meno significativi servono per indirizzare le celle all’ interno
della RAM TAG e della RAM DATI, in ognuna delle quali si hanno 2h celle. Le celle della RAM
TAG contengono k bit (h+k=n), quelle della RAM DATI un numero di bit legato ai dati che si
vogliono estrarre (per es. una istruzione).
Dal confronto tra i k bit più significativi di IND e l’uscita della RAM TAG si ha un HIT o un
MISS a seconda che si verifichi o meno un’uguaglianza: in caso si abbia un HIT il dato viene
estratto dalla RAM DATI e reso disponibile alla CPU.
Se, per es., si suppone di avere 32 bit in IND, si possono utilizzare i 15 bit meno significativi
per indirizzare due RAM da 215 =32 K indirizzi. Se si suppone che il dato sia costituito da 1
byte si ottiene lo schema riportato in fig. 3-13.
IND
31 14 0
RAM TAG RAM DATI
15 15
32K 32K
Indirizzi Indirizzi
1 byte per
17 cella
17 8
CONFRONTO DATO
Hit/Miss
In realtà la cache non lavora su singoli byte o parole ma su blocchi. Il blocco rappresenta la
quantità di informazione minima gestita dalla cache ed è costituito da un insieme di m
parole. Di conseguenza devono essere modificati gli schemi precedenti.
Se si suppone che la cache lavori, per esempio, su blocchi di 16 parole da 4 byte (1 Parola =
4 Byte = 4 x 8 Bit = 32 Bit; 1 Blocco = 16 Parole = 16 x 4 Byte = 64 Byte = 512 bit), si puo’
tracciare lo schema di fig. 3-14.
Sia la RAM TAG che la RAM DATI contengono 29 = 512 celle. I 9 bit dal 6 al 14 di IND
vengono usati per individuare il blocco richiesto; i bit da 0 a 5 servono per individuare,
all’interno di tale blocco, tramite il multiplexer, il dato cercato (26 = 64) se si tratta di un
byte. Se il dato da estrarre è invece una parola, si usano solo 4 dei 6 bit meno significativi
per pilotare il multiplexer.
Capitolo 3 3.11
Dispense di CALCOLATORI ELETTRONICI 1
IND
31 15 14 6 5 0
17
17 512 Bit
CONFRONTO MPX
Figura 3-14. Memoria cache di tipo Direct Mapping per blocchi da 512 bit
Quali sono i vantaggi nell’utilizzo dei blocchi rispetto a quello delle parole ?
• A parità di capacità della RAM DATI, la RAM TAG risulta di dimensioni ridotte:
utilizzando i blocchi, nell’esempio precedente, la RAM TAG era composta di 29 = 512
celle mentre non utilizzando i blocchi sarebbe risultata di 215 = 32 K celle;
• In base al principio di località nello spazio, è conveniente caricare nella cache tutto il
blocco a cui appartiene un dato, poiché con molta probabilità i prossimi dati richiesti
apparterranno a quello stesso blocco;
• Si riduce l’uso del bus di sistema (si veda la fig. 3-15) in quanto trasferire un blocco
dalla memoria primaria occupa meno tempo che trasferire tante singole parole. Infatti se
per es. si vogliono estrarre due parole si devono eseguire le seguenti operazioni:
Il beneficio risulta ovviamente tanto più sensibile quanto maggiore è la dimensione del
blocco.
Non conviene peraltro eccedere nelle dimensioni dei blocchi perche’ blocchi troppo grandi
possono originare i seguenti inconvenienti:
• Diminuzione della validità del principio di località
• Attese troppo lunghe per il trasferimento
• Sostituzione nella cache di informazioni utili con altre che non verranno utilizzate
Capitolo 3 3.12
Dispense di CALCOLATORI ELETTRONICI 1
CPU CACHE
MEMORIA
PRIMARIA
BUS
Se tutti i blocchi sono occupati, occorre scegliere un blocco da sostituire. La scelta migliore è
quella di eliminare l’informazione che non serve più o che non servira’ per il piu’ lungo
intervallo di tempo, ma purtroppo non e’ possibile individuarla: occorre quindi procedere con
buon senso.
Gli algoritmi principali utilizzati per scegliere il blocco da sostituire sono:
• LRU (Least Recently Used): il blocco che viene sostituito è quello che è rimasto
inutilizzato per il periodo di tempo più lungo. Tale strategia si basa su un corollario del
principio della località temporale: se è probabile che i blocchi usati di recente siano
riutilizzati, allora il miglior candidato alla sostituzione è il blocco che è stato usato meno
di recente;
• FIFO (First-In First-Out): il blocco che viene sostituito e’ quello che era stato inserito
per primo, indipendentemente dal fatto che sia stato utilizzato o meno successivamente;
Tra i tre algoritmi menzionati il primo è il più costoso da realizzare per la complessità
circuitale, ma è anche il migliore. Anche la scelta Random è buona e soprattutto e’ molto più
semplice da gestire, ed è pertanto la più usata. L’algoritmo FIFO è più complicato da
realizzarsi del Random e si comporta non molto meglio di quest’ ultimo per cui e’ poco usato.
Le celle della RAM TAG contengono in effetti bit aggiuntivi rispetto a quelli che individuano
l’indirizzo. Bisogna innanzi tutto prevedere un metodo per sapere se un blocco nella
memoria cache contiene informazioni valide. A questo scopo si aggiunge un bit di Valid
all’etichetta, che indica la validità dell’indirizzo contenuto nell’etichetta stessa. Quando
Valid vale 0 si ha un MISS, quando Valid vale 1 si può fare il confronto e vedere se c’è un
HIT.
Ad ogni cella della RAM TAG si aggiunge anche un bit di Modified: quando si deve eliminare
un blocco, se è stato modificato (Modified ad 1) lo si deve per prima cosa ricopiare nella
memoria primaria, altrimenti lo si puo’ cancellare subito.
Inoltre si devono aggiungere dei bit che forniscono informazioni per la sostituzione del
blocco, nell’ipotesi di non usare la sostituzione casuale (fig. 3-16).
Capitolo 3 3.13
Dispense di CALCOLATORI ELETTRONICI 1
- informazioni per la
sostituzione
V M
DATO
C P U CACHE M EMORIA
WR
PRIMARIA
Controllore
per gestire
scritture in Mp
BUS
Capitolo 3 3.14
Dispense di CALCOLATORI ELETTRONICI 1
Se vi sono piu’ scritture da effettuare in Mp, esse sono gestite normalmente secondo
l’algoritmo FIFO. Se la CPU cambia più volte dei dati contenuti nella cache, ogni volta
deve essere effettuata una scrittura in Mp.
CACHE
RAM RAM
TAG DATI
CONTROLLORE
DATI
FIFO
Il Copy Back costa di più del Write Through per la presenza nella cache del buffer e della
corrispondente parte di controllo e quindi si usa solo quando è necessario (tipicamente nei
sistemi multiprocessore per impegnare meno il bus, dato il minor numero di operazioni da
eseguire).
RAM RAM
b M E M
TAG DATI
PRIMARIA
a a
BUF FER
c
La cache di primo livello è spesso costituita da una memoria associativa ed e’ divisa in due
parti: una dedicata alle istruzioni, l’altra ai dati; in tal modo si aumenta il numero di bit che
possono essere trasferiti contemporaneamente nella CPU ossia la cosiddetta “banda” del
collegamento con la CPU (vedere la fig. 3-20). La cache di secondo livello è spesso realizzata
con una struttura di tipo Direct Mapping.
Cache di Cache di
C P U 1° Livello
(istruzioni) 2° Livello
Cache di
1° Livello
(dati)
Se, durante la trasmissione della stringa, un bit viene alterato rispetto al suo valore
originale, l’errore si rileva controllando il numero di bit a 1 del dato ricevuto. Se i bit
modificati sono però due o comunque in numero pari l’errore non viene rilevato.
Capitolo 3 3.16
Dispense di CALCOLATORI ELETTRONICI 1
Si considerino, come esempio, le stringhe di 3 bit di cui è mostrata nella fig. 3-21 una
rappresentazione grafica tridimensionale.
1°bit
101 111
110
100 3°bit
001
011
Se non si prevede l’impiego del bit di parità si utilizzano tutte e 8 le configurazioni per
trasmettere dati; se invece si utilizza per es. il controllo di parità pari, un bit è dedicato ad
esso e vengono sfruttate solo le configurazioni segnate nella fig. 3-22 con il simbolo @:
1°bit
1°bit
@ 3°bit
3°bit
3°bit
@ 2°bit
2°bit
Per passare da una configurazione lecita ad un’altra lecita occorre che vengano modificati
due bit.
Si definisce distanza di Hamming tra due sequenze di uno stesso numero di bit il numero
di bit differenti nelle due sequenze. Per esempio, date le due sequenze che seguono
Prima sequenza: 1 0 0 1 0 1 0 1
Seconda sequenza: 0 1 0 1 0 0 0 1
la distanza risulta 3.
Se con codice ci riferiamo all’insieme delle configurazioni di un certo numero di bit utilizzate
per qualche scopo in un calcolatore (per es. per rappresentare simboli o messaggi) si
Capitolo 3 3.17
Dispense di CALCOLATORI ELETTRONICI 1
definisce distanza di Hamming del codice la minima distanza d tra due configurazioni
qualsiasi del codice.
La distanza di Hamming di un codice e’ molto importante perche’ consente di precisare le
capacita’ di rilevazione o correzione di errori del particolare codice usato per rappresentare
l’informazione. In effetti si dimostra che se si utilizza un codice la cui distanza e’ pari a d, si
puo’ in alternativa:
1. Rilevare sino a d - 1 errori
Quindi con d = 1 si rilevano 0 errori, con d = 2 si rileva 1 errore, con d = 3 si rilevano 2
errori, e cosi’ via.
2. Correggere sino a ⎣(d – 1) / 2⎦ errori
Quindi con d = 2 non c’è possibilita’ di correzione, con d = 3 oppure d=4 si possono
correggere errori singoli, con d=5 si possono correggere errori doppi, e cosi’ via.
In generale se si fa riferimento ad una rappresentazione “spaziale” delle configurazioni si
può pensare che ogni codice sia al centro di una “sfera“ di punti raggiungibili facendo uno o
piu’ errori.
Con lo stesso codice è quindi possibile:
• Rilevare l’errore e non correggerlo richiedendone nuovamente la trasmissione;
• Rilevare l’errore e correggerlo.
E’ possibile decidere a priori se optare per la correzione degli errori o per il loro rilevamento.
Ad esempio, se si calcola che un errore possa verificarsi mediamente ogni 20 anni, si puo’
considerare tale periodo abbastanza lungo da non dover prendere particolari precauzioni per
procedere alla correzione, a meno che non si tratti di un’applicazione critica, per esempio un
programma di controllo della posizione di un satellite. In generale si puo’ barattare capacita’
di correzione con capacita’ di rilevazione. Per esempio, con d=5 si dimostra che si possono
correggere errori doppi oppure correggere errori singoli e rilevare sino ad errori tripli oppure
rilevare sino ad errori quadrupli.
Si consideri il seguente esempio. Si supponga di lavorare con tre bit e di considerare come
configurazioni lecite 000 e 111. La distanza del codice e’ quindi d=3.
Se si opta per la rilevazione di errori, e’ possibile rilevare errori singoli ed errori doppi (tutte
le configurazioni con un solo 1 o con due 1 sono errate).
1 °b it
111
3 °b it
2 °b it
000
s fe ra d i p u n ti in to rn o a 0 0 0
s fe ra d i p u n ti in to rn o a 1 1 1
Capitolo 3 3.18
Dispense di CALCOLATORI ELETTRONICI 1
Se si opta per la correzione di errori e’ possibile correggere errori singoli. Infatti ognuna delle
configurazioni lecite è contornata da un insieme di punti che vanno interpretati come
configurazioni ottenute da quella lecita a seguito di un errore (fig. 3-23). Se si riceve una
delle configurazioni appartenenti alla sfera di 000 allora si conclude che è stato trasmesso
000, se invece si riceve una delle configurazioni appartenenti alla sfera di 111 allora si
conclude che è stato trasmesso 111. Se per caso si verificassero 2 errori si trarrebbe una
conclusione errata.
Tra i numerosi codici a correzione di errore si prenderanno ora in esame alcuni casi
particolari di impiego dei codici sviluppati dal ricercatore statunitense R. Hamming e che
prendono il suo nome. Essi rientrano tra i codici detti “lineari”.
Come risulta dalla seguente tabella nel codice complessivo il rapporto m/n diminuisce
all’aumentare di n:
n m
1 2
2 3
3 3
4 3
5 4
6 4
7 4
8 4
Capitolo 3 3.19
Dispense di CALCOLATORI ELETTRONICI 1
più rispetto al caso precedente. I bit di controllo da aggiungere agli n bit d’informazione sono
quindi m+1.
Come risulta dalla tabella che segue, a parita’ di n il numero m e’ ovviamente maggiore che
nel caso di correzione di errori singoli ma ancora il rapporto m/n decresce al crescere di n.
n m
1 4
2 5
3 6
4 6
5 7
6 7
7 7
8 7
y y y y y y y y y ... y
1 2 3 4 5 6 7 8 9 n+m
c c x c x x x c x ...
Capitolo 3 3.20
Dispense di CALCOLATORI ELETTRONICI 1
0 1 1 2 2 3 4 3 5
dove i simboli denotano:
• xi i bit di informazione
• c0 il bit di parità pari per i bit di posizione 3, 5, 7, 9, .... ovvero:
c0 = y3 ⊕ y5 ⊕ y7 … = x1 ⊕ x2 ⊕ x4 … (infatti x1 è il 3° bit, x2 è il 5° e il 7° …)
• c1 il bit di parità pari per i bit di posizione 3, 6, 7, 10, 11, .... all’interno di y, ovvero:
c1 = y3 ⊕ y6 ⊕ y7 … = x1 ⊕ x3 ⊕ x4 …
• c2 il bit di parità pari per i bit di posizione 5, 6, 7, 12, 13, 14, 15, .... all’interno di y,
ovvero:
c2 = y5 ⊕ y6 ⊕ y7 …. = x2 ⊕ x3 ⊕ x4 …
e cosi’ via per i restanti bit di controllo. Si noti che, procedendo in questo modo, i bit di
controllo cj sono stati posizionati in modo che ognuno dipenda solo dai bit xi e non dagli
altri bit di controllo cj.
Il vettore e si ricava nel modo seguente :
e0 = y1 ⊕ y3 ⊕ y5 ⊕ y7 … = c0 ⊕ x1 ⊕ x2 ⊕ x4 …
e1 = y2 ⊕ y3 ⊕ y6 ⊕ y7 … = c1 ⊕ x1 ⊕ x3 ⊕ x4 …
…...................................................................
Supponiamo che, per es., si abbia n=4. La disequazione per ricavare m è : 2m >= (1+n+m) da
cui m=3. Il dato trasmesso è pertanto strutturato nel seguente modo:
Capitolo 3 3.21
Dispense di CALCOLATORI ELETTRONICI 1
y y y y y y y
1 2 3 4 5 6 7
c c x c x x x
0 1 1 2 2 3 4
in cui
c0 = x1 ⊕ x2 ⊕ x4
c1 = x1 ⊕ x3 ⊕ x4
c2 = x2 ⊕ x3 ⊕ x4
vengono costruiti all’atto dell’invio del dato. All’arrivo vengono ricavati
e0 = y1 ⊕ y3 ⊕ y5 ⊕ y7
e1 = y2 ⊕ y3 ⊕ y6 ⊕ y7
e2 = y4 ⊕ y5 ⊕ y6 ⊕ y7
Se l’informazione da inviare fosse x = 1001= x1x2x3x4 si avrebbe
c0 = 1 ⊕ 0 ⊕ 1= 0
c1 = 1 ⊕ 0 ⊕ 1= 0
c2 = 0 ⊕ 0 ⊕ 1= 1
si otterrebbe:
e0 = 1; e1 = 1; e2 = 0
ovvero e = e2e1e0=011=3 : è avvenuto un errore nel bit di posizione 3, che, corretto,
ripristina la configurazione corretta:
c c x c x x x
0 1 1 2 2 3 4
0 0 1 1 0 0 1
Capitolo 3 3.22
Dispense di CALCOLATORI ELETTRONICI 1
Questo metodo non dà risultati corretti nel caso di 2 errori. Se infatti ricevessimo
c c x c x x x
0 1 1 2 2 3 4
0 0 0 1 1 0 1
avremmo
e0 = 0; e1 = 1; e2 = 1
ovvero e = e2e1e0=110=6 e concluderemmo che si è verificato un errore nel bit di posizione 6,
correggendo il codice complessivo in modo sbagliato.
y y y y y y y y y ... y
1 2 3 4 5 6 7 8 9 n+m
c c x c x x x c x ... P
0 1 1 2 2 3 4 3 5
I casi che si possono presentare al ricevimento del codice complessivo integrato con il bit P
sono raccolti nella tabella che segue. In essa si conviene che Q=0 indica che e’ pari il
numero di bit nella stringa costituita dagli n+m+1 bit mentre Q=1 indica che tale numero e’
dispari.
e Q conclusione
0 0 nessun errore
0 1 errore sul solo bit di parità
≠0 1 1 errore correggibile
≠0 0 2 errori non correggibili
In effetti la situazione e=0 e Q=1 potrebbe presentarsi anche se si avessero 3 errori nel dato:
se questo è un evento che ha bassa probabilita’ di verificarsi si puo’ trascurare una tale
eventualita’.
Capitolo 3 3.23
Dispense di CALCOLATORI ELETTRONICI 1
Testina di
scrittura
Traccia
Settore
La traccia linearizzata si presenta come in fig. 3-25, supponendo che la traccia scorra sotto
la testina nel verso indicato dalla freccia.
Dato che, al contrario di quanto accade nella RAM nella quale è assegnato un indirizzo ad
ogni byte, la locazione fisica del byte non è definita, occorre individuare l’informazione che si
trova sulla traccia e si usa a questo scopo l’header (intestazione o etichetta). I dati non
seguono direttamente l’header, per evitare che si sovrappongano accidentalmente all’header
stesso, ma vi è un gap, ossia un’intervallo di separazione.
Per leggere l’informazione memorizzata sul disco si usa la stessa testina usata per scrivere:
quando essa passa sopra i domini magnetici genera impulsi che rappresentano
l’informazione.
Capitolo 3 3.24
Dispense di CALCOLATORI ELETTRONICI 1
Il problema non sorgerebbe se il disco avesse velocità variabile, ma questo vorrebbe dire far
variare la sua velocità a seconda della traccia su cui si lavora, complicando la circuiteria di
controllo. Questa soluzione è adottata nei dischi di grande capacità e di prestazioni spinte.
L’header e’ definito quando il disco viene predisposto per la registrazione (operazione detta
di “formattazione”) ed e’ tipicamente costituito di cinque parti, come indicato nella fig. 3-26.
Rilevazione
Preambolo # traccia di errori
Sync # settore
• Il Sync è un pattern di sincronizzazione, ossia una sequenza specifica di impulsi che non
può essere generata da alcun dato. Quando si incontra una sequenza di Sync si può
iniziare a leggere l’informazione.
• Rilevazione di errori: per la rilevazione di errori si usano di solito molti bit, poiché è
facile la presenza di errori. In genere si usano codici per rilevare gli errori e non per
correggerli, perché dopo un giro si può di nuovo riprovare la lettura (l’unita’ di controllo
di un disco per lo piu’ comunica che non può leggere un settore di un disco solo se sono
andati male tutti i tentativi successivi di lettura che ha fatto, per esempio 16). L’errore su
disco è frequente, ma fortunatamente è quasi sempre recuperabile con una successiva
rilettura.
Preambolo DATI
Sync Rilevazione
di errori
Si osservi che, in base alla organizzazione dei dati descritta, una parte cospicua della traccia
è utilizzata per individuare l’informazione e non contiene dati.
Nel caso dei dischetti da 3.5 pollici (i floppy disk oggi piu’ comuni) la capacita’ nominale di
~2MB si riduce in realta’ dopo la formattazione a 1474560 byte dei quali peraltro solo
1457664, pari a ~1.39 MB (dove 1MB=1048576 B), sono usabili: questi rappresentano circa
il 69.5% della capacita’ nominale. Gli altri parametri di interesse per questi dischetti sono i
seguenti: 2 facce, 80 tracce per faccia (densita’ 135 tracce/pollice); 18 settori per traccia, da
512 byte ciascuno dopo la formattazione (in realta’ solo 506 byte sono usabili); densita’ di
registrazione sulle tracce 17434 bit/pollice; velocita’ di rotazione 300 giri/1’; velocita’ di
trasferimento 500Kbit/s.
In pratica nella registrazione dei file sul disco si utilizza una zona del disco stesso (in genere
le tracce più esterne) per memorizzare il repertorio o indirizzario (in inglese directory), che
non e’ altro che l’elenco dei file contenuti sul disco. Nel repertorio un file e’ individuato dal
nome e dalla sua posizione sul disco e la posizione è definita con # traccia e # blocco. Un
blocco e’ costituito da piu’ settori, e si usano blocchi anziche’ settori perché un file in genere
occupa numerosi settori e quindi nel repertorio si avrebbe una lunga lista di numeri di
tracce e di settori, mentre con i blocchi si ottiene una lista più compatta. Connesso all’uso
dei blocchi vi è pero’ un problema di spreco di spazio in quanto in un blocco vi possono
essere settori inutilizzati.
Si supponga ora di voler leggere un file, che utilizza più settori. Dopo aver letto il primo
settore (per es. il Settore 1) si ha nel buffer associato al disco il contenuto di tale settore;
finché non si svuota il buffer e si trasferiscono in Mp i dati in esso contenuti non si può
leggere il secondo settore. Quindi se, quando il Settore 2 capita sotto la testina di lettura, il
buffer non è stato ancora svuotato, non si riesce a leggerlo e bisogna aspettare il giro
successivo per la sua lettura (fig. 3-28).
Settore 2
Testina
di lettura
Settore 1
Capitolo 3 3.26
Dispense di CALCOLATORI ELETTRONICI 1
Si riesce ad evitare questo inconveniente distribuendo i settori sulla traccia non in modo
sequenziale, ma con una regola detta Interleave: essa consiste nell’allontanare tra loro le
letture, distanziando il Settore 2 dal Settore 1, in modo che ci sia tempo sufficiente per
estrarre i dati presenti nel buffer (fig. 3-29).
Settore 2
Settore 1
Il tempo di accesso in una memoria a disco non e’ costante ma dipende dalla posizione
sul supporto dell’informazione alla quale si vuole accedere. Esso dovrebbe essere definito
(prima definizione) come la durata dell’intervallo di tempo che intercorre tra l’istante in cui si
completa la decodifica di una istruzione che richiede l’uso del disco e l’istante in cui
l’informazione richiesta e’ resa disponibile nel buffer associato al disco. E’ chiaro che interessa
far riferimento alle operazioni di lettura, la scrittura potendo essere gestita anche in tempo
differito.
In pratica, pero’, nella descrizione delle caratteristiche prestazionali delle unita’ a disco si fa
riferimento ad una definizione lievemente diversa: il tempo di accesso e’ definito (seconda
definizione) come la durata dell’intervallo di tempo che intercorre tra l’istante in cui l’unita’ di
controllo del disco ha individuato i parametri (blocco, traccia, settore) dell’operazione da
compiere e l’istante in cui l’informazione richiesta e’ resa disponibile nel buffer associato al
disco.
In particolare per un disco a testina mobile come quello prima descritto il tempo di accesso
e’ dato dalla formula
dove:
• Tposizionamento (tseek in inglese) è il tempo necessario per spostare la testina di lettura e
scrittura sulla traccia che interessa. Questo tempo dipende ovviamente da dove si trova
la testina e dove si vuole posizionarla, non ha un valore costante e non è linearmente
proporzionale allo spostamento. Infatti per spostarsi da una traccia a quella successiva
(adiacente) si impiega un certo tempo; se ci si sposta di 10 tracce non occorre un tempo
10 volte maggiore ma un tempo minore in quanto durante lo spostamento la testina
accelera, raggiunge la velocità massima e poi frena. Normalmente si definisce per esso un
campo di variazione tra minimo e massimo od un valore medio.
Capitolo 3 3.27
Dispense di CALCOLATORI ELETTRONICI 1
• Tlatenza è il tempo necessario perché il settore cercato arrivi sotto la testina di lettura e
scrittura. Neppure il tempo di latenza ha un valore costante, e normalmente si assume
per esso il suo valor medio, pari al tempo che il disco impiega a compiere mezzo giro.
• Ttrasferimento è il tempo necessario per far passare il settore cercato sotto la testina e
trasferirne il contenuto nel buffer associato al disco. Il tempo di trasferimento ha un
valore costante.
Come gia’ rilevato, il tempo di accesso ad un disco ha un valore non costante e, nelle attuali
realizzazioni, dell’ordine delle decine di millisecondi. Dato pero’ che le variazioni da minimo a
massimo sono contenute (per es. da 1 a 10) si usa definire la modalita’ di accesso come
quasi casuale (in inglese “pseudo random”).
Esistono anche dischi a testine fisse che sono dotati di una testina per ogni traccia. Essi
consentono di scambiare informazioni più velocemente in quanto non c’e bisogno di
posizionare la testina e di conseguenza il tempo di accesso e’ dato da
I dischi a testine fisse presentano pero’ due inconvenienti: un costo più elevato ed una
minore capacità (in quanto le testine hanno una certa dimensione trasversale e quindi si
potranno avere meno tracce sulla superficie del disco).
Certi dischi sono dotati sia della testina mobile che delle testine fisse: si hanno informazioni
ad accesso veloce su tracce accessibili tramite le testine fisse ed informazioni ad accesso piu’
lento su tracce accessibili con testina mobile.
Le principali caratteristiche fisiche sono le seguenti (le unita’ di misura lineari usate sono
quelle inglesi e cioe’ il pollice o inch, abbreviazione in, corrispondente a circa 25.4 mm ed il
piede o foot, abbreviazione ft, corrispondente a circa 0.3048 m):
• larghezza del nastro 0.5 in, lunghezza 2400 ft;
• densita’ di registrazione da 800 a 6250 bpi (bit per inch); usando la densita’ piu’
elevata un carattere occupa longitudinalmente 4 µm;
• velocita’ di avanzamento da 10 a 200 ips (inches al secondo: corrispondono a velocita’
da 25 a 500 cm/s);
• tempo di accesso da 100 ms a 100 s;
• velocita’ di trasferimento da 100 a 2000 Kbyte/s.
Capitolo 3 3.28
Dispense di CALCOLATORI ELETTRONICI 1
Nel caso del nastro non esiste una struttura fissa quale il settore e la struttura
dell’informazione registrata e’ piu’ semplice (si veda la fig. 3-30). Siccome non vi è bisogno di
identificare dove scrivere o leggere in modo pseudocasuale, i dati possono seguire
immediatamente l’ header e questo tipicamente comprende tre parti: Preambolo, Sync, #
Record. Header e dati sono seguiti da bit per la rilevazione di eventuali errori.
Rilevazione Rilevazione
GAP di errori in header di errori nei dati
record logico cercato. Nella fig. 3-30 l’insieme di {header, bit di rilevazione di errori per
l’header, dati, bit di rilevazione di errori per i dati} costituisce un record fisico.
Capitolo 3 3.30