Ich verstehe strenge und sequentielle Konsistenz unabhängig voneinander ziemlich gut.
Strict C erzwingt grundsätzlich die tatsächliche Reihenfolge, in der die Anweisungen auf der globalen Uhr ausgeführt wurden.
Sequentielle Konsistenz erzwingt die Reihenfolge grundsätzlich nur auf einem Prozessor.
Ich habe jedoch Probleme, Literatur zusammenzustellen. http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html beschreibt die sequentielle Konsistenz so, dass Speicherverzögerungen berücksichtigt werden. Es kann einige Zeit dauern, bis sich ein Schreibvorgang auf alle Prozessoren ausbreitet. Aber wenn es das tut, erreicht es alle auf einmal, was in Ordnung ist. Daher gilt Folgendes unter Sequentielle Konsistenz
P1: W(x)1
-----------------------
P2: R(x)0 R(x)1
Was mich jetzt beschäftigt, sind die folgenden Prozesse, die so etwas wie Dekkers Algorithmus sind.
P1: W(x)1 R(y)0
-----------------
P2: W(y)1 R(x)0
Dies sollte unter sequentieller Konsistenz ( http://portal.acm.org/citation.cfm?id=1787234.1787255 S. 2) sicherlich NICHT möglich sein . Es gibt keine Gesamtreihenfolge, die dieses Ergebnis liefern könnte.
Aus der Idee heraus ist es jedoch sinnvoll, dass sich Schreibvorgänge durch sequentielle Konsistenz langsam ausbreiten und ein Thread möglicherweise keine Ahnung hat, was andere Prozessoren vorhaben.
Was fehlt mir hier?
Antworten:
Ihnen fehlt nichts :)
Der Dekker-Algorithmus ist auf einem auf verteilten Shared-Memory-Hierarchien basierenden Multiprozessor nicht sequentiell konsistent, aber es ist sehr gut möglich, da sich die Speicheraktualisierungen nicht im Gleichschritt mit der Aktualisierung des lokalen Speichers (Cache), sondern asynchron über Cache-Kohärenz-Protokolle wie MESI (Weaker Memory Model) ausbreiten.
Bei einem Uniprozessor, bei dem Dekkers Algorithmus nicht der Fall ist, ist dies streng konsistent.
quelle
Sie haben bereits die richtige Antwort. Die zweite Ausführung ist nicht sequentiell konsistent, da "es keine Gesamtreihenfolge gibt, die dieses Ergebnis liefern kann".
Ich denke, Ihre Verwirrung kommt von dieser Idee:
Das ist richtig. Die Ausbreitung kann langsam sein. Durch die sequentielle Konsistenz kann ein Thread nicht wissen, was andere Prozesse vorhaben (für welche Programme auch immer). Die sequentielle Konsistenz lässt jedoch nicht zu, dass jeder Thread nicht weiß, was andere Prozesse vorhaben (für einige Programme, einschließlich des Dekker-Algorithmus).
Der obige Ausdruck "für einige Programme" stammt aus dieser Überlegung: Selbst bei sequentieller Konsistenz ist kein Thread über das Verhalten eines anderen Threads informiert, wenn die Threads keinen gemeinsam genutzten Speicher verwenden.
quelle
Dieses Papier kann auch zum Verständnis beitragen, da der Titel auf den Unterschied zwischen den beiden von Ihnen erwähnten Konsistenzen hinweist. (Es geht jedoch zu einem großen Teil um die Implementierung von gemeinsam genutzten SeqCon- und StrictCon-Objekten bei der Nachrichtenübermittlung. Dies ist eine Möglichkeit, über die von Ihnen erwähnte Verzögerung nachzudenken.)
Um Ihre spezifische Frage zu beantworten: Sequentielle Konsistenz erfordert, dass alle Ereignisse in einer sequentiellen Reihenfolge stattfinden und dass das, was in einem Prozess passiert, immer mit der Zeit konsistent ist.
Also der Grund warum
ist nicht möglich, ist, dass es eine globale Sequenz geben muss, z
W1(x,1) R1(y)0 W2(y,1) R2(x)?
. In dieser Sequenz kann der letzte Lesevorgang eindeutig keine 0 zurückgeben. Diese Sequenz muss jedoch nicht mit Echtzeit konsistent sein. Es ist durchaus möglich (sequentielle Konsistenz), dass in Echtzeit die Abfolge der Ereignisse warW1(x,1) W2(y,1) R1(y)0 R2(x)1
. Diese Sequenz ist aus Gründen der strengen Konsistenz unzulässig (da R1 (y) den Wert des vorherigen Schreibvorgangs nicht zurückgegeben hat).quelle