Petersonの2プロセス相互排除アルゴリズムは、死にかけているプロセスを説明しますか?


9

私は中にいると思いピーターソンのアルゴリズムのための相互排除プロセスが最初のクリティカルセクションを入力する場合は、クリティカルセクションに入るのを待って、永遠に死ぬこと、またはキャンセルされ、他のプロセスだろうループました。

この図では、プロセス1が停止した場合、プロセス1の背後にある残りのプロセスは、プロセス1の場所まで実行されますが、その後ループします。

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

クリティカルセクションに到達したプロセスが、終了する前に最初に停止した場合はどうなりますか?


私はそれに応じてあなたの質問を編集しました。アルゴリズムを3つ以上のプロセスに拡張する方法についてコメントしなかったので、質問のその部分を変更しました。問題はすでに2プロセスバージョンに存在していると思います。でも、その絵はまだ全然わかりません。
ラファエル

回答:


1

これは、ロックの実装方法によって異なります。ウィキペディアの記事のように、つまり、プロセスごとに1つのブール値でクリティカルセクションを保護している場合¹、間違いなく問題が発生します。1つのプロセスが停止しても、フラグはリセットされないため、他のプロセスは永久にループします。

実際には、さまざまな死の方法からコードを保護できます。たとえば、次のJavaスタイルの実装を見てください。

flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
  // critical section
}
finally {
  flag[1] = false;
}

これにより、システムがエラーを処理している限り、クリティカルセクションで何が起こってもフラグが確実にリセットされます。Javaでは、スタックとヒープのオーバーフローでも同じです。したがって、プロセスが文字通り消えない限り(kill²、プロセッサの障害、ネットワークの切断など)、あなたは安全です。これらの場合、ほとんどの重要でないソフトウェアは失敗することに注意してください-実行していないエラーをどのように処理できますか?-それは多くの場合受け入れられなければなりません。必要に応じて、再起動時に不整合を処理できます。

適切な言語レベルのロックを使用する場合、ランタイムシステムは消失しているロックの所有者を処理する可能性があります。これを自分でシミュレートするには、各プロセスに他のユーザーが読み取れるデッドマンスイッチを与えるか、ロック所有プロセスがまだ生きているかどうか(システムがサポートしている場合)を直接確認します。


  1. とにかく、それはうまくスケーリングしません。
  2. Javaでは、finalizeでも実行する必要があると思いますkillが、これは仕様で保証されていません。kill -9おそらく、何かをするために死にかけているプロセスを必要とするソリューションの死刑判決です。

1

仮定を確認してください。具体的には、プロセスが無期限にクリティカルセクションに留まることはありません(これには、確実に終了することが含まれます)。同期メカニズムに関する一般的な問題を解決する方法はないと思います。

このソリューションも2つのプロセスのみを対象としていますプロセスのソリューションがあります。n

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