Quando È una CPU Cache Svuotata la Memoria Principale?

0
196

Se si sta appena iniziando a imparare le Cpu multi-core, la cache, la cache di coerenza, e la memoria funziona, può sembrare un po ‘ confuso in un primo momento. Con questo in mente, oggi SuperUser Q&A post ha risposte a un lettore curioso.

Oggi sessione ” Domande e Risposte viene a noi per gentile concessione di SuperUser—una suddivisione di Stack Exchange, un community-driven raggruppamento di Q&A siti web.

La Domanda

SuperUser lettore CarmeloS vuole sapere quando una CPU cache viene svuotata la memoria principale:

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

Quando è una CPU cache svuotata la memoria principale?

La Risposta

SuperUser collaboratori David Schwartz, sleske, e Kimberly W sono la risposta per noi. Il primo, David Schwartz:

Se ho una CPU con due core e ogni core ha una sua cache L1, è possibile che Core1 e Core2 sia la cache è la stessa parte di memoria, allo stesso tempo?

Sì, la performance sarebbe terribile se questo non era il caso. Considerare due thread che eseguono lo stesso codice. Si desidera che il codice sia in cache L1.

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

Il vecchio valore sarà nella memoria principale, che non importa quanto non si leggono. Prima dell’espulsione del valore modificato dalla cache, deve essere scritto a memoria. In genere, qualche variante di MESI viene utilizzato il protocollo. Nel tradizionale attuazione di MESI, se il valore viene modificato in una cache, non può essere del tutto assente in qualsiasi altra cache dello stesso livello.

Seguito dalla risposta da sleske:

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

  • Due cache in grado di comunicare per assicurarsi che essi non sono d’accordo
  • Si può avere una sorta di supervisore che controlla tutti i file di cache e li aggiorna di conseguenza
  • Ogni processore controlla le aree di memoria che si ha in cache, e quando rileva una scrittura, si butta fuori la sua (ora non valido) cache

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

E la nostra risposta definitiva da Kimberly W:

Per rispondere alla domanda nel titolo del post, dipende da cosa la memorizzazione nella cache di protocollo. Se è write-back, la cache sarà solo svuotata la memoria principale quando il controller della cache non ha altra scelta, ma per inserire un nuovo blocco di cache, che già lo spazio occupato. Il blocco, che in precedenza occupava lo spazio viene rimosso e il suo valore viene scritto nella memoria principale.

L’altro protocollo è write-through. In questo caso, in qualsiasi momento del blocco di cache è scritto sul livello n, il blocco corrispondente al livello n+1 è aggiornato. È simile nel concetto a compilare un modulo con la carta carbone sotto; quello che hai scritto sopra è copiato sulla scheda qui sotto. Questo è più lento perché, ovviamente, coinvolge più le operazioni di scrittura, ma i valori tra le cache sono più consistenti. Il write-back schema, solo il più alto livello di cache, sarebbe il più up-to-data valore per un determinato blocco di memoria.

Ha qualcosa da aggiungere alla spiegazione? Sound off nei commenti. Vuoi leggere altre risposte da altri tech-savvy Stack Exchange, gli utenti? Controllare il thread di discussione qui.

Immagine Di Credito: Lemsipmatt (Flickr)