クリティカルセクションアルゴリズムに関する質問
-
06-07-2019 - |
質問
オペレーティングシステムの概念第6版では、重要なセクションを実装するための1つのトライアルアルゴリズムを紹介しています。
do{
while (turn != i);
critical section
trun = j;
remainder section
} while(1);
注、Piは識別子iのプロセス、Pjは識別子jのプロセスです。質問を単純化するために、本はi、jを0と1に制限します。2つのプロセスは環境を制約します。
Question1 は、このアルゴリズムが重要なセクションのソリューションに対する3つの要件の1つである Progress 要件を無効にしますか?
私の意見では、Piが残りのセクションにあるとき、Pjがクリティカルセクションに入ることができるかどうかの決定に参加することはできません。それから、Piは要件に拘束されます。
または、進捗要件に関する私の理解がまったく間違っています。したがって、Piが残りのセクションから引退した場合、すぐに重要なセクションに入ることができなかったため、このアルゴリズムはルールに違反します。
質問2 、
turn == 0でP1に入る準備ができている場合 そのクリティカルセクション、P1はできません そのため、P0が 残りのセクション
この文の意味は何ですか?私が考えることができる限り、ターン== 0とp0が残りのセクションに同時に存在する可能性がある理由を理解できませんでした...
だから、このステートメントは間違っていますか?
解決
最初に turn = 0
と仮定します。 P0はクリティカルセクションを実行し、 turn = 1
を設定します。ここで、P0が再び実行する前に、P1がクリティカルセクションを実行する必要があります。ただし、両方のスレッドがクリティカルセクションを持っているからといって、この方法でスレッドの使用を変更したいとは限りません—実際、P1は決してその順番をとらないかもしれません。 (そして一般的な場合、これをコンパイル時に決定できません。)
基本的に問題は、スレッドの1つが実際に無期限にクリティカルセクションに入ることを望まない場合でも、順番に交互に強制されることです。
ところで、質問1の答えは正しいです。アルゴリズムは Progress 条件に失敗せず、 Bounded Waiting 条件に失敗します。