Le memorie cache sono memorie di piccola capacità interposte tra processore e memoria principale. Esistono anche memorie cache interposte tra memoria principale e secondaria. Le memorie cache hanno lo scopo di contenere al loro interni una piccola porzione dei dati presenti in memoria principale in modo da garantire una più veloce lettura/scrittura del dato da considerare. Esse si basano su due principi:
• Località temporale, se all’istante t si richiede l’accesso in memoria di una cella è probabile che se ne rifaccia richiesta in un t+D
• Località spaziale, se all’istante t si fa richiesta di accedere ad una cella di memoria x è probabile che in un tempo t+D si faccia richiesta ad una locazione di memoria x+C.
In base a questi due principi è facile osservare come se in memoria cache viene caricato un blocco di memoria di celle contigue è probabile che per un t+D il processore faccia riferimento solo a dati presenti in memoria cache. Con la presenza di una memoria cache con hit radio (h), tempo di accesso (C) e penalità di fallimento (M) il t medio sarà uguale a hC+(1-h)M con h circa 0,9.
Una cache contiene al suo interno un certo numero di linee, ciascuna delle quali contiene un blocco di memoria. Ad ogni linea è associato un tag che indica quale blocco di memoria è presente al suo interno. La cache ha anche al suo interno la logica per verificare se un determinato dato è contenuto in esso e quindi per trasmetterlo alla CPU. La cache unziona così: la CPU invia l’indirizzo, la cache controllo se il dato è al suo interno e in caso di HIT trasmette il dato alla CPU, in caso di MISS carica il dato proveniente dalla memoria principale al suo interno e lo trasmette alla CPU. Una cache può o prima inviare il dato alla CPU e poi caricarlo (load through) o viceversa.
Normalmente la cache fa parte della CPU in modo tale che si interfacci meglio con essa e in questo modo si alleggerisce il carico del BUS, che intanto quindi può compiere altre operazioni. Esistono cache sia per dati che per istruzioni. Se queste due cache sono separate si dice architettura Harvard, se coesistono architettura Von Neumann.
La grandezza di una cache varia da pochi Kb a alcuni Mb, a seconda di quello che devono contenere. Maggiore capacità significa maggiore costo e minore velocità.
Per dare una risposta quasi immediata in caso di search HIT o MISS è necessario utilizzare alcune tecniche e funzioni di mapping. La scansione sequenziale e la memoria associativa sono due strade non percorribili in quanto portano o a tempi di risposta troppo elevati oppure a costi esorbitanti, si procede quindi per altri vie:
• direct mapping: ogni blocco i della memoria principale viene messo in relazione a una cella k della memoria cache secondo la relazione k=i mod n con n = al numero di righe della cache. In questo modo si ha una funzione di mapping molto semplice da implementare ma se due blocchi appartenenti allo stesso blocco all’interno della memoria principale vengono chiamati alternativamente, la cache non funziona.
• associative mapping: ogni blocco della memoria può finire in una qualunque cella della cache. Il meccanismo di ricerca risulta essere molto costoso e difficilmente implementabile.
• set associative mapping: questa tecnica unisce i pro di entrambe le tecniche precedenti: si divide la cache in n blocchi e la memoria principale in i blocchi. In questo modo k=i mod n e poi si esegue una ricerca su poche righe.
Nel caso di set associative mapping e di associative mapping è necessario avere un algoritmo per determinare in caso di MISS quale elemento della cache eliminare. Esistono diversi metodi:
• LRU (Least Recently Used): il più ragionevole
• FIFO (First-In First-Out): il più economico
• LFU (Least Frequently Used): teoricamente il più efficace
• random: il più usato ed efficiente
Ogniqualvolta un dato in memoria principale e contemporaneamente in memoria cache deve essere modificato o rimpiazzato esistono due tecniche per eseguire questa operazione, che se non eseguita porterebbe a una disparità dei due dati:
• write back: per ogni riga della cache esiste un bit (dirty bit) che ha il compito di segnalare se il dato è stato modificato, in questo caso nel momento in cui il dato verrà eliminato dalla cache verrà copiato in memoria principale. Il problema si pone nel caso di sistemi multiprocessori con più memorie cache e anche nel caso di blackout improvvisi è possibile la perdita di dati
• write trough: in questo caso ogni volta che viene modificato un dato nella memoria cache viene immediatamente aggiornato il dato in memoria principale. Questo porta a un ritardo e a una diminuzione delle prestazioni ma il tempo richiesto è tollerabile in quanto le operazioni di scrittura sono molto più rare delle operazioni di lettura. Nel caso di sistemi multiprocessori:
o Bus Watching con Write-through: il controllore di ciascuna cache rileva le operazioni di Write-through sul bus, e invalida (attraverso il bit di validità) le linee corrispondenti nella propria cache;
o Non-cacheable Memory: la memoria condivisa non può essere trasferita nelle cache.
| < Prec. | Succ. > |
|---|






