Quando la cache della CPU viene ripristinata nella memoria principale?


18

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

Risposte:


26

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

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 il loro valore nella cache?

Il vecchio valore sarà nella memoria principale, il che non importa poiché nessuna CPU 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.


15

Sì, questo (avere due cache nella stessa area di memoria) può accadere, 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 . L' articolo di Wikipedia sull'argomento ha una bella panoramica del problema e delle possibili soluzioni.


2

Per rispondere alla domanda nel titolo, 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 al livello n, il blocco corrispondente al livello (n + 1) viene aggiornato. (È simile nel concetto al compilare il nostro modulo con carta carbone sotto; qualsiasi cosa tu scriva in alto viene copiata sul foglio in basso.) Questo è più lento perché ovviamente comporta 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.


1
Mi chiedo quale percentuale di lettori qui abbia mai usato la carta carbone. :)
Barmar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.