Kontrastierende Peterson- und Dekker-Algorithmen


41

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?


Beachten Sie, dass der Peterson-Algorithmus das Problem des kritischen Abschnitts nicht vollständig löst, da das Lesen und Schreiben in die Flags selbst ein Problem des kritischen Abschnitts ist. Ein Artikel, der das Problem tatsächlich vollständig löst, ist "The Arbiter: Eine aktive Systemkomponente zum Implementieren von Synchronisationsprimitiven" von Henk JM Goeman.
user3083171

Antworten:


24

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.


3
>> Keiner der Algorithmen ist hungerfrei oder fair. Das ist nicht wahr. Petersons Algorithmus ist hungerfrei und fair. Befindet sich ein Thread im kritischen Bereich und wartet der andere in der Warteschleife, gelangt der wartende Thread als nächster in die CS, auch wenn der Thread, der sich in der CS befand, viel schneller ist.

Ich möchte betonen, dass Petersons Algorithmus hungerfrei und fair ist , wenn man nur den Kommentar von user24190 wiederholt. Ich kann nicht verstehen, warum der Autor dieser Antwort nach all den Jahren weder auf den Kommentar geantwortet noch seine Antwort korrigiert hat. (Pingen Sie mich bitte an, sobald Sie die Antwort korrigiert haben, damit ich meinen Kommentar entfernen kann.)
Apass.Jack

Link zum Kauf von Petersons "Mythen über das Problem des gegenseitigen Ausschlusses": doi.org/10.1016/0020-0190(81)90106-X
Strager

PDF von Petersons "Mythen über das Problem der gegenseitigen Ausgrenzung" (Archive.org): web.archive.org/web/20150501155424/https://cs.nyu.edu/~lerner/…
Strager

3

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

Bildbeschreibung hier eingeben


1

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:

  • Zwei Iraner = Zwei Prozesse mit dem Dekker-Algorithmus
  • Zwei Zombians = Zwei Prozesse unter Verwendung des Peterson-Algorithmus

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:

p0:
   wants_to_enter[0] ← true // Goes through the house entrance
   while wants_to_enter[1] { // If the other man wants to enter too
      if turn ≠ 0 { // Then see if it is your turn or not
         wants_to_enter[0] ← false // If it is not your turn don't go furthur
         while turn ≠ 0 { // and wait until it is your turn
           // busy wait
         }
         wants_to_enter[0] ← true // when it is your turn go through the door
      }
   }

   // critical section
   ...
   turn ← 1
   wants_to_enter[0] ← false // Set the turn for the other man
   // remainder section

Wir haben auch zwei Zombians, die das Haus mit dem Peterson- Algorithmus betreten werden. Dieser geht wie folgt:

P0:     
  flag[0] = true; // Goes through the house entrance
  turn = 1; // Set the turn for himself
  while (flag[1] && turn == 1) // Wait until the other one is going in
  {
   // busy wait
  }
   // critical section
      ...
   // end of critical section
  flag[0] = false; // Done going inside

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.