Sei sulla pagina 1di 30

Dispense di CALCOLATORI ELETTRONICI 1

Capitolo 3 LA MEMORIA

3.1 – MEMORIA PRIMARIA

La memoria primaria di un calcolatore, che contiene le istruzioni ed i dati che possono


essere trasferiti direttamente nel processore centrale per la successiva esecuzione od
elaborazione, e’ costituita da un insieme di celle, ciascuna delle quali e’ in grado di
contenere uno stesso numero n di bit (il caso piu’ comune e’ n=8).
La memoria primaria puo’ essere dei seguenti tipi:

• ROM (Read Only Memory)


Memorie di tipo non volatile che hanno la capacità di conservare l’informazione
indipendentemente dalla presenza o meno della tensione di alimentazione.
I principali sottotipi sono:
• ROM vere e proprie
Sono memorie programmate dal costruttore e non sono modificabili dall’utilizzatore: è
possibile solo la lettura dei dati contenuti.
• PROM (Programmable ROM)
Si tratta di memorie sulle quali l’utilizzatore puo’ scrivere i dati una sola volta,
utilizzando un apposito dispositivo di registrazione, e che in seguito sono utilizzate
solo in lettura.
• EPROM (Erasable Programmable ROM)
Sono memorie nelle quali l’utilizzatore può memorizzare i dati anche più volte,
utilizzando appositi dispositivi di cancellazione (a raggi ultravioletti).
• EEPROM (Electrically Erasable PROM) o EAROM (Electrically Alterable ROM)
Sono memorie EPROM nelle quali la cancellazione si puo’ fare per via elettrica ma e’
tipicamente globale (coinvolge cioe’ tutti i dati registrati).
• FLASH
Si tratta di memorie EEPROM che consentono la cancellazione selettiva.
• RAM (Random Access Memory)
Memorie volatili che perdono le informazioni in mancanza della tensione di alimentazione.
Si dividono in:
• SRAM (Static RAM)
Memorie statiche nelle quali l’informazione viene memorizzata nell’equivalente di un
Flip Flop.
• DRAM (Dynamic RAM)
Memorie dinamiche nelle quali l’informazione viene memorizzata in un condensatore.
Anche in presenza della tensione di alimentazione l’informazione contenuta in ogni
cella viene conservata per un breve periodo di tempo (dell’ordine di grandezza di 2 ms),
passato il quale il contenuto deve essere ripristinato: questo avviene ciclicamente
tramite un’operazione di “rinfresco” che viene effettuata dal sistema (questa operazione
di rinfresco impegna tempo che viene sottratto alla disponibilita’ della memoria per gli
utilizzatori).
Una versione denominata SDRAM (Synchronous DRAM) consente una maggiore
flessibilita’ di impiego permettendo, grazie all’impiego di un apposito registro in uscita,
di modificare il dato contenuto in una cella mentre si sta utilizzando il vecchio dato).
Una ulteriore evoluzione della SDRAM e’ la DDR (Double Data Rate) che, come dice il
nome, consente di operare a frequenza doppia potendo essere pilotata sia sul fronte di
salita che sul fronte di discesa del clock.

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
intende 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 esclusivamente 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

Contenuto della cella


selezionata

Figura 3-1. Schema di principio di impiego di una memoria RAM o ROM

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

Figura 3-2. Schema di principio di impiego di una memoria associativa

3.2 – STADI DI UN PROGRAMMA


Qualsiasi programma attraversa quattro stadi nella sua esistenza: codice sorgente, codice
oggetto, codice eseguibile e codice in esecuzione. In ciascuno di questi stadi il riferimento
agli indirizzi di memoria è fatto in modo diverso: rispettivamente tramite indirizzi simbolici,
indirizzi rilocabili, indirizzi virtuali e indirizzi fisici (fig. 3-3).

Ind. SIMBOLICO Codice “ sorgente “

Compilazione
Ind. RILOCABILE Codice “oggetto”

Linking
Ind. VIRTUALE Codice “ eseguibile “
SOFTWARE

HARDWARE
Gestione della memoria ( MMU )
Ind. FISICO
Codice “in esecuzione”

Figura 3-3. Indirizzi coinvolti negli stadi di un programma

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.

I sistemi operativi si distinguono in monotask (è gestito un unico programma) ed in


multitask (viene gestita l’esecuzione di più programmi).

Nei sistemi operativi monotask la gestione della memoria è semplice (fig. 3-4).

Memoria
Fisica
CPU

Sistema operativo
Monotask

Figura 3-4. Gestione della memoria nei sistemi opeativi 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

Indirizzi Indirizzi TASK 1


virtuali fisici
TASK 2
CPU MMU
TASK 3

TASK 4

Figura 3-5. Gestione della memoria nei sistemi operativi multitask

Nei sistemi multitask è e quindi possibile far eseguire un programma, indipendentemente


dalle posizioni in memoria in cui viene inserito.
Si noti che non è necessario che un task occupi uno spazio contiguo nella memoria fisica:
esso può essere diviso in più parti ed addirittura qualche parte può essere lasciata in
memoria secondaria al fine di risparmiare memoria fisica.

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 ask 1 T ask 2 T a sk 3

T em po
Figura 3-6. Avvicendamento dei task (visione globale)

In effetti, se si tiene conto anche del S.O., si ha la situazione di fig. 3-7.

T e m p o d e d ic a to a l T a sk 1

S .O . T a sk 1 S .O . T a sk 2 S .O . T a sk 3

T em po
Figura 3-7. Avvicendamento dei task (visione dettagliata)

Le funzioni fondamentali svolte dalla MMU sono:


1. protezione
Un task, o il S.O., devono poter scrivere solo nella zona di memoria che gli è stata
assegnata
2. gestione delle istruzioni riservate al S.O.
Alcune operazioni sono effettuabili solo dal S.O. Ad esempio le istruzioni di I/O devono
essere eseguite solo dal S.O.: un task deve quindi fare richiesta al S.O. nel caso abbia
necessità di effettuare attivita’ di I/O;
3. gestione efficiente della memoria fisica

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.

3.3 - ACCENSIONE DEL CALCOLATORE


Nel momento in cui il sistema viene acceso nella RAM vi saranno dei valori casuali. Occorre,
quindi, all’accensione, effettuare un primo caricamento dei dati necessari affinché il sistema
possa iniziare a funzionare. Si utilizza a questo scopo, in luogo della RAM, una memoria di
tipo non volatile (es. EPROM, PROM, ROM) che contiene il programma di bootstrap (o
sequenza di istruzioni di innesco) il quale carica la parte essenziale del S.O. in RAM dalla
memoria secondaria (solitamente un disco) e inizializza il sistema per il normale
funzionamento. Quindi la memoria di bootstrap, all’accensione del calcolatore, si sostituisce
alla RAM e, una volta che il programma di boostrap ha caricato la parte del S.O. che
consente al sistema di proseguire autonomamente, viene disabilitata e viene riabilitata la
RAM. Queste operazioni sono realizzate utilizzando una apposita rete hardware.

3.4 - GERARCHIA DI MEMORIA


La struttura piu’ semplice della memoria di un calcolatore e’ riportata in fig. 3-8.

MEMORIA MEMORIA
CPU
PRIMARIA DI MASSA

Figura 3-8. Organizzazione basilare della memoria

La funzione di memoria e’ suddivisa tra Memoria Primaria (Mp) e Memoria di Massa o


Memoria Secondaria (Ms): quest’ultima, non volatile, serve per salvare i dati quando il
calcolatore viene spento e per aumentare la quantita’ di dati memorizzabili.

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
eventualmente cercata in memoria.
Nelle memorie primarie di tipo RAM il tempo di accesso e’ definito come l’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 una dalle altre.
Capitolo 3 3.6
Dispense di CALCOLATORI ELETTRONICI 1

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.

Figura 3-9. Gerarchia di memoria

Peraltro al crescere della dimensione (o capacita’) di un tipo di memoria, solitamente


espressa in byte, cresce il tempo di accesso a tale tipo di memoria secondo la seguente
formula:

T accesso = L ⋅ dim

dove L è una costante di proporzionalità e dim è la dimensione della memoria considerata.

La tabella che segue riporta dimensione e tempo di accesso tipici dei cinque livelli nonche’
degli elementi di memorizzazione usati nel processore centrale (registri).

LIVELLO TIPO DIMENSIONE TEMPO DI


D ACCESSO

Capitolo 3 3.7
Dispense di CALCOLATORI ELETTRONICI 1

byte Taccesso
0 Registri <1K 1-5 ns
1 Cache di primo livello < 32 K 10-20 ns MEMORIE
2 Cache di secondo livello <1M 20-80 ns IN
3 Memoria primaria < 512 M 100-500 ns LINEA
4 Memoria di massa di primo livello < 10 T 5-50 ms
(memoria secondaria)
5 Memoria di massa di secondo livello illimitata 200 ms - 100 s MEMORIA
(memoria di archiviazione) FUORI LINEA

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).

In effetti questo principio e’ normalmente soddisfatto.

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

dove K dipende in modo complesso dall’architettura del sistema, dall’organizzazione e


gestione dei dati, dalla natura delle applicazioni. Per diverse applicazioni e diversi livelli di
memoria si e’ trovato per K il valore approssimato di 200, se D e’ espressa in byte.

Cio’ posto, se si suppone (come e’ lecito fare nelle normali applicazioni) che:

-il dato richiesto dalla CPU sia certamente presente nella gerarchia;

- se l’informazione richiesta e’ presente in un certo livello della gerarchia e’ presente in tutti i


livelli “superiori” (quelli piu’ lontani dalla CPU);

Capitolo 3 3.8
Dispense di CALCOLATORI ELETTRONICI 1

- se l’informazione richiesta non e’ presente in un certo livello della gerarchia non e’


presente in tutti i livelli “inferiori” (quelli piu’ vicini alla CPU);

- 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;

si puo’ ricavare per la struttura di fig. 3-9 una formula molto semplice per il valore medio
del tempo di accesso alla gerarchia:

Taccesso medio = TA1 + M1 x TA2 + M2 x TA3 + M3 x TA4 + M4 x TA5

In questa formula TA1, TA2, TA3, TA4, TA5 sono i tempi (medi) di accesso ai cinque livelli della
gerarchia ed 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

3.5 – MEMORIA CACHE

Occorre ora esaminare i principi di realizzazione di una memoria cache.


In assenza di memoria cache, CPU e memoria primaria sono direttamente collegate, come
indicato nella fig. 3-10. La CPU invia alla memoria indirizzi IND ad n bit e la memoria
contiene 2n celle.

IND
CPU n MEM
PRIMARIA

Figura 3-10. Indirizzamento della memoria in presenza della sola Mp

In presenza di memoria cache lo schema diventa quello di fig.3-11.

Capitolo 3 3.9
Dispense di CALCOLATORI ELETTRONICI 1

IND
CPU n CACHE MEM
PRIMARIA

Figura 3-11. Indirizzamento della memoria in presenza di cache ed Mp

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 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. 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

HIT / MISS DATO

Fig. 3-12. Schema di principio di una cache Direct Mapping

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).
Capitolo 3 3.10
Dispense di CALCOLATORI ELETTRONICI 1

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

Figura 3-13. Esempio di cache di tipo Direct Mapping

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

RAM TAG RAM DATI


9 4 (6)

512 celle 9 512 Blocchi


di 17 bit, da 16 Parole
una per o 64 byte l’uno
blocco

17

17 512 Bit

CONFRONTO MPX

HIT/MISS 32 (8) Bit

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:

Invio indirizzo Estrazione Trasferimento Invio indirizzo Estrazione Trasferimento


prima parola a prima parola prima parola seconda parola seconda parola seconda parola
Mp da Mp a Cache a Mp da Mp a Cache

mentre per estrarre un blocco di due parole e’ sufficiente fare:

Invio indirizzo Estrazione del Trasferimento


del blocco a blocco del blocco
Mp

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

Figura 3-15. Collocazione del bus di sistema

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;

• Random: il blocco da sostituire e’ scelto in modo casuale

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

Figura 3-16. Struttura reale delle celle della RAM TAG

Gestione della scrittura


Nei sistemi nei quali e’ presente una memoria cache si presenta la necessita’ di introdurre
un meccanismo che permetta alla CPU di lavorare durante le eventuali operazioni di
scrittura nella memoria primaria, che richiedono tempi molto piu’ lunghi. Tale meccanismo
è realizzato con un Controllore (“controller”) che gestisce la scrittura su Mp in modo
indipendente dalla CPU (si veda la fig. 3-17).

DATO
C P U CACHE M EMORIA

WR
PRIMARIA

Controllore
per gestire
scritture in Mp
BUS

Figura 3-17. Controllore per le scritture in Mp

La scrittura nella memoria primaria puo’ essere attuata in due modi:


• Write Through: in questo modo si suol dire che la cache è “trasparente” in quanto ogni
scrittura che viene effettuata dalla CPU nella memoria cache si riflette subito in una
scrittura in Mp per trasferire in essa la modifica attuata nella cache. Il controllore si
occupa della scrittura in Mp in modo tale che RAM TAG e RAM DATI rimangano a
disposizione della CPU la quale è così in grado di continuare la propria elaborazione (fig.
3-18).
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
Capitolo 3 3.14
Dispense di CALCOLATORI ELETTRONICI 1

deve essere effettuata una scrittura in Mp e la modalita’ Write Through risulta quindi
onerosa.

RAM RAM
TAG DATI

CONTROLLORE

DATI
FIFO

Figura 3-18. Aggiornamento della Mp con la tecnica Write Through

• Copy Back (o Write Back ): in questo modo di funzionamento le modifiche introdotte


dalla CPU non vengono immediatamente riportate in Mp ma si aggiorna solo la Cache. La
scrittura in Mp viene fatta solo quando è necessario, ossia quando si verifica uno dei due
seguenti eventi: il termine di un task; la necessita’ di fare spazio nella cache per ospitare
un nuovo blocco. Ovviamente se il blocco da eliminare era stato modificato esso va
ricopiato nella Mp. Per rispondere alle richieste di scrittura della CPU il più rapidamente
possibile, si introduce in ogni caso nella Cache un buffer, ossia un insieme di registri, in
genere in grado di contenere più di un blocco e gestito con disciplina FIFO. Qualora il
blocco da togliere dalla cache sia stato modificato, per evitare di bloccare la CPU occorre
rovesciare l’ordine delle operazioni di lettura e scrittura in Mp (fig. 3-19):
a. Si salva il blocco dalla cache nel buffer;
b. Si trasferisce l’informazione, richiesta dalla CPU, dalla Mp alla cache, in modo che
la CPU possa ricominciare a lavorare;
c. Si trasferisce il blocco dal buffer alla Mp.

Il Copy Back costa di più del Write Through per la presenza del buffer nella cache e la parte
di controllo che deve essere prevista 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

Figura 3-19. Aggiornamento della memoria con la tecnica Copy Back

Capitolo 3 3.15
Dispense di CALCOLATORI ELETTRONICI 1

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)

Figura 3-20. Possibile organizzazione della cache di primo livello

3.6 - RILEVAZIONE E CORREZIONE DEGLI ERRORI

In un calcolatore vi sono due situazioni in cui si possono verificare degli errori:


1. Trasmissione di un dato su una linea: è possibile che, a causa di rumore, il dato venga
alterato, specie se le linee sono lunghe (i BUS interni di solito sono di dimensioni ridotte
e pertanto è difficile che su di essi si verifichino errori di questo tipo).
2. Lettura della memoria RAM: essendo quest’ultima realizzata con componenti sempre più
piccoli che utilizzano sempre meno energia e che possono risultare in parte difettosi è
possibile che l’informazione venga registrata o letta male.
Nel seguito, per semplicita’, si fara’ riferimento alla prima delle due situazioni ma le
considerazioni che verranno svolte si applicano invariate anche alla seconda.
Il rimedio piu’ semplice per rilevare eventuali errori consiste nell’inserire un bit di parità
che assuma un valore tale da rendere pari (parità pari) o dispari (parità dispari) il numero di
uno della stringa di bit da trasmettere.
Nell’ipotesi di voler avere un numero pari di bit a 1 (parita’ pari, quindi) nella stringa da
trasmettere, se si parte dai bit
x1 … xn

dovrà essere aggiunto un bit P dato dalla seguente espressione booleana:


P = x1 ⊕ x2 ⊕ …. ⊕ xn

in modo tale da ottenere la stringa seguente:


x1 … xn P

Capitolo 3 3.16
Dispense di CALCOLATORI ELETTRONICI 1

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.

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

000 010 2°bit

Figura 3-21. Rappresentazione grafica delle possibili stringhe di 3 bit

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

Figura 3-22. Controllo di parita’ pari nelle stringhe di 3 bit

Per passare da una configurazione lecita ad un’altra lecita occorre che vengano modificati
due bit.

3.7 – DISTANZA DI HAMMING

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
Capitolo 3 3.17
Dispense di CALCOLATORI ELETTRONICI 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
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).

Capitolo 3 3.18
Dispense di CALCOLATORI ELETTRONICI 1

1 °b it
111

3 °b it

2 °b it
000

C o n fig u ra zio n i le c ite

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

Figura 3-23. Correzione di errori singoli con stringhe di 3 bit

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.

3.8 – CODICI HAMMING

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”.

Correzione di errore singolo


E’ necessario che la distanza di Hamming tra due configurazioni lecite sia d = 3. Siano n i
bit d’informazione del codice assegnato ed m i bit di controllo, da aggiungere ai bit
d’informazione per attuare la correzione. Il dato trasmesso (che si puo’ chiamare “codice
complessivo”) sarà pertanto composto da n+m bit. Le configurazioni lecite sono 2n ed
ognuna di esse sarà al centro di una sfera che comprende la configurazione lecita e le
configurazioni non lecite che distano 1 da essa. Pertanto ad ogni configurazione lecita sono
associate 1+n+m configurazioni, dato che n+m sono le configurazioni a distanza 1 da un
dato di n+m bit. Le configurazioni totali saranno pertanto 2n *(1+n+m). Dato che con n+m
bit si hanno a disposizione 2n+m configurazioni, esse devono essere sufficienti per coprire
tutte le configurazioni necessarie cioè:
2n+m >= 2n *(1+n+m) ovvero 2m >= (1+n+m)
Questa disequazione permette di calcolare il numero m di bit di controllo occorrenti per
correggere un errore per un codice di n bit. Ovviamente, per motivi di costo, si sceglie il
valore minimo di m che soddisfa alla disequazione.
Se per es. n=1 si ha 2m >= 1+1+m = 2+m e da qui si ricava m=2.

Come risulta dalla seguente tabella nel codice complessivo il rapporto m/n diminuisce
all’aumentare di n:
Capitolo 3 3.19
Dispense di CALCOLATORI ELETTRONICI 1

n m
1 2
2 3
3 3
4 3
5 4
6 4
7 4
8 4

Correzione di errore singolo e rilevazione di errore doppio


Se oltre a correggere un errore se ne vogliono rilevare due, occorre allontanare ulteriormente
le configurazioni lecite. Per far ciò è sufficiente aggiungere un bit di parità che, come detto in
precedenza, rileva un solo errore e pertanto ha il compito di rilevare quell’eventuale errore in
più rispetto al caso precedente. I bit di controllo da aggiungere agli n bit d’informazione sono
quindi m+1.

Correzione di errore doppio


Ogni configurazione lecita deve essere al centro di una sfera di raggio 2 (che contenga cioè
configurazioni a distanza minore o uguale a 2 dalla configurazione lecita). Le configurazioni
contenute in ciascuna sfera sono pertanto:
1 + [n+m] + [(n+m)(n+m-1)/2]
in cui, oltre alla configurazione lecita, sono contate nella prima parentesi quadra le
configurazioni a distanza 1 e, nella seconda, quelle a distanza 2. E’ infatti possibile scegliere
uno dei due bit da cambiare in n+m modi diversi ed il secondo di conseguenza in n+m-1
modi diversi: ma delle (n+m)(n+m-1) possibili combinazioni di scelte non sono distinguibili
quelle nelle quali la scelta cade sugli stessi due bit e quindi il prodotto va diviso per 2.
Il numero m di bit di controllo necessario per correggere 2 errori in un dato di n bit è dato
dalla seguente disequazione:
2n+m >= 2n * [1+n+m+(n+m)(n+m-1)/2] ⇒ 2m >= 1+n+m+(n+m)(n+m-1)/2

Se, per es., si ha n=4, occorrono m bit in modo tale che


2m >= 1+4+m+(4+m)(3+m)/2=5+m+(12+7m+m2)/2=(22+9m+m2)/2
da cui si ricava m=6.

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

Capitolo 3 3.20
Dispense di CALCOLATORI ELETTRONICI 1

Utilizzazione dei bit di controllo


In corrispondenza di ognuna delle alternative prescelte occorre stabilire come utilizzare gli m
bit di controllo per procedere alla rilevazione o correzione. Si esamineranno i due casi della
correzione di errore singolo e della correzione di errore singolo unitamente alla rilevazione di
errore doppio.
1. Correzione di un errore
Con gli m bit di controllo si vuole individuare un vettore di correzione e il cui valore segnali
la posizione in cui è avvenuto l’errore ovvero, con il valore 0, il fatto che non si e’ verificato
errore. Supponendo di non confinare i bit di controllo in fondo al dato trasmesso, bensì di
distribuirli inframmezzandoli ai bit di informazione, in modo tale che risultino indipendenti
tra loro, si puo’ ricorrere al seguente schema:

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 ...
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:

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

Capitolo 3 3.21
Dispense di CALCOLATORI ELETTRONICI 1

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

per cui si invierebbe il dato:


c c x c x x x
0 1 1 2 2 3 4
0 0 1 1 0 0 1

All’atto della ricezione si calcolano gli elementi del vettore e.


Se il codice complessivo ricevuto non presenta errori si ottiene:
e0 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0
e1 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0
e2 = 1 ⊕ 0 ⊕ 0 ⊕ 1 = 0
e dato che il valore del vettore e e’ nullo si conclude che il dato ricevuto è corretto.

Se invece avessimo ricevuto la sequenza:


c c x c x x x
0 1 1 2 2 3 4
0 0 0 1 0 0 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

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.

2. Rilevamento di due errori e correzione di uno


Capitolo 3 3.22
Dispense di CALCOLATORI ELETTRONICI 1

Come spiegato in precedenza, occorre aggiungere un bit di parità pari che controlli tutti i bit:
P = y1 ⊕ y2 ⊕ y3 ⊕ y4 ⊕ … ⊕ y n + m

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’.

3.9 - SUPPORTI MAGNETICI PER LA MEMORIA: DISCHI


Consistono di un supporto più o meno rigido ricoperto da un sottile strato di materiale
ferromagnetico, in genere un ossido; l’informazione è memorizzata per mezzo di una testina
mobile che e’ in grado di cambiare il verso di magnetizzazione di parti della superficie dette
domini.

Testina di
scrittura

Traccia

Settore

Figura 3-24. Organizzazione fisica di un disco

La memorizzazione e’ non volatile (non si perde il contenuto se si toglie l’alimentazione


all’unita’); in alcuni casi (per esempio per i floppy disk) il supporto e’ amovibile.
La circonferenza su cui si scrive, tenendo ferma la posizione della testina di scrittura, è
detta traccia ed è divisa in settori (fig. 3-24). Il settore è la quantità minima di traccia
coinvolta in una operazione di scrittura o lettura sul disco. Si noti che non esiste una
Capitolo 3 3.23
Dispense di CALCOLATORI ELETTRONICI 1

posizione assegnata ad un particolare byte, nel senso che la sua posizione è relativa ai byte
adiacenti e non alla posizione assoluta sul disco.

La traccia linearizzata si presenta come in fig. 3-25, supponendo che la traccia scorra sotto
la testina nel verso indicato dalla freccia.

← GAP GAP GAP

HEADER DATI HEADER DATI

Figura 3-25. Traccia linearizzata

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.

Se il disco ha velocità di rotazione costante, la temporizzazione dei segnali di scrittura e


lettura è la stessa indipendentemente dalla traccia. Dato che esiste una dimensione minima
da utilizzare per ogni bit (quella del dominio), il massimo numero di bit registrabile su di
una traccia e’ quello registrabile sulla traccia piu’ interna, la piu’ corta. Quanto più si va
all’interno del disco, tanto piu’ aumenta il numero di tracce a disposizione ma diminuisce il
numero di bit per traccia. Di conseguenza i dischi usano normalmente una fascia
abbastanza stretta della superficie.
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 notevolmente la
circuiteria di controllo.

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.
l
Rilevazione
Preambolo # traccia di errori

Sync # settore

Figura 3-26. Formato dell’header


Capitolo 3 3.24
Dispense di CALCOLATORI ELETTRONICI 1

• Il Preambolo è costituito da una sequenza regolare di impulsi che non portano


informazione ma servono solo per sincronizzare la lettura del disco.

• 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.

• # Traccia e # Settore contengono le informazioni relative al dato che segue l’ header.

• 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.

La struttura di un blocco di dati e’ solitamente quella riportata in fig. 3-27 e comprende le


parti Preambolo, Sync, Dati e Rilevazione di errori, con funzioni analoghe (a parte
ovviamente la Dati) a quelle dell’header.

Preambolo DATI

Sync Rilevazione
di errori

Figura 3-27. Struttura di un blocco di dati

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.
Capitolo 3 3.25
Dispense di CALCOLATORI ELETTRONICI 1

Il settore in genere ha piccola dimensione per agevolare il trattamento degli errori. Un


settore più grande aumenterebbe la capacità del disco, perché uno stesso header può servire
per settori piccoli o grandi e se il settore e’ grande si diminuirebbe il numero di header e
gap, aumentando lo spazio disponibile; purtroppo tale ottimizzazione dello spazio porterebbe
ad una crescita della probabilità d’errore.

Si supponga ora di voler leggere un file, che utilizza più settori. Dopo aver letto il primo
settore (Settore 1) si ha in un buffer dati sull’interfaccia tra disco ed Mp il contenuto del
Settore 1; finché non si svuota il buffer dati e si trasferiscono i dati del Settore 1 in memoria,
non si può leggere il secondo settore. Quindi se, quando il Settore 2 capita sotto la testina di
lettura, il buffer dati 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

Figura 3-28. Situazione che conduce all’uso dell’interleaving

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

Figura 3-29. Esempio di interleaving

Capitolo 3 3.26
Dispense di CALCOLATORI ELETTRONICI 1

Nelle memorie a supporto magnetico il tempo di accesso non e’ costante ma dipende dalla
posizione sul supporto dell’informazione alla quale si vuole accedere. Esso e’ definito come
l’intervallo di tempo che intercorre tra l’istante in cui si completa la decodifica di una istruzione
che richiede l’uso della memoria a supporto magnetico e l’istante in cui l’informazione richiesta
e’ resa disponibile nella memoria primaria.
In particolare per un disco a testina mobile come quello prima descritto il tempo di accesso
e’ dato dalla formula

Taccesso = Tseek + Tlatenza + Ttrasferimento

dove:
• Tseek (tempo di posizionamento) è 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.
• 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. 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

Taccesso = Tlatenza + Ttrasferimento

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.

3.10 – SUPPORTI MAGNETICI PER LA MEMORIA: NASTRI


Il nastro magnetico utilizza la stessa tecnologia del disco, ossia uno strato di materiale
ferromagnetico depositato su di un supporto, ma il supporto e’ costituito da un nastro
flessibile di materiale plastico.

Le principali caratteristiche funzionali di una memoria a nastro magnetico sono le seguenti:

Capitolo 3 3.27
Dispense di CALCOLATORI ELETTRONICI 1

• accesso di tipo seriale;


• supporto amovibile;
• memorizzazione non volatile (non si perde il contenuto se si toglie l’alimentazione alla
unita’);
• testine fisse.

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.

Per le sue caratteristiche, il nastro magnetico e’ usato come memoria di massa di


archiviazione (fuori linea).

La registrazione sul nastro e’ fatta registrando trasversalmente su di esso, per mezzo di 9


testine, contemporaneamente i nove bit che individuano un carattere (tipicamente gli 8 del
codice ASCII piu’ un bit di controllo di parita’ dispari). Ogni testina registra quindi
l’informazione su di una pista che si estende lungo tutta la lunghezza del nastro che quindi
comprende 9 piste e di conseguenza la densita’ in bit per inch (sulle piste) coincide con la
densita’ in byte per inch. Dato che il nastro e’ normalmente fermo, ogni volta che si deve
compiere una operazione di lettura o scrittura deve essere messo in moto e deve raggiungere
la velocita’ di regime prima di poter procedere all’operazione. Durante il corrispondente
intervallo di tempo la porzione di nastro che scorre sotto le testine resta inutilizzata. Lo
stesso fenomeno si presenta all’arresto del nastro sicche’ le porzioni registrate sono separate
da tratti di nastro non registrati (denominati interrecord gap o semplicemente gap) che
corrispondono ad un arresto ed alla successiva partenza.

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.

Capitolo 3 3.28
Dispense di CALCOLATORI ELETTRONICI 1

Rilevazione Rilevazione
GAP di errori in header di errori nei dati

HEADER DATI GAP

Figura 3-30. Struttura dell’informazione su di un nastro

Nell’impiego dei nastri si fa riferimento alle seguenti entita’:


• record logico
E’ costituito da un insieme di caratteri che definiscono dati collegati tra loro (per es. i
dati anagrafici di una persona)
• file
E’ costituito da un insieme di record logici contenenti informazioni omogenee (per es. i
dati anagrafici dei dipendenti di una azienda)
• record fisico ( o blocco)
E’ costituito da un insieme di record logici che vengono letti o scritti con una sola
operazione. Un record fisico ha una lunghezza tipica da 800 a 8000 byte e, allorche’
viene richiesto un determinato record logico, viene letto il record fisico che lo
contiene: esso viene inserito in un apposito buffer in Mp dal quale viene poi estratto il
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.

L’uso di record fisici di grandi dimensioni origina vantaggi e svantaggi.


Tra i vantaggi si possono ricordare:
- il minor numero di operazioni di I/O (a parita’ di quantita’ di informazione da
trattare);
- il minor spreco di spazio sul nastro per il minor numero di gap;
- la maggiore velocita’ di acquisizione dei dati (se ne interessano molti registrati
sequenzialmente)
e tra gli svantaggi:
- la necessita’ di applicare procedure per raggruppare o separare i record logici che
costituiscono il record fisico;
- l’aumento della probabilita’ di riscontrare errori;
- la possibile sottoutilizzazione delle aree di buffer se si usano poche delle
informazioni presenti in un record fisico.

Si distinguono 2 tipi di nastri:


1. Start- stop
2. Streamer

Capitolo 3 3.29
Dispense di CALCOLATORI ELETTRONICI 1

Lo start-stop è stato creato per memorizzare quantità di informazioni abbastanza piccole,


con arresto tra una memorizzazione e l’altra. Lo start-stop va abbastanza piano, in modo da
sprecare meno supporto (scrive un file, si ferma, riparte, scrive un altro file, si ferma e così
via), a scapito del tempo di accesso.
Lo streamer è stato costruito invece pensando che la fermata e l’avvio siano eventi rari e
viene usato per memorizzare grandi quantita’ di informazioni. Gode di velocità elevata e
presenta migliori prestazioni come tempo di accesso, però si spreca molto supporto ad ogni
fermata (ed e’ per questo che fermate ed avvii devono essere pochi).

Capitolo 3 3.30