ピーターソンとデッカーのアルゴリズムの対比


41

ピーターソンとデッカーのアルゴリズムは非常によく似ており、多くの対称性を示しています。

私は次のような非公式言語でアルゴリズムを定式化しようとしました:

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;

違いは、"You can enter next."発生するポイントと"if it's your turn I don't want to enter any more."Dekker で発生する事実のようです。

ピーターソンのアルゴリズムでは、2つのプロセスが支配的であるようです。プロセスは、他の人の順番でない限り、クリティカルセクションに彼の方法を強制するようです。

逆に、Dekkerのアルゴリズムでは、2つのプロセスは従順で丁寧なようです。両方のプロセスがクリティカルセクションに入ることを望み、それが他のプロセスの順番である場合、プロセスはもう入らないことを決定します。(これは飢starの自由のために必要ですか?なぜですか?)

これらのアルゴリズムはどの程度正確に異なりますか?ピーターソンの両方のプロセスがクリティカルセクションに入ろうとすると、プロセスは「私は入る」と言い、デッカーのプロセスは「あなたは入る」と言います。誰かが各アルゴリズムでのプロセスの動作を明確にすることはできますか?非公式の用語で表現する私の方法は正しいですか?


Petersonのアルゴリズムは、クリティカルセクションの問題を完全には解決しないことに注意してください。フラグ自体の読み取りと書き込みはクリティカルセクションの問題であるためです。実際に問題を完全に解決する論文は、ヘンクJMゴーマンによる「アービター:同期プリミティブを実装するためのアクティブシステムコンポーネント」です。
user3083171

回答:


24

アルゴリズムの非公式の説明は素晴らしいです。

どちらの場合でも、著者は相互排除とデッドロックの自由の両方を保証する、彼らが考えることができる最も簡単な解決策を考え出そうとしていたと思います。 どちらのアルゴリズムも飢starのない、または公平ではありません。[ed:コメントで指摘されているように、ピーターソンのアルゴリズムは飢starがなく公平です。Dekkerのソリューションは、ロード命令とストア命令のみを使用した最初の相互排除アルゴリズムでした。Edsger W.のダイクストラで紹介されましたF. Genuys、ed。、Programming Languages:NATO Advanced Study Institute、pp。43-112、Academic Press、1968の「協力的な順次プロセス」。論文を読み通すと、Dijkstraが何度も試行し、それぞれの問題を認識してから、次のバージョンでもう少し追加することがわかります。彼のアルゴリズムの非効率性の一部は、彼がターンテーキングアルゴリズムから始めて、それを修正してプロセスが任意の順序で進行できるようにするという事実から来ています。(0,1,0,1、...だけではありません)

Petersonのアルゴリズムは、Dekkerのアルゴリズムに関する10年以上の経験と後知恵の後、1981年に公開されました。ピーターソンは、正当性の証明がはるかに簡単になるように、デッカーよりもはるかに単純なアルゴリズムを望んでいました。彼の論文のタイトルから、彼がコミュニティに不満を感じていたことがわかります。 ピーターソン、GL; 「相互排除の問題に関する神話」Inf。手続き レット。、12(3):115-116、1981。非常に速く読み、非常によく書かれています。(そして、正式な方法に関するスナイドの発言は貴重です。)ピーターソンの論文は、彼がより簡単な試みからソリューションを構築したプロセスについても議論しています。(彼のソリューションは単純なので、必要な中間ステップが少なくなります。)主な違い(「従順性」ではなく「支配性」と呼ばれるもの)は、Petersonが新たに始まったためです(Dijkstraは)彼の待機ループはよりシンプルで効率的です。彼は、ダイクストラが毎回バックオフして再試行しなければならなかった間に、単純なループテストで逃げることができることに気付きました。

私はまた、Lamportの古典的なベーカリーアルゴリズムの論文であるLamport、Leslieも言及しなければならないと感じています。"ダイクストラの並行プログラミング問題のA新しいソリューション"、CommのACM 17(8):453から455、1974。Bakeryアルゴリズムは、Dekkerのアルゴリズムよりも間違いなく単純であり(2つ以上のプロセッサの場合は確かに単純です)、フォールトトレラントになるように特別に設計されています。私は特に2つの理由で言及しています。第一に、それは相互排除問題の定義に関する少しの歴史を与え、1974年までそれを解決しようとするためです。第二に、ベーカリーアルゴリズムは相互排除問題を解決するためにハードウェア原子性が必要ないことを実証するためです。

最後に、私のお気に入りはレスポートのランポートです。「高速相互排除アルゴリズム」ACM Trans。比較 システム 、5(1):1-11、1987。このホワイトペーパーでは、重要なセクションの競合がほとんどない(一般的な)場合に、Lamportが相互排除問題の解決策を最適化しようとしていました。繰り返しますが、相互排除とデッドロックの自由を保証しますが、公平性は保証しません。競合がないときにO(1)時間でN個のプロセッサを同期できるのは、通常の読み取りと書き込みのみを使用する最初の相互排除アルゴリズムです(私は信じています)。(競合がある場合、O(N)テストにフォールバックします。)彼は、競合のないケースでできることは7つのメモリアクセスであるという非公式のデモを行います。(DekkerとPetersonは両方とも4でそれを行いますが、アルゴリズムをNに拡張すると、O(N)アクセスを追加する必要がある2つのプロセッサしか処理できません。)

結局のところ、Dekkerのアルゴリズム自体は、主に歴史的な観点から興味深いと思います。ダイクストラの論文は、相互排除問題の重要性を説明し、解決できることを実証しました。しかし、何年も後知恵で、Dekkerのソリューションよりも簡単な(そしてより効率的な)ソリューションが見つかりました。


3
>>どちらのアルゴリズムも飢starがないか、公平ではありません。それは真実ではありません。ピーターソンのアルゴリズムは、飢starがなく公平です。スレッドがクリティカルセクションにあり、他のスレッドが待機ループで待機している場合-待機中のスレッドは、CSにあったスレッドがはるかに高速であっても、次にCSに入ります。

user24190のコメントを繰り返す場合のみ、Petersonのアルゴリズムは飢starがなく公平であることを強調したいと思います。何年もたって、この回答の著者がコメントに返信も修正もしなかった理由を理解できません。(私のコメントを削除できるように、回答を修正したら必ずpingを
送信してください

ピーターソンの「相互排除問題に関する神話」を購入するためのリンク:doi.org/10.1016/0020-0190(81)90106
X

:ピーターソンの「神話相互排除問題について」(Archive.org)のPDF web.archive.org/web/20150501155424/https://cs.nyu.edu/~lerner/...
strager

3

次の論文では、PetersonおよびDekkerのアルゴリズム(およびその他のアルゴリズム)の正式なモデルを示し、モデルチェッカーを使用してそれらの特性を証明しました。下の表で結果を見つけてください(列 "Deadlock"および "Divergent"はモデルを示し、 "ME" = TRUEはアルゴリズムが正しいことを、 "Overtaking" = TRUEはそれが公平であることを示します)。

R. Meolic、T。Kapus、Z。Brezočnik。ACTLW-演算子がない場合のアクションベースの計算ツリーロジック。Information Sciences、178(6)、pp。1542-1557、2008。

https://doi.org/10.1016/j.ins.2007.10.023

ここに画像の説明を入力してください


1

Petersonアルゴリズムは、dekkerのアルゴリズムが比較的ソフトで攻撃的ではないため、クリティカルセクションに入る際により厳しい圧力をかけています。それをより明確にするために、イラン文化についての例をチェックしましょう。この例に入る前に、イランの人々はどこかに入るとき、お互いに本当のソフトな振る舞いを持っていることを知っておくのは良いことです!2人のイラン人が家に入ろうとし、その家には入るドアが1つしかないと思います。

ここで、別の文化(ゾンビ文化)から2人の男性が想像します。彼らは実際にどこかに入場している間はあまり気にしません(彼が入場したいかどうかを尋ねることは敬意の問題です)。

問題に関する情報を明確にするために、次のように言うことができます。

  • 2つのイラン人= Dekkerアルゴリズムを使用した2つのプロセス
  • 2つのゾンビ= Petersonアルゴリズムを使用した2つのプロセス

それでは、各アルゴリズム(culture)で何が行われているかを見てみましょう。以下のコメントは、デッカーアルゴリズムを使用しながら家に入ろうとする最初のイラン人向けです。

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

また、ピーターソンアルゴリズムを使用して家に入る2人のゾンビもいます。これは次のとおりです。

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

両方が中に入っていないのに、もう一方がそうしている(相互排除ことに言及することは重要ですが、イランの人々ははるかに柔らかいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.