Quando la cache di una CPU viene ripristinata nella memoria principale?

Se stai appena iniziando a scoprire come funzionano CPU multi-core, memorizzazione nella cache, coerenza della cache e memoria, all'inizio potrebbe sembrare un po 'confuso. Con questo in mente, il post di domande e risposte di SuperUser di oggi ha le risposte alla domanda di un curioso lettore.

La sessione di domande e risposte di oggi ci viene fornita da SuperUser, una suddivisione di Stack Exchange, un raggruppamento di siti Web di domande e risposte guidato dalla community.

La domanda

Il lettore SuperUser CarmeloS vuole sapere quando la cache di una CPU viene ripristinata nella memoria principale:

Se ho una CPU con due core e ogni core ha la propria cache L1, è possibile che Core1 e Core2 memorizzino contemporaneamente la stessa parte della memoria? Se è possibile, quale sarà il valore della memoria principale se sia Core1 che Core2 hanno modificato i loro valori nella cache?

Quando viene ripristinata la memoria cache di una CPU nella memoria principale?

La risposta

I collaboratori di SuperUser David Schwartz, Sleske e Kimberly W hanno la risposta per noi. Innanzitutto, David Schwartz:

Se ho una CPU con due core e ogni core ha la propria cache L1, è possibile che Core1 e Core2 memorizzino contemporaneamente la stessa parte della memoria?

Sì, le prestazioni sarebbero terribili se non fosse così. Considera due thread che eseguono lo stesso codice. Volete quel codice in entrambe le cache L1.

Se è possibile, quale sarà il valore della memoria principale se sia Core1 che Core2 hanno modificato i loro valori nella cache?

Il vecchio valore sarà nella memoria principale, il che non avrà importanza poiché nessuno dei due core lo leggerà. Prima di espellere un valore modificato dalla cache, è necessario scriverlo in memoria. In genere, viene utilizzata una variante del protocollo MESI. Nell'implementazione tradizionale di MESI, se un valore viene modificato in una cache, non può essere presente in nessuna altra cache allo stesso livello.

Seguita dalla risposta di sleske:

Sì, avere due cache nella cache può accadere la stessa area di memoria ed è in realtà un problema che si verifica molto nella pratica. Esistono varie soluzioni, ad esempio:

  • Le due cache possono comunicare per assicurarsi che non siano in disaccordo
  • Puoi avere una sorta di supervisore che controlla tutte le cache e le aggiorna di conseguenza
  • Ogni processore monitora le aree di memoria memorizzate nella cache e quando rileva una scrittura, lancia la sua cache (ora non valida)

Il problema si chiama coerenza cache e l'articolo di Wikipedia sull'argomento ha una bella panoramica del problema e delle possibili soluzioni.

E la nostra risposta finale da Kimberly W:

Per rispondere alla domanda nel titolo del tuo post, dipende dal protocollo di memorizzazione nella cache. In caso di riscrittura, la cache verrà ripristinata nella memoria principale solo quando il controller della cache non ha altra scelta che inserire un nuovo blocco cache nello spazio già occupato. Il blocco che precedentemente occupava lo spazio viene rimosso e il suo valore viene riscritto nella memoria principale.

L'altro protocollo è write-through. In tal caso, ogni volta che il blocco cache viene scritto a livello n, il blocco corrispondente a livello n + 1 è aggiornato. È simile nel concetto alla compilazione di un modulo con carta carbone sotto; tutto ciò che scrivi in ​​cima viene copiato nel foglio in basso. Questo è più lento perché comporta ovviamente più operazioni di scrittura, ma i valori tra le cache sono più coerenti. Nello schema di riscrittura, solo la cache di livello più alto avrebbe il valore più aggiornato per un determinato blocco di memoria.


Hai qualcosa da aggiungere alla spiegazione? Audio disattivato nei commenti. Vuoi leggere altre risposte da altri utenti esperti di Stack Exchange? Dai un'occhiata al thread completo di discussione qui.

Credito di immagine: Lemsipmatt (Flickr)

Articoli correlati

Ultimi articoli