Memoria Cache - home page luca orrù

Transcript

Memoria Cache - home page luca orrù
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Lezione n.14
La memoria cache
Sommario:
•
•
•
•
Politiche di sostituzione
Memoria cache
Mapping degli indirizzi (modo in cui i dati sono memorizzati nella cache)
Capacità e prestazioni
1
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Questa lezione conclude la prima parte del corso.
Politiche di sostituzione
Cosa s’intende per politica di sostituzione?
Per descriverla consideriamo il seguente problema.
Supponiamo di dover eseguire un programma. Al procedere del programma la
memoria di primo livello M1, che fa parte di una gerarchia di memoria, si è riempita.
Dobbiamo eliminare/sostituire un blocco di dati già presente nella memoria M1 per
poter inserire un nuovo blocco di dati. Questa scelta del blocco da sostituire va fatta
individuando alcune politiche di sostituzione in modo da effettuare al meglio questa
sostituzione, vale a dire raggiungere l’obiettivo di minimizzare il numero degli
insuccessi (miss).
Quindi:
Obiettivo: minimizzare il numero di insuccessi cioè di miss (memory fault nelle
memorie virtuali).
Il tasso di successo (H), che vogliamo rendere massimo, assume valore massimo se si
rende massimo l’intervallo tra due fault successivi. Si vuole, cioè, rendere più rari
possibili i fault, vale a dire la distanza tra due fault consecutivi deve essere la più
grande possibile. Una soluzione è usare una strategia di sostituzione ottima: questa
soluzione esiste ma è impossibile da mettere in pratica; è impraticabile.
Vediamo comunque come funziona.
Politica di sostituzione ottima
Ipotesi: la memoria M1 è divisa in pagine.
All’instante ti determinare, per ogni pagina Kj quando (istante tj) la pagina stessa
verrà richiesta. Scegliere j per cui (tj-ti) risulti massimo. Siamo all’istante ti : per
scegliere la pagina da eliminare sceglieremo l’istante tj in modo che (tj-ti) sia
massimo, vale a dire che sceglieremo quella pagina che verrà utilizzata più lontano
nel tempo.
Questa tecnica richiede la conoscenza di quando ogni pagina verrà nuovamente
richiesta, cioè si deve conoscere il futuro. Poiché questo per i calcolatori non è
possibile dovremmo eseguire più passi:
• Eseguire il programma per ricavare le richieste di accesso
• Precalcolare le sostituzioni ottime
• Eseguire il programma con la sequenza ottima di sostituzione
2
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Questa è una soluzione impraticabile poiché l’identificazione della strategia ottima
richiede l’esecuzione preventiva del programma.
Si usano allora altre politiche di sostituzione che cercano di avvicinarsi alla politica
ottima sfruttando l’unica conoscenza che si ha sul comportamento del sistema,vale a
dire il principio di località. La prima politica che possiamo usare è la politica FIFO
mentre la seconda è la politica LRU.
FIFO (First-In-First-Out)
• Si associa al blocco un numero di sequenza in modo che quando il blocco entra
viene marcato.
• Si sostituisce poi il blocco introdotto meno recentemente. Grazie al principio di
località in questo modo diminuiscono le probabilità che questo blocco o meglio
i dati del blocco vengano richiesti.
LRU (Least Recently Used)
• Si controllano tutti i blocchi e si sostituisce il blocco che da più tempo non è
utilizzato.
Vediamo un esempio per chiarire le diverse politiche di sostituzione
Politica ottima
Tempo t
Pagina richiesta
o blocco
Ipotesi:Memoria
M1 con solo 3
pagine
1
2
3
4
5
6
7
8
9
10 11 12
I numeri sottostanti fanno riferimento alle pagine della memoria
M2, cioè sono le pagine richieste alla memoria M2
2
3
2
1
5
2
4
5
3
2
5
2
2
2
3
2
3
H
2
3
1
2
3
5
2
3
5
H
4
3
5
4
3
5
H
4
3
5
H
2
3
5
2
3
5
H
2
3
5
H
H= successo; si ha successo quando la richiesta del blocco viene soddisfatta dalla
memoria M1 (caselle verdi)
Supponiamo di avere una memoria M1 con 3 sole pagine memorizzabili.
Descrizione:
Al tempo t=1 viene richiesto il blocco 2 alla memoria M1. Questo blocco non è
presente in M1, quindi viene prelevato dalla memoria M2 e caricato in M1.
3
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Al tempo t=2 viene richiesto alla memoria M1 il blocco 3 e poiché non è presente in
M1 viene preso da M2 e caricato in M1.
Al tempo t=3 viene richiesto il blocco 2 che essendo già in memoria M1 ci dà un
successo (H=healt).
Al tempo t=4 viene richiesto il blocco 1 che non essendo presente in M1 viene preso
da M2 e caricato in M1.
Al tempo t=5 viene richiesto il blocco 5 e poiché questo non è presente in M1 ed
inoltre la M1 è piena, dovrà essere sostituito un blocco di M1 per poter caricare il
blocco 5 che verrà prelevato da M2. Al tempo t=5 i blocchi presenti in M1 sono 2, 3,
1; quale blocco verrà sostituito per far posto al blocco 5? Si sostituisce il blocco 1 con
il 5 poiché il blocco 1, rispetto ai blocchi 2 e 3 è quello che nella sequenza temporale,
istanti da t=5 a t=12 non verrà più usato. In pratica 1 è il blocco che verrà usato più
lontano nel tempo.
Al tempo t=6 viene richiesto il blocco 2 e si ha quindi un successo perché questo è
presente in M1.
Al tempo t=7 il blocco 4 non è presente in memoria M1 e quindi per inserirlo occorre
togliere un blocco da M1. Tra i blocchi 2, 3 , 5 presenti in M1 verrà sostituito con il 4
il blocco che verrà usato più lontano nel tempo e cioè il blocco 2 che verrà usato in
t=10 mentre il 3 viene richiesto in t=9.
Il procedimento continua allo stesso modo fino a t=12.
Questa è la politica che richiede la conoscenza del futuro ed è quindi inutilizzabile.
Politica FIFO
Tempo t
Pagina richiesta
o blocco
Ipotesi:Memoria
M1 con solo 3
pagine
1
2
3
4
5
6
7
8
9
10 11 12
I numeri sottostanti fanno riferimento alle pagine della memoria
M2, cioè sono le pagine richieste alla memoria M2
2
3
2
1
5
2
4
5
3
2
5
2
2
2
3
2
3
H
2
3
1
5
3
1
5
2
1
5
2
4
5
2
4
H
3
2
4
3
2
4
H
3
5
4
3
5
2
In rosso sono segnate le pagine che sono da più tempo in memoria, che in caso di
memoria piena saranno quelle da sostituire.
Descrizione:
Al tempo t=1 viene richiesta la pagina 2 e poiché la memoria è vuota, la pagina viene
presa dalla memoria M2 e posta in M1;
Al tempo t=2 viene richiesta e inserita la pagina 3;
4
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Al tempo t=3 viene nuovamente richiesta la pagina 2 che essendo presente in M1
fornisce un successo (Hit);
Al tempo t=4 viene richiesta e inserita in M1 la pagina 1;
Al tempo t=5 viene richiesta la pagina 5 ed essendo la memoria M1 piena una delle
pagine tra quelle presenti in M1 deve essere sostituita; verrà sostituita la pagina che
da più tempo è presente in memoria che nell’esempio è la pagina 2.
Al tempo t=6 viene richiesta la pagina 2; la memoria è piena, quindi deve uscire una
pagina già presente e precisamente la pagina 3 perché è quella che da più tempo è
residente in memoria. Il procedimento continua allo stesso modo fino al tempo t=12.
Politica LRU
Tempo t
Pagina richiesta
o blocco
Ipotesi:Memoria
M1 con solo 3
pagine
1
2
3
4
5
6
7
8
9
10 11 12
I numeri sottostanti fanno riferimento alle pagine della memoria
M2, cioè sono le pagine richieste alla memoria M2
2
3
2
1
5
2
4
5
3
2
5
2
2
2
3
2
3
H
2
3
1
2
5
1
2
5
1
H
2
5
4
2
5
4
H
3
5
4
3
5
2
3
5
2
H
3
5
2
H
In rosso sono indicati i blocchi che da più tempo sono inutilizzati. La cella verde
indica che la richiesta del blocco ha successo (hit).
Descrizione:
Al tempo t=1 è richiesto il blocco 2 che non essendo presente in memoria viene
prelevato da M2 e posto in M1.
Al tempo t=2 viene inserito il blocco 3 e il blocco 2 diventa il più vecchio (quello che
da più tempo è inutilizzato.
Al tempo t=3 viene richiesto il blocco 2; il blocco è presente in M1 quindi si ha un
hit; il blocco 3 diventa il più vecchio.
Al tempo t=4 viene inserito il blocco 1.
Al tempo t=5 si richiede il blocco 5 che non è presente in M1; poiché la M1 è piena
deve uscire un blocco già presente per far posto al blocco 5; tra i blocchi 2, 3 ,1 uscirà
il blocco 3 perché è quello che da più tempo non è utilizzato.
Al tempo t=6 viene richiesto il blocco 2 che essendo presente in M1 genera un hit. Il
blocco 1 diventa quello che da più tempo è inutilizzato, quindi al tempo t=7 quando
deve essere inserito il blocco 4 per fargli posto uscirà il blocco 1.
Il procedimento continua allo stesso modo fino al tempo t=12.
5
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Queste sono le tecniche usate per sostituire i blocchi di memoria quando questa (la
memoria M1) è completamente piena.
Passiamo ora alla descrizione della seconda gerarchia di memoria, costituita dalla
memoria principale e dalla memoria cache.
Memoria Cache
La cache è una memoria veloce e di piccole dimensioni posta tra la CPU e la
memoria principale. Il tempo d’accesso a questa memoria è intermedio tra il tempo
d’accesso alla memoria principale, che è dell’ordine delle decine di nanosecondi, e il
tempo di ciclo della CPU, che è invece dell’ordine dei nanosecondi. Questo significa
che il tempo d’accesso della cache è di qualche nanosecondo.
CPU
cache
Memoria
principale
• La cache è realizzata in tecnologia VLSI di tipo statico ed è per questo motivo
più costosa rispetto alle altre tipologie di memoria, ma ha tempi d’accesso
inferiori.
• La cache e la memoria principale formano una gerarchia di memoria
• Le prestazioni della memoria cache dipendono anche dalla sua posizione
rispetto alla CPU
• In riferimento alla sua collocazione fisica, possiamo avere:
o Cache sulla stessa scheda in cui è allocata la CPU, ma su un circuito
integrato diverso, cioè cache su scheda.
o Cache sullo stesso chip della CPU cioè cache su chip. Questa è la
soluzione usata attualmente.
In realtà i sistemi attuali impiegano più livelli di cache a cui viene dato il nome di
cache di primo livello (L1) e cache di secondo livello (L2).
Vi saranno quindi due tipi di memoria cache:
1. cache sullo stesso chip della CPU (in questo caso la cache è più veloce ma più
piccola)
2. cache sulla scheda (in questo caso la cache ha dimensioni maggiori ma è più
lenta)
6
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Riepilogando si può dire che la presenza di una memoria cache sullo stesso chip del
processore rappresenta la soluzione che garantisce la maggiore efficienza in termini
di tempi d’accesso. Nei sistemi recenti sono presenti entrambe le soluzioni (cache su
processore e cache di maggiori dimensioni sulla scheda).
Facciamo ora un confronto tra le due gerarchie di memoria viste finora ( la gerarchia
formata dalla memoria cache e dalla memoria principale e la gerarchia formata dalla
memoria principale e dalla memoria secondaria ).
Abbiamo nel nostro sistema tre livelli di memoria (cache, memoria principale,
memoria secondaria) che sono gestiti come due gerarchie a due livelli.
CACHE
Memoria principale
Seconda
gerarchia
Memoria
secondaria
Prima
gerarchia
Confrontiamo le due gerarchie in termini di tempi di accesso.
Gerarchia
Rapporto tempi di
accesso
Gestione
Dimensione pagina
Accesso dalla CPU al
secondo livello della
gerarchia
Cache-Memoria
principale
5/1
(tempo accesso cache =
(1/5) tempo d’accesso
mem.principale
Hardware
4-128 bytes (dimensione
pagina di cache)
Diretto (la CPU accede
sia alla cache che alla
memoria principale in
modo diretto)
Memoria principaleMemoria secondaria
1000/1(tempo d’accesso
memoria principale circa 10-20
nsec) (tempo d’accesso memoria
secondaria circa 10 msec)
Software (legata al sistema
operativo)
64-4096 bytes (dimensione
pagina mem.principale)
Sempre tramite primo livello,
ossia la CPU accede al
secondo livello (memoria
secondaria) sempre
attraverso il primo livello
7
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Dati nella cache
I dati vengono memorizzati in pagine di cache (dette linee di cache). Ciascuna linea
di cache è individuata dalla prima parte dell’indirizzo fisico generato dalla CPU.
Questa parte dell’indirizzo fisico che caratterizza la pagina di cache viene chiamata
tag.
Indirizzo fisico generato
dalla CPU
Figura 1
Indirizzo di pagina di
cache o tag
Offset di 5 bit
I 5 bit di destra definiscono l’offset all’interno della pagina di cache. In questo
esempio l’offset di 5 bit consente di indirizzare 25 =32 byte, cioè abbiamo pagine di
cache di 32 byte.
Organizzazione della cache
TAG
Pagine di dati (linee)
Logica di
accesso alla
cache
M
E
M
O
R
I
A
Indirizzo
fisico
C
P
U
dati
Controllo
indirizzi
Confronto indirizzi
Gestione dati
Matrice
di
memoria
cache
Selezione dati
P
R
I
N
C
I
P
A
L
E
8
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Ogni linea di cache (pagina di cache) è divisa in due campi: il secondo campo
contiene un blocco di memoria principale, parola per parola (o byte per byte). Nello
schema grafico precedente i byte di ogni pagina di cache sono rappresentati dai
quadratini bianchi presenti in ciascuna linea (linea di cache). Il primo campo di
ciascuna linea di cache è il campo tag o indirizzo che permette di identificare il
blocco di memoria presente nella specifica linea di cache in quel momento.
Diamo ora una descrizione del funzionamento.
Quando la CPU genera l’indirizzo fisico, la cui forma è rappresentata in figura 1,
viene confrontato il suo campo tag con tutti i tag presenti nella cache, per vedere se la
pagina (blocco) di memoria principale è già presente nella cache stessa. Se questo
confronto da esito positivo, allora viene utilizzata la seconda parte dell’indirizzo
fisico per individuare quale byte (parola) della pagina la CPU ha richiesto.
Esempio:
TAG
Pagine di dati divise in byte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1
2
3
4
5
6
7
Supponiamo che il tag 4 (quello segnato in verde nella colonna tag) sia il tag
individuato a partire dall’indirizzo generato dalla CPU. A questo punto viene
sfruttato il secondo campo dell’indirizzo fisico, che indica per esempio che il byte da
prelevare nella linea di cache individuata dal campo tag è il sesto. Viene quindi
prelevato il byte 6 dalla linea 4 di cache e inviato alla CPU tramite i blocchi di
selezione dati e gestione dati. Questo è un esempio di acceso positivo alla cache
positivo, cioè siamo nel caso di hit. Può succedere però che il tag associato
all’indirizzo fisico non abbia una corrispondenza tra i tag memorizzati nella cache e
quindi si verifica un miss. In questo caso occorre caricare nella cache, dalla memoria
secondaria, la pagina che contiene il dato richiesto dalla CPU. La cache risponderà
alla CPU solo dopo aver caricato il dato richiesto. Alcune cache aventi un hardware
più complesso sono in grado di rispondere subito alla CPU, fornendogli direttamente
il byte richiesto proveniente dalla memoria e poi caricano la pagina o blocco della
memoria che contiene il dato richiesto. In tal modo l’operazione risulta molto più
veloce a scapito però di un hardware molto più costoso.
Riepilogando abbiamo il seguente ciclo di operazioni
9
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Ciclo di operazioni
• un indirizzo fisico viene inviato dalla CPU
• la cache confronta la parte più significativa dell’indirizzo (campo tag) con i
propri campi tag
• se vi è un hit (successo) viene completato il ciclo, ossia si va a caricare il byte
specificato dalla seconda parte dell’indirizzo fisico (parte meno significativa)
nella CPU
• Se questo non succede, cioè si verifica un miss (insuccesso), significa che la
pagina richiesta non è ancora presente nella cache. Allora si ricava il dato dalla
memoria principale, che viene inviato alla CPU, ed il blocco a cui il dato
appartiene va inserito nella cache al posto di una pagina già presente
utilizzando una delle politiche di sostituzione viste (LRU, FIFO etc).
• La politica di sostituzione ha gli stessi problemi di quella della memoria
virtuale (dove viene allocato il dato/byte ?)
Problemi specifici
• Come sono organizzati nella memoria cache i dati provenienti dalla memoria
principale?
o Questo è un problema perché occorre riconoscere molto rapidamente
(tempo dell’ordine dei nsec) se il dato richiesto dalla CPU è presente o
meno nella cache. Quindi non si possono fare delle complesse ricerche
sulla cache, ma bisogna avere dei meccanismi di ricerca che permettano
rapidamente di verificare se quel tag è presente o meno.
• Un altro problema è quello dell’aggiornamento della cache. Quando la cpu
modifica un dato nella cache, come viene aggiornata la memoria principale? Ci
si trova in pratica nella seguente situazione: quando la CPU effettua nella
cache una operazione di scrittura di una parola e quindi del blocco che la
contiene, si hanno due rappresentazioni diverse del dato:
Una rappresentazione all’interno della cache, che è stata
modificata dalla CPU
Una rappresentazione, non aggiornata, nella memoria principale
• Ci si chiede quindi quando avviene l’allineamento delle due rappresentazioni
Vediamo di rispondere al primo quesito e cioè come è organizzata la memoria cache.
10
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Organizzazione della cache
Esistono tre diverse organizzazioni dei dati all’interno della cache
o Completamente associativa
o Accesso diretto
o Tecniche miste (set-associative): sfrutta i vantaggi delle due tecniche
precedenti ed è la tecnica usata attualmente
Cache completamente associativa
Il tag viene utilizzato come chiave di lettura. Per evitare una ricerca sequenziale del
tag di blocco all’interno della cache, viene effettuta una ricerca cosiddetta associativa
che in pratica consente, tramite un hardware speciale, di confrontare simultaneamente
il tag specificato dall’indirizzo fisico con tutti i tag presenti nelle varie di linee di
cache. Questo rende più costosa la cache. Contrariamente alle memorie normali i
costi delle memorie associative crescono non in maniera lineare con le dimensioni,
ma con il quadrato delle dimensioni. Per questo motivo non si può pensare di avere
cache molto grandi gestite con tecniche associative.
L’indirizzo generato dalla CPU viene scomposto dalla cache in due parti: tag e
parola.
Etichetta o tag
Identifica il blocco
di memoria
Parola o byte
Identifica la parola
all’interno del
blocco
Cache ad accesso diretto
La memoria cache M1 è suddivisa in S1=2k pagine o linee di n parole. Esempio
2k=128 e n=16 parole.
La memoria principale M2 è suddivisa in S2 regioni di uguale dimensione ( stesso
numero di parole: n parole) con S2>>S1. Esempio S2=4K=4096 pagine, da 16 parole.
Indichiamo le S1 pagine di cache con:
M1(1), M1(2), M1(3),……..M1(S1) pagine in cache
Indichiamo le S2 pagine di memoria principale con:
M2(1), M2(2), M2(3),……..M2(S1) …..,M2(S2) pagine in memoria principale.
11
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Il meccanismo con cui avviene il posizionamento, chiamato meccanismo di mapping,
delle pagine della memoria principale nella cache è il seguente:
M2(j)------>M1(i) con l’indice i = j (mod S1)
o mod indica il resto della divisione tra j e S1
o M2(j)------>M1(i) indica che la pagina di memoria principale di indice j va a
finire nella pagina di cache di indice i calcolato con la formula precedente
Esempio: consideriamo una cache con due sole pagine cioè S1=2
La memoria principale ha per esempio S2=8 pagine
Graficamente abbiamo la seguente situazione
M2(0)
M2(1)
M2(2)
M1(0)
M2(3)
M2(4)
M2(5)
M1(1)
Memoria
cache
M2(6)
M2(7)
Memoria
principale
In questo caso tutte le pagine della memoria principale che hanno un indice pari
vanno a finire nella posizione 0 della cache, in quanto se S1=2 allora l’indice i
associato alla pagine j=0 diventa :
i=j mod 2=0
Analogamente le pagine j=2, j=4,j=6 restituiscono un indice i=0
Tutte le pagine della memoria M1 che hanno indice dispari vanno a finire in M1(1).
Questo significa che se la cache è organizzata in questo modo, quando la CPU genera
un indirizzo di un blocco pari, la cache cercherà solo nella posizione M1(0), usando
quindi un unico confronto tra il tag associato all’indirizzo fisico e il tag della pagina
di cache M1(0). Non andrà infatti a cercare anche nella posizione M1(1).
12
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Questa tecnica ha una limitazione: se si deve spostare nella cache due pagine pari
questo non è possibile farlo, in quanto si ha un solo posto per le pagine pari
disponibile nella cache e quindi si deve fare una sostituzione del vecchio blocco con
il nuovo blocco.
Altro esempio:
o cache con 128 blocchi, quindi S1=128, da 16 parole
o memoria principale indirizzata da 16 bit, ossia contiene 216 parole vale a dire
65536 parole = 64K parole. Il numero di blocchi che costituiscono la memoria
principale è quindi dato da:
o S2=(64K parole/16 parole)=4096 blocchi da 16 parole
Allora i blocchi 0-128-256-512-1024-----4096 della memoria principale, saranno
caricati nel blocco M1(0) della cache.
I blocchi 1-129-257-513-1025 etc saranno caricati nel blocco M1(1)
I blocchi 2-130-258-514-1026 saranno caricati nel blocco M1(2) e cosi via.
Quindi ad ogni blocco della cache corrispondono più blocchi della memoria
principale. Si verifica un conflitto. Si pensi al caso di un programma, le cui istruzioni
iniziano al blocco 1 e poi a causa di un salto le istruzioni continuano nel blocco 129.
Per poter eseguire il programma entrambe i blocchi 1 e 129 devono essere trasferiti in
cache, ma questo non è possibile perché solo un blocco può essere messo nel blocco
1 della cache. La posizione di un blocco nella cache è determinata dall’indirizzo di
memoria.
In questo tipo di organizzazione l’indirizzo generato dalla CPU viene scomposto
dalla cache in tre campi: tag, blocco , parola.
Etichetta o tag
blocco
Identifica il blocco di memoria.
E’ il campo sul quale la cache
esegue il controllo
Identifica la linea
di cache
Parola o byte
Identifica la parola
all’interno del
blocco
Cache Set Associative
Consiste nella presenza di gruppi di pagine nella cache, vale a dire:
o Le linee di cache sono suddivise in gruppi
o Ogni gruppo può ospitare blocchi della memoria principale individuati secondo
la tecnica di accesso diretto (i= j mod S1)
o All’interno di ogni gruppo facente parte di una linea di cache, la pagina/blocco
viene individuata in modo associativo
13
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Esempio:
M2(0)
M2(1)
M2(2)
Set
M1(0)
Blocco 1
M2(3)
M2(4)
M2(5)
M2(6)
Blocco 2
Set
M1(1)
Blocco 1
Blocco 2
M2(7)
Memoria
principale
Memoria
cache
Due posti per le
pagine pari e due
posti per le
pagine dispari.
Viene effettuata
una ricerca
associativa su un
numero ridotto di
blocchi
Ora nella cache si possono memorizzare contemporaneamente il blocco M2(0) e il
blocco M2(2) della memoria principale, mentre prima con la tecnica ad acceso diretto
non era possibile (nonnnnn èèè possibile: do la disdetta eeeh; non scherzo eeeh).
Ora la ricerca della pagina e quindi del dato all’interno della coppia di blocchi M2(0)
e M2(2) avviene in modo associativo.
Vantaggi: riduzione della dimensione della ricerca associativa. Nel nostro esempio la
ricerca associativa viene fatta su due sole pagine di cache è quindi è più efficace.
Anche in questa organizzazione l’indirizzo generato dalla CPU è diviso in tre campi:
tag, blocco, parola.
Etichetta o tag
Identifica il blocco di memoria.
E’ il campo sul quale la cache
esegue il controllo
blocco
Identifica l’insieme di linee
di cache cioè il gruppo nel
quale la linea può essere
immagazzinata
Parola o byte
Identifica la parola
all’interno del
blocco o linea
Esempio:
Cache VAX 11/780
• Memoria cache con capacità di 8KB
• Ogni linea di cache contiene 8 bytes
• Viene usata una tecnica di tipo set-associative con 512 gruppi di 2 linee
ciascuno
14
CALCOLATORI ELETTRONICI
A cura di Luca Orrù
Si hanno quindi 1024 linee x 8bytes= 8KB
L’indirizzo generato dalla CPU è a 32 bit ed è organizzato nel seguente modo:
• 9 bit (dal 20 al 28) per identificare uno dei 512 gruppi
• 20 bit (da 0 a 19) di tag che permettono d’identificare la linea di cache
all’interno del gruppo e che vengono quindi confrontati con il campo tag
associato ad ogni linea di cache.
• se la linea è presente vengono poi usati gli altri 3 bit (da 29 a 31) per
identificare il byte all’interno della linea
Rispondiamo ora alla domanda sull’aggiornamento della memoria principale.
Scrittura nella cache e aggiornamento della memoria
principale
Finora si è solo considerato il caso di lettura di un dato dalla cache.
Cosa succede invece in un operazione di scrittura nella cache? Quando la CPU scrive
sulla memoria cache si genera una discrepanza fra il valore del dato presente nella
memoria principale e il dato nella cache. Per risolvere questo problema si possono
usare due meccanismi:
• Write back o Copy back (copia all’indietro): la tecnica consiste
nell’aggiornare solo la pagina di cache, senza modificare la pagina in memoria
principale. Affinché la pagina possa essere riconosciuta come aggiornata
rispetto alla corrispondente pagina della memoria principale un bit opportuno
chiamato dirty bit viene posto a 1. Queste pagine segnate, sono candidate ad
essere riscritte nella memoria principale quando avviene una loro sostituzione
nella memoria cache. Ossia nel momento in cui il blocco marcato deve essere
sostituito per far posto ad un nuovo blocco, la pagina di memoria principale
viene aggiornata con la copia aggiornata presente nella memoria cache.
• Write-through (scrittura in avanti): quando viene effettuata una operazione
di scrittura nella cache viene effettuata contemporaneamente anche la scrittura
nella memoria principale. Quindi la pagina di cache e la pagina della memoria
principale vengono aggiornate contemporaneamente. In tal modo si assicura
che gli elementi della cache siano sempre uguali ai corrispondenti elementi
della memoria principale. Si può in questo caso pensare che le prestazioni della
macchina né risentano profondamente in quanto si stanno eseguendo degli
accessi in memoria. In realtà questo non è vero poiché le operazioni di scrittura
in un programma sono in numero molto inferiore alle operazioni di lettura
(1/10).
15