私は中にいると思いピーターソンのアルゴリズムのための相互排除プロセスが最初のクリティカルセクションを入力する場合は、クリティカルセクションに入るのを待って、永遠に死ぬこと、またはキャンセルされ、他のプロセスだろうループました。
この図では、プロセス1が停止した場合、プロセス1の背後にある残りのプロセスは、プロセス1の場所まで実行されますが、その後ループします。
クリティカルセクションに到達したプロセスが、終了する前に最初に停止した場合はどうなりますか?
私は中にいると思いピーターソンのアルゴリズムのための相互排除プロセスが最初のクリティカルセクションを入力する場合は、クリティカルセクションに入るのを待って、永遠に死ぬこと、またはキャンセルされ、他のプロセスだろうループました。
この図では、プロセス1が停止した場合、プロセス1の背後にある残りのプロセスは、プロセス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
²、プロセッサの障害、ネットワークの切断など)、あなたは安全です。これらの場合、ほとんどの重要でないソフトウェアは失敗することに注意してください-実行していないエラーをどのように処理できますか?-それは多くの場合受け入れられなければなりません。必要に応じて、再起動時に不整合を処理できます。
適切な言語レベルのロックを使用する場合、ランタイムシステムは消失しているロックの所有者を処理する可能性があります。これを自分でシミュレートするには、各プロセスに他のユーザーが読み取れるデッドマンスイッチを与えるか、ロック所有プロセスがまだ生きているかどうか(システムがサポートしている場合)を直接確認します。
finalize
でも実行する必要があると思いますkill
が、これは仕様で保証されていません。kill -9
おそらく、何かをするために死にかけているプロセスを必要とするソリューションの死刑判決です。