Stimmt es, dass die sequentielle Konsistenz eine stärkere Eigenschaft als die Cache-Kohärenz ist?
Gemäß
Sorin, Daniel J; Hill, Mark D; Wood, David A: Eine Einführung in Speicherkonsistenz und Cache-Kohärenz , Morgan & Claypool, 2011
sequentielle Konsistenz kann beschrieben werden als (nicht formal):
Das sequentielle Konsistenzspeichermodell gibt an, dass das System so angezeigt werden muss, dass alle Ladevorgänge und Speicherorte der Threads in einer Gesamtreihenfolge ausgeführt werden, die die Programmreihenfolge jedes Threads berücksichtigt. Jede Ladung erhält den Wert des letzten Geschäfts in dieser Gesamtreihenfolge.
Mit anderen Worten, das System ist sequentiell konsistent, wenn gegebene Speicherereignisse (Laden und Speichern) jedes Threads so angeordnet werden können, dass: 1) für jeden Thread die Reihenfolge seiner Ereignisse beibehalten wird und 2) die globale Reihenfolge erhalten bleibt seriell (jede Last gibt den zuletzt gespeicherten Wert zurück).
Jetzt fahren sie fort und beschreiben die Kohärenz:
Eine Definition der Kohärenz , die analog zur Definition der sequentiellen Konsistenz ist, besteht darin, dass ein kohärentes System angezeigt werden muss, um alle Ladevorgänge und Speicher in einem einzelnen Speicherort in einer Gesamtreihenfolge auszuführen, die die Programmreihenfolge jedes Threads berücksichtigt.
Mit anderen Worten ist das System kohärent, wenn gegebene Speicherereignisse jedes Threads für jeden Ort Ereignisse für diesen Ort ordnen können, so dass: 1) für jeden Thread die Reihenfolge seiner Ereignisse zu diesem Ort erhalten bleibt, und 2) für jeden Ort der Bestellung ist seriell.
Schließlich weisen sie auf den Unterschied hin:
Diese Definition hebt einen wichtigen Unterschied zwischen Kohärenz und Konsistenz hervor : Die Kohärenz wird für jeden Speicherort angegeben, während die Konsistenz für alle Speicherorte angegeben wird.
Es scheint also der Unterschied zu sein, dass für kohärente Systeme eine Gesamtreihenfolge für alle Ereignisse für jeden Standort erforderlich ist (also die Reihenfolge zwischen Ereignissen für einen bestimmten Standort), während für konsistente Systeme die Gesamtreihenfolge für alle Ereignisse definiert werden sollte (und damit auch für die Bestellung ist auch zwischen Veranstaltungen für verschiedene Standorte)?
Bedeutet das, dass Kohärenz weniger streng ist als Konsistenz? (was amüsant erscheint!) Gibt es Spuren, die kohärent, aber nicht konsistent sind?
Antworten:
Wie Sie bereits betont haben, ist Kohärenz eine Eigenschaft eines einzelnen Speicherorts, während sich die Konsistenz auf die Reihenfolge der Zugriffe auf alle Speicherorte bezieht. Sequenzielle Konsistenz ist eine streng stärkere Eigenschaft als Kohärenz. Das heißt: Jedes System, das sequentiell konsistent ist, ist auch an jedem Speicherort kohärent. Das Gegenteil ist nicht der Fall, ein Speicher, der an jedem Ort kohärent ist, ist nicht unbedingt sequentiell konsistent. In der Tat gibt es viele echte Cache-kohärente Multiprozessoren, bei denen das Speichermodell nur schwach konsistent ist (es gibt Fälle, in denen unterschiedliche Prozessoren beobachten, dass Zugriffe auf unterschiedliche Speicherorte in unterschiedlicher Reihenfolge erfolgen.)
Der Beweis der sequentiellen Konsistenz impliziert kohärent:
Dies kann zu überraschenden Ergebnissen führen. Beispielsweise
Diese Spur ist zusammenhängend:
proc2 loads A(gets 0)
,proc1 stores A:=1
proc1 stores B:=1
,proc2 loads B(gets 1)
Aber es ist nicht konsistent! Da wenn
proc2 load B
1 zurückgibt, dannproc1 store A := 1
schon passiert undproc2 load A
sollte auch 1 zurückgeben.quelle