Ich versuche, die Algorithmen von Peterson und Dekker zu verstehen, die sehr ähnlich sind und viele Symmetrien aufweisen.
Ich habe versucht, die Algorithmen in informeller Sprache wie folgt zu formulieren:
Peterson's: "I want to enter." flag[0]=true;
"You can enter next." turn=1;
"If you want to enter and while(flag[1]==true&&turn==1){
it's your turn I'll wait." }
Else: Enter CS! // CS
"I don't want to enter any more." flag[0]=false;
Dekker's: "I want to enter." flag[0]=true;
"If you want to enter while(flag[1]==true){
and if it's your turn if(turn!=0){
I don't want to enter any more." flag[0]=false;
"If it's your turn while(turn!=0){
I'll wait." }
"I want to enter." flag[0]=true;
}
}
Enter CS! // CS
"You can enter next." turn=1;
"I don't want to enter any more." flag[0]=false;
Der Unterschied scheint der Punkt zu sein, an dem er "You can enter next."
auftritt, und die Tatsache, dass er "if it's your turn I don't want to enter any more."
bei Dekker auftritt.
In Petersons Algorithmus scheinen die beiden Prozesse dominant zu sein. Ein Prozess scheint seinen Weg in den kritischen Bereich zu erzwingen, es sei denn, der andere ist an der Reihe.
Umgekehrt scheinen die beiden Prozesse in Dekkers Algorithmus unterwürfig und höflich zu sein. Wenn beide Prozesse in den kritischen Bereich eintreten möchten und der andere an der Reihe ist, entscheidet der Prozess, dass er nicht mehr eintreten möchte. (Wird dies für Hungerfreiheit benötigt? Warum?)
Wie genau unterscheiden sich diese Algorithmen? Ich stelle mir vor, dass, wenn beide Prozesse versuchen, in den kritischen Bereich zu gelangen, in Petersons der Prozess "I enter" sagt, während in Dekkers Prozess "You may enter" sagt. Kann jemand klären, wie sich die Prozesse in den einzelnen Algorithmen verhalten? Ist meine Art, es informell auszudrücken, richtig?
Antworten:
Ihre informelle Beschreibung der Algorithmen ist wunderbar.
Ich denke, in beiden Fällen hat der Autor versucht, die einfachste Lösung zu finden, die er sich vorstellen kann und die sowohl gegenseitigen Ausschluss als auch Deadlock-Freiheit garantiert.
Keiner der Algorithmen ist hungerfrei oder fair.[ed: Wie in den Kommentaren ausgeführt, ist Petersons Algorithmus hungerfrei und fair]. Dekkers Lösung war der erste Algorithmus zum gegenseitigen Ausschluss, bei dem nur Lade- und Speicheranweisungen verwendet wurden. Es wurde in Dijkstra, Edsger W eingeführt; "Cooperating Sequential Processes", F. Genuys, Hrsg., Programming Languages: NATO Advanced Study Institute , S. 43-112, Academic Press, 1968 . Wenn Sie das Papier durchlesen, werden Sie feststellen, dass Dijkstra eine Reihe von Versuchen durcharbeitet, um das Problem zu erkennen und dann ein bisschen mehr für die nächste Version hinzuzufügen. Ein Teil der Ineffizienz seines Algorithmus beruht auf der Tatsache, dass er mit einem Turn-Taking-Algorithmus beginnt und dann versucht, ihn zu modifizieren, damit die Prozesse in beliebiger Reihenfolge ablaufen können. (Nicht nur 0,1,0,1, ...)Petersons Algorithmus wurde 1981 nach mehr als einem Jahrzehnt Erfahrung und Rückblick auf Dekkers Algorithmus veröffentlicht. Peterson wollte einen viel einfacheren Algorithmus als Dekker, damit der Beweis der Richtigkeit viel einfacher ist. Sie können sehen, dass er etwas Frustration mit der Gemeinschaft vom Titel seines Papiers empfand. Peterson, GL; "Mythen über das Problem der gegenseitigen Ausgrenzung", Inf. Proc. Lette. 12 (3), 115-116 (1981). Sehr schnell gelesen und sehr gut geschrieben. (Und die kleinen Bemerkungen zu den formalen Methoden sind von unschätzbarem Wert.) In Petersons Artikel wird auch der Prozess erörtert, mit dem er seine Lösung aus einfacheren Versuchen entwickelte. (Da seine Lösung einfacher ist, sind weniger Zwischenschritte erforderlich.) Beachten Sie, dass der Hauptunterschied (was Sie als "Dominanz" und nicht als "Unterwürfigkeit" bezeichnen) darin besteht, dass Peterson neu angefangen hat (nicht mit dem Turn-Taking-Algorithmus, mit dem Dijkstra begonnen hat) ) seine Warteschleife ist einfacher und effizienter. Er erkennt, dass er mit einfachen Testschleifen davonkommen kann, während Dijkstra jedes Mal einen Rückzieher machen und es erneut versuchen musste.
Ich glaube, ich muss auch Lamports klassisches Papier über Bäckereialgorithmen erwähnen: Lamport, Leslie; "Eine neue Lösung von Dijkstra's Concurrent Programming Problem", Comm ACM 17 (8): 453-455, 1974 . Der Bakery-Algorithmus ist wahrscheinlich einfacher als der Dekker-Algorithmus (und sicherlich einfacher bei mehr als 2 Prozessoren) und wurde speziell für Fehlertoleranz entwickelt. Ich erwähne es ausdrücklich aus zwei Gründen. Erstens, weil es ein wenig Geschichte über die Definition des Problems des gegenseitigen Ausschlusses gibt und versucht, es bis 1974 zu lösen. Zweitens, weil der Bakery-Algorithmus zeigt, dass keine Hardware-Atomizität erforderlich ist, um das Problem des gegenseitigen Ausschlusses zu lösen.
Schließlich ist Lamport, Leslie , ein besonderer Favorit von mir ; "Ein schneller Algorithmus zum gegenseitigen Ausschluss", ACM Trans. Comp. Sys. 5 (1), 1-11 (1987). In diesem Artikel versuchte Lamport, eine Lösung für das Problem des gegenseitigen Ausschlusses im (häufigen) Fall zu optimieren, dass für den kritischen Abschnitt wenig Streit besteht. Auch hier garantiert es gegenseitigen Ausschluss und Blockadefreiheit, aber keine Fairness. Es ist (glaube ich) der erste Algorithmus zum gegenseitigen Ausschluss, der nur normale Lese- und Schreibvorgänge verwendet und N Prozessoren in O (1) -Zeit synchronisieren kann, wenn keine Konflikte vorliegen. (Bei Konflikten wird auf einen O (N) -Test zurückgegriffen.) Er demonstriert informell, dass Sie im konkurrenzfreien Fall am besten sieben Speicherzugriffe durchführen können. (Dekker und Peterson machen es beide mit 4, aber sie können nur mit 2 Prozessoren umgehen. Wenn Sie ihre Algorithmen auf N erweitern, müssen sie zusätzliche O (N) -Zugriffe hinzufügen.)
Alles in allem: Ich würde sagen, Dekkers Algorithmus selbst ist hauptsächlich aus historischer Sicht interessant. Dijkstra erläuterte die Bedeutung des Problems der gegenseitigen Ausgrenzung und zeigte, dass es gelöst werden kann. Im Nachhinein wurden jedoch einfachere (und effizientere) Lösungen als bei Dekker gefunden.
quelle
In der folgenden Arbeit geben wir formale Modelle für Petersons und Dekkers Algorithmen (und einige andere) an und verwenden Model Checker, um ihre Eigenschaften zu beweisen. Unsere Ergebnisse finden Sie in der folgenden Tabelle (Spalten "Deadlock" und "Divergent" beziehen sich auf unsere Modelle, "ME" = TRUE bedeutet, dass der Algorithmus korrekt ist, "Overtaking" = TRUE bedeutet, dass er fair ist).
R. Meolic, T. Kapus, Z. Brezočnik. ACTLW - Eine aktionsbasierte Berechnungsbaumlogik mit nicht-Operator. Information Sciences, 178 (6), S. 1542–1557, 2008.
https://doi.org/10.1016/j.ins.2007.10.023
quelle
Der Peterson- Algorithmus übt einen strengeren Druck auf den kritischen Bereich aus, da der dekker -Algorithmus relativ leiser und weniger aggressiv ist. Schauen wir uns zur Verdeutlichung ein Beispiel zur iranischen Kultur an. Bevor wir uns mit diesem Beispiel befassen, ist es gut zu wissen, dass sich die iranischen Leute beim Betreten eines bestimmten Ortes sehr weich verhalten! Schätze, zwei iranische Männer werden ein Haus betreten, und dieses Haus hat nur eine Tür zum Betreten.
Stellen Sie sich nun zwei Männer aus einer anderen Kultur vor ( zombianische Kultur ), die sich beim Betreten nicht so sehr umeinander kümmern ( es ist eine Frage des Respekts, ob jemand eintreten möchte oder nicht ).
Um die Informationen über das Problem zu verdeutlichen, können wir Folgendes sagen:
Lassen Sie uns also herausfinden, was in jedem Algorithmus ( Kultur ) getan wird . Die folgenden Kommentare beziehen sich auf den ersten Iraner , der das Haus betritt, während er den Dekker- Algorithmus verwendet:
Wir haben auch zwei Zombians, die das Haus mit dem Peterson- Algorithmus betreten werden. Dieser geht wie folgt:
Es ist wichtig zu erwähnen, dass beide nicht hineingehen, während der andere dies tut ( gegenseitiger Ausschluss ), aber das iranische Volk ist viel weicher.
quelle