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