Wann wird ein CPU-Cache in den Hauptspeicher zurückgespült?
Wenn Sie gerade erst lernen, wie Multi-Core-CPUs, Caching, Cache-Kohärenz und Arbeitsspeicher funktionieren, kann dies zunächst etwas verwirrend erscheinen. In diesem Sinne hat der heutige SuperUser-Beitrag Antworten auf die Frage eines neugierigen Lesers.
Die heutige Question & Answer-Sitzung wird dank SuperUser zur Verfügung gestellt - einer Unterteilung von Stack Exchange, einer Community-basierten Gruppierung von Q & A-Websites.
Die Frage
Der Superuser-Leser CarmeloS möchte wissen, wann der Cache einer CPU in den Hauptspeicher zurückgespült wird:
Wenn ich eine CPU mit zwei Kernen habe und jeder Kern einen eigenen L1-Cache hat, ist es dann möglich, dass Core1 und Core2 beide den gleichen Teil des Speichers gleichzeitig cachen? Wenn es möglich ist, welchen Wert hat der Hauptspeicher, wenn sowohl Core1 als auch Core2 ihre Werte im Cache bearbeitet haben?
Wann wird der Cache einer CPU in den Hauptspeicher zurückgespült?
Die Antwort
Die Superuser-Mitwirkenden David Schwartz, Sleske und Kimberly W haben die Antwort für uns. Zunächst einmal David Schwartz:
Wenn ich eine CPU mit zwei Kernen habe und jeder Kern einen eigenen L1-Cache hat, ist es möglich, dass Core1 und Core2 gleichzeitig den gleichen Teil des Speichers zwischenspeichern?
Ja, Leistung wäre schrecklich, wenn dies nicht der Fall wäre. Betrachten Sie zwei Threads, die denselben Code ausführen. Sie möchten diesen Code in beiden L1-Caches.
Wenn es möglich ist, welchen Wert hat der Hauptspeicher, wenn sowohl Core1 als auch Core2 ihre Werte im Cache bearbeitet haben?
Der alte Wert befindet sich im Hauptspeicher, was keine Rolle spielt, da er von keinem Kern gelesen wird. Vor dem Auswerfen eines geänderten Werts aus dem Cache muss dieser in den Speicher geschrieben werden. Typischerweise wird eine Variante des MESI-Protokolls verwendet. Wenn in der traditionellen Implementierung von MESI ein Wert in einem Cache geändert wird, kann er in keinem anderen Cache auf derselben Ebene vorhanden sein.
Gefolgt von der Antwort von sleske:
Ja, wenn zwei Caches den gleichen Speicherbereich zwischenspeichern, kann dies passieren, was in der Praxis häufig auftritt. Es gibt verschiedene Lösungen, zum Beispiel:
- Die beiden Caches können miteinander kommunizieren, um sicherzustellen, dass sie nicht anderer Meinung sind
- Sie können eine Art Supervisor haben, der alle Caches überwacht und sie entsprechend aktualisiert
- Jeder Prozessor überwacht die zwischengespeicherten Speicherbereiche, und wenn er einen Schreibvorgang erkennt, wirft er seinen (jetzt ungültigen) Cache aus
Das Problem wird als Cache-Kohärenz bezeichnet, und der Wikipedia-Artikel zum Thema bietet einen schönen Überblick über das Problem und mögliche Lösungen.
Und unsere letzte Antwort von Kimberly W:
Um die Frage im Titel Ihres Beitrags zu beantworten, hängt es vom Caching-Protokoll ab. Wenn es sich um ein Zurückschreiben handelt, wird der Cache nur in den Hauptspeicher zurückgespült, wenn der Cache-Controller keine andere Wahl hat, als einen neuen Cache-Block in den bereits belegten Speicherplatz zu setzen. Der Block, der zuvor den Platz belegt hat, wird entfernt und sein Wert wird in den Hauptspeicher zurückgeschrieben.
Das andere Protokoll ist Durchschreiben. In diesem Fall wird der Cache-Block jedes Mal auf Ebene geschrieben n, der entsprechende Block auf Ebene n + 1 ist aktualisiert. Das Konzept ähnelt dem Ausfüllen eines Formulars mit Kohlepapier darunter. Alles, was Sie darüber schreiben, wird auf das Blatt unten kopiert. Dies ist langsamer, da offensichtlich mehr Schreibvorgänge erforderlich sind, die Werte zwischen den Caches jedoch einheitlicher sind. In dem Rückschreibschema würde nur der Cache auf der höchsten Ebene den aktuellsten Wert für einen bestimmten Speicherblock haben.
Haben Sie der Erklärung etwas hinzuzufügen? Sound off in den Kommentaren. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange-Benutzern lesen? Hier geht es zum vollständigen Diskussionsthread.
Bild-Gutschrift: Lemsipmatt (Flickr)