Write-Back vs Write-Through-Caching?

89

Mein Verständnis ist, dass der Hauptunterschied zwischen den beiden Methoden darin besteht, dass bei der Methode "Durchschreiben" Daten sofort über den Cache in den Hauptspeicher geschrieben werden, während bei "Zurückschreiben" Daten in einer "späteren Zeit" geschrieben werden.

Wir müssen noch in "letzter Zeit" auf die Erinnerung warten. Was ist der Vorteil von "Durchschreiben"?

Naftaly
quelle
@ EricWang Ich denke du meinst write backhat eine bessere Leistung?
Wlnirvana
@wlnirvana Ja, du hast recht, es ist mein Schreibfehler. Ich würde es entfernen und hier einen neuen Kommentar einfügen, um zukünftige Irreführungen zu vermeiden.
Eric Wang
4
Einfach ausgedrückt, write backhat eine bessere Leistung, da das Schreiben in den Hauptspeicher viel langsamer ist als das Schreiben in den CPU-Cache, und die Daten währenddessen möglicherweise kurz sind (Mittel können sich früher wieder ändern und die alte Version muss nicht in den Speicher gestellt werden). Es ist komplex, aber ausgefeilter. Die meisten Speicher in modernen CPUs verwenden diese Richtlinie.
Eric Wang
Ich sehe, dass eine erklärende Antwort gegeben wurde. Ich empfehle Ihnen, sich die Tags Write-Allocate und Write-NoAllocate anzusehen, nachdem Sie den Write-Back-Algorithmus behandelt haben.
Çağlayan DÖKME
Die Antwort auf Ihre Frage lautet, dass beim Write-Through-Caching beim Schreiben innerhalb desselben Blocks nur ein Schreibvorgang in den Hauptspeicher erforderlich ist. Siehe meine Antwort für Details.
qwr

Antworten:

108

Der Vorteil des Durchschreibens in den Hauptspeicher besteht darin, dass das Design des Computersystems vereinfacht wird. Beim Durchschreiben verfügt der Hauptspeicher immer über eine aktuelle Kopie der Zeile. Wenn also ein Lesevorgang abgeschlossen ist, kann der Hauptspeicher immer mit den angeforderten Daten antworten.

Wenn das Zurückschreiben verwendet wird, befinden sich die aktuellen Daten manchmal in einem Prozessor-Cache und manchmal im Hauptspeicher. Befinden sich die Daten in einem Prozessor-Cache, muss dieser Prozessor verhindern, dass der Hauptspeicher auf die Leseanforderung antwortet, da der Hauptspeicher möglicherweise eine veraltete Kopie der Daten enthält. Dies ist komplizierter als das Durchschreiben.

Außerdem kann das Durchschreiben das Cache-Kohärenzprotokoll vereinfachen, da der Status " Ändern" nicht erforderlich ist . Die Modify Zustand Aufzeichnungen , dass der Cache muss die Cache - Zeile zurückschreiben , bevor sie ungültig oder evicts die Linie. Beim Durchschreiben kann eine Cache-Zeile immer ungültig gemacht werden, ohne zurückzuschreiben, da der Speicher bereits über eine aktuelle Kopie der Zeile verfügt.

Eine weitere Sache: Bei einer Software mit Rückschreibarchitektur, die in speicherabgebildete E / A-Register schreibt, müssen zusätzliche Schritte unternommen werden, um sicherzustellen, dass Schreibvorgänge sofort aus dem Cache gesendet werden. Andernfalls sind Schreibvorgänge außerhalb des Kerns erst sichtbar, wenn die Zeile von einem anderen Prozessor gelesen oder die Zeile entfernt wurde.

Craig S. Anderson
quelle
7
Bei speicherabgebildeten E / A werden diese Adressen normalerweise als nicht zwischengespeichert zugeordnet. Durchschreiben kann auch verwendet werden, um die Zuverlässigkeit zu erhöhen (z. B. wenn L1 nur Paritätsschutz und L2 ECC hat). Durchschreiben ist auch bei kleineren Caches, die keine Schreibzuweisung verwenden (dh ein Schreibfehler ordnet den Block nicht dem Cache zu, was möglicherweise die Nachfrage nach L1-Kapazität und L2-Lese- / L1-Füllbandbreite verringert), weitaus beliebter, da ein Großteil der Hardware vorhanden ist Das Erfordernis des Durchschreibens ist für ein solches Herumschreiben bereits vorhanden.
Paul A. Clayton
1
Kann ich überprüfen, ob meine Cache-Methode in meinem Kern zurückgeschrieben oder durchgeschrieben wird?
Künstliche
4
Es kann irreführend sein zu sagen, dass das Zurückschreiben komplexer ist, da der Prozessor verhindern muss, dass der Hauptspeicher auf die Leseanforderung antwortet. Es ist außerdem so, dass der Cache nachverfolgt, welche Daten Daten sind (nicht mit dem Hauptspeicher ausgerichtet sind) und welche nicht, indem "Dirty Bit (s)" verwendet werden. Daher ist es möglich, den Hauptspeicher überhaupt nicht zu überprüfen.
Steviejay
@Shaowu "lshw" Befehl, der Cache-Funktionen wie "asynchrones internes Zurückschreiben" zeigt
mug896
Ich verstehe immer noch nicht, was die wirklichen Schritte beim Zurückschreiben sind, aber ich weiß nur, dass es kompliziert ist ... Könnten Sie mehr Ressourcen / Details dazu bereitstellen?
BinaryTreeee
10

Schauen wir uns das anhand eines Beispiels an. Angenommen, wir haben einen direkt zugeordneten Cache und die Rückschreibrichtlinie wird verwendet. Wir haben also ein gültiges Bit, ein Dirty-Bit, ein Tag und ein Datenfeld in einer Cache-Zeile. Angenommen, wir haben eine Operation: Schreiben Sie A (wobei A der ersten Zeile des Caches zugeordnet ist).

Was passiert ist, dass die Daten (A) vom Prozessor in die erste Zeile des Caches geschrieben werden. Das gültige Bit und die Tag-Bits werden gesetzt. Das Dirty-Bit wird auf 1 gesetzt.

Ein schmutziges Bit zeigt einfach an, dass die Cache-Zeile jemals geschrieben wurde, seit sie zuletzt in den Cache gebracht wurde!

Angenommen, eine andere Operation wird ausgeführt: E lesen (wobei E auch der ersten Cache-Zeile zugeordnet ist)

Da wir einen direkt zugeordneten Cache haben, kann die erste Zeile einfach durch den E-Block ersetzt werden, der aus dem Speicher abgerufen wird. Da der zuletzt in die Zeile geschriebene Block (Block A) noch nicht in den Speicher geschrieben wurde (angezeigt durch das Dirty-Bit), gibt der Cache-Controller zuerst ein Zurückschreiben in den Speicher aus, um den Block A dann in den Speicher zu übertragen Es ersetzt die Zeile durch Block E, indem eine Leseoperation an den Speicher ausgegeben wird. Dirty Bit ist jetzt auf 0 gesetzt.

Die Rückschreibrichtlinie garantiert also nicht, dass der Block im Speicher und in der zugehörigen Cache-Zeile identisch ist. Wenn jedoch die Leitung ersetzt werden soll, wird zunächst ein Rückschreiben durchgeführt.

Eine Write-Through-Richtlinie ist genau das Gegenteil. Demnach hat der Speicher immer aktuelle Daten. Das heißt, wenn der Cache-Block geschrieben wird, wird auch der Speicher entsprechend geschrieben. (keine Verwendung von schmutzigen Bits)

Rajat
quelle
5

Vielleicht kann dieser Artikel Ihnen helfen, hier zu verlinken

Durchschreiben: Das Schreiben erfolgt synchron sowohl in den Cache als auch in den Sicherungsspeicher.

Rückschreiben (oder Zurückschreiben): Das Schreiben erfolgt nur in den Cache. Ein geänderter Cache-Block wird unmittelbar vor dem Ersetzen in den Speicher zurückgeschrieben.

Durchschreiben: Wenn Daten aktualisiert werden, werden sie sowohl in den Cache als auch in den Back-End-Speicher geschrieben. Dieser Modus ist einfach zu bedienen, aber beim Schreiben von Daten langsam, da Daten sowohl in den Cache als auch in den Speicher geschrieben werden müssen.

Rückschreiben: Wenn Daten aktualisiert werden, werden sie nur in den Cache geschrieben. Die geänderten Daten werden nur dann in den Back-End-Speicher geschrieben, wenn Daten aus dem Cache entfernt werden. Dieser Modus hat eine schnelle Datenschreibgeschwindigkeit, aber Daten gehen verloren, wenn ein Stromausfall auftritt, bevor die aktualisierten Daten in den Speicher geschrieben werden.

Shengmin Zhao
quelle
3

Write-Back und Write-Through - Richtlinien beschreiben , wenn ein Schreibtreffer auftritt, das heißt , wenn der Cache die angeforderten Informationen hat. In diesen Beispielen nehmen wir an, dass ein einzelner Prozessor mit einem Cache in den Hauptspeicher schreibt.

Durchschreiben: Die Informationen werden in den Cache und den Speicher geschrieben, und der Schreibvorgang wird beendet, wenn beide abgeschlossen sind. Dies hat den Vorteil, dass es einfacher zu implementieren ist und der Hauptspeicher immer konsistent (synchron) mit dem Cache ist (für den Uniprozessor-Fall - wenn ein anderes Gerät den Hauptspeicher ändert, reicht diese Richtlinie nicht aus) und ein Lesefehler führt niemals zu Schreibvorgängen in den Hauptspeicher. Der offensichtliche Nachteil ist, dass jeder Schreibtreffer zwei Schreibvorgänge ausführen muss, von denen einer auf einen langsameren Hauptspeicher zugreift.

Rückschreiben: Die Informationen werden in einen Block im Cache geschrieben. Der geänderte Cache-Block wird nur in den Speicher geschrieben, wenn er ersetzt wird (im Endeffekt ein verzögertes Schreiben ). Ein spezielles Bit für jeden Cache-Block, das Dirty-Bit , markiert, ob der Cache-Block im Cache geändert wurde oder nicht. Wenn das Dirty-Bit nicht gesetzt ist, ist der Cache-Block "sauber" und ein Schreibfehler muss den Block nicht in den Speicher schreiben.

Der Vorteil besteht darin, dass Schreibvorgänge mit der Geschwindigkeit des Caches ausgeführt werden können. Wenn innerhalb desselben Blocks geschrieben wird, ist nur ein Schreibvorgang in den Hauptspeicher erforderlich (wenn der vorherige Block ersetzt wird). Die Nachteile sind, dass dieses Protokoll schwieriger zu implementieren ist, der Hauptspeicher nicht konsistent (nicht synchron) mit dem Cache sein kann und Lesevorgänge, die zum Ersetzen führen, zu Schreibvorgängen von verschmutzten Blöcken in den Hauptspeicher führen können.

Die Richtlinien für einen Schreibfehler sind in meinem ersten Link aufgeführt.

Diese Protokolle kümmern sich nicht um Fälle mit mehreren Prozessoren und mehreren Caches, wie dies bei modernen Prozessoren üblich ist. Hierzu sind kompliziertere Cache-Kohärenzmechanismen erforderlich. Durchschreibcaches haben einfachere Protokolle, da ein Schreibvorgang in den Cache sofort im Speicher wiedergegeben wird.

Gute Ressourcen:

qwr
quelle
0

Das Zurückschreiben ist komplexer und erfordert ein kompliziertes Cache Coherence Protocol (MOESI), das sich jedoch lohnt, da es das System schnell und effizient macht.

Der einzige Vorteil von Write-Through besteht darin, dass die Implementierung extrem einfach ist und kein kompliziertes Cache-Kohärenzprotokoll erforderlich ist.

Gaurav Toshniwal
quelle
1
WT benötigt noch ein Kohärenzprotokoll. Ein Geschäft aus einem Kern muss weiterhin Kopien in anderen Caches ungültig machen, damit veraltete Daten nicht unbegrenzt gelesen werden. Atomic RMW benötigt besondere Unterstützung. All dies ist mit WT einfacher, denke ich, aber die erforderliche Kohärenz ist immer noch etwas kompliziert.
Peter Cordes
Oder Sie haben über ein Single-Core-System mit einer Cache-Hierarchie von L1 / L2 (und vielleicht mehr) gesprochen. In diesem Fall müssen Sie MESI / MOESI nicht wirklich für innere Caches verwenden, die durch äußere Caches abgerufen werden, es sei denn, Sie möchten Cache-kohärenten DMA unterstützen, der auf die äußerste Cache-Richtung zugreifen kann. Dann benötigen Sie jedoch noch Kohärenz für einen DMA-Schreibvorgang, um den inneren Cache ungültig zu machen.
Peter Cordes
1
Das Cache-Kohärenzprotokoll wird nur benötigt, wenn mehrere Caches / Prozessoren unterstützt werden müssen oder wenn sich etwas wie DMA auf den Speicher auswirkt. Das Durchschreiben hat seine Vorteile auch für Einzelprozessorsysteme, nämlich die Schreibgeschwindigkeit.
qwr
Bei DMA kann das Betriebssystem den Cache nach der E / A explizit leeren. Als Software ist es weniger effizient.
qwr