La memoria cache
nei moderni processori è un’area di memoria
ad accesso veloce (cioè, assai più veloce del tempo
di accesso alla normale memoria). L’uso di tale memoria è
completamente gestito dall’elettronica del processore:
quando un’operazione del processore richiede l’accesso ad un
particolare indirizzo nella memoria, viene trasferito dalla memoria
alla cache un blocco
di locazioni contigue a quella richiesta. Le successive richieste di
accesso alla memoria hanno quindi buona probabilità di trovare il dato
già presente nella cache e quindi di ottenerlo ad una velocità
superiore a quella che sarebbe necessaria ad accedere alla memoria
“normale”.
Naturalmente quando una richiesta si riferisce ad un indirizzo che non
si trova
nella cache occorre ripetere un trasferimento, a velocità più
bassa, dalla memoria alla cache (o viceversa in caso di scrittura).
La ragione dell’uso di questa tecnica risiede in una caratteristica
costruttiva dei circuiti elettronici, ovvero che le memorie più veloci
hanno dimensioni fisiche maggiori e consumano maggior quantità
di energia. Per questo motivo non è possibile usare la
tecnologia “veloce” per tutta la memoria ed è stato sviluppato
il meccanismo della cache.
Il principio descritto è stato poi esteso, sempre per lo stesso
motivo, a due livelli. In questo modo molte moderne CPU sono dotate di una
cache di livello 1 (L1) solitamente realizzata nello stesso chip
che contiene il processore, di piccole dimensioni (fino a 128 KBytes)
ed una cache di livello 2 (L2),
di dimensioni maggiori (fino ad 1 Mbyte),
talvolta anch’essa intergrata
nel processore, altre volte realizzata con un circuito
esterno.
La cache di secondo livello ha una velocità intermedia
fra la cache L1 e la memoria normale.
Anche quando entrambi i livelli di cache sono integrati nel processore
nell’ottimizzazione del progetto rimane il problema della scelta
del giusto compromesso fra la quantità di memoria implementabile
e la sua velocità. La soluzione di utilizzare due
diverse implementazioni, cioè due livelli, consente
di ottenere una architettura più flessibile
che fornisce le prestazioni massime
ai programmi per i quali è sufficiente una piccola cache
e prestazioni più contenute, ma ancora migliori di quelle ottenibili
nell’accesso alla memoria normale, ai programmi che richiedono
dimensioni maggiori della cache.
Se fosse possibile stabilire a priori che un certo processore sarà
usato solo per una certa classe di programmi, sarebbe probabilmente
più conveniente utilizzare solo il tipo di cache più
adatto. Ma quresto è ovviamente impossibile nella gran maggioranza dei casi.