vuoi
o PayPal
tutte le volte che vuoi
GESTIONE DELLE MISS DELLA CACHE
L’unità di controllo deve riconoscere il fallimaneto del tentativo di accesso e provvedere a risolverlo
andando a prelevare i dati dalla memoria principale, opppure da una cache di livello inferiore.
Modificare l’unità di controllo del processore per gestire una hit è un’operazione semplice. La gestione
delle miss, invece, richiede del lavoro aggiuntvo e un’unità di controllo separata che collabora con il
processore. Questa si occupa dell’accesso in memoria principale.
La risoluzione di una miss richiede lo stallo della pipeline che è differente da un interrupt, che
implicherebbe il salvataggio dello stato dei registri.
Riassumendo i passi che devono essere eseguiti quando si verifica una miss nella cache sono:
⚫ Inviare il valore originale del PC (corrente-4) alla memoria;
⚫ Comandare alla memoria principale di eseguire un’operazione di lettura ed
attendere che questa venga completata;
⚫ Scrivere la parola che proviene dalla memoria nella posizione opportuna del
blocco della cache, aggiornare il tempo tag corrispondente e impostare il
validity bit ad 1;
⚫ Far ripartire l’esecuzione dell’istruzione dallo stato di fetch che questa volta
troverà l’istruzione all’interno della cache.
GESTIONE DELLA SCRITTURA. 3
Se supponiamo che un’operazione di store scriva il dato solamente nella cache, e che quindi la
locazione nella memoria principale che è associata a quella locazione della cache avrebbe un valore
diverso. Facendo così avremmo che cache e memoria di inferiore livello sono dette incoerenti.
Per evitare questa incoerenza possiamo applicare due metodi per gestire la scrittura all’interno della
cache: ⚫ WRITE-THROUGH. Scriviamo il dato sempre sia nella memoria cache che in quella
principale. L’altro elemento fondamentale è la gestione dei miss nel processo di
scrittura. Per prima cosa dobbiamo caricare dalla memoria principale le parole
appartenenti al blocco interessato. Dopo aver caricato il blocco e averlo scritto
nella cache, possiamo sovrascrivere la parola del blocco che aveva causato la miss.
Questa memoria viene scritta anche in memoria principale utilizzando il suo
indirizzo completo. In generale questo tipo di scrittura non offre grandi
prestazioni dal momento che la parola viene ripetutamente scritta all’interno, sia
della cache che della memoria principale. Questo problema possiamo risolverlo
tramite quello che viene chiamato Buffer di scrittura. Esso memorizza i dati in
attesa che essi vengano scritti in memoria: dopo aver salvato il dato nella cache e
nel buffer di scrittura, il processore può proseguire l’esecuzione. Una volta
completata la scrittura di un dato nella memoria principale, il corrispondente
spazio di scrittura del buffer viene liberato. N el caso in cui il buffer è full ed il
processore deve eseguire un’operazione di scrittura, esso sarà messo in stallo fino
alla liberazione di un posto nel buffer. Ovviamente il processore può essere
veloce quanto vuole ma visto che la produzione di dati è solitamente maggiore
alla velocità di accettazione del sistema di memoria, esso andrà sicuramente in
stallo.
⚫ WRITE-BACK. In questo schema, quando si verifica una scrittura, il dato viene
scritto solamente nel blocco corrispondente all’interno della cache e questo poi
viene memorizzato nella memoria principale solo se deve essere rimpiazzato.
CACHE COMPLETAMENTE ASSOCIATIVE E MENO
Fino ad adesso abbiamo trattato alcune operazioni come il posizionamento di un blocco in una cache,
ma soprattutto di come trovare un dato al suo interno solo tenendo conto dello schema a mappatura
diretta che caratterizzava quel tipo di cache. Esistono però una moltitudine di schemi per determinare
4