2011-12-28 18 views
-1

以下の相互排他問題のアルゴリズムは、相互排除特性を満たしていません。それはデッドロック、飢えを満たしていますか?また、競合がなくても正しく動作していますか?クリティカルセクション2回目の試行ですか?

int p=1; 
int q=1; 

process P         process Q 
while(true){         while(true){ 
a1 : nonCriticallSection1;     a2 : nonCriticallSection1; 
b1 : while (q !=1){ do nothing}    b2 : while (p !=1){ do nothing} 
c1 : p=0;         c2 : q=0; 
d1 : critical section      d2 : critical section 
e1 : p=1;         e2 : q=1; 
    }           } 
end P;          end Q; 
+1

宿題の場合は、「宿題」タグを追加してください。また、あなたの質問を明確にしてください、私はどのように "デッドロックを満たす"か分からない。 – thiton

答えて

0

アルゴリズムは、デッドロック、飢餓状態、および競合状態では問題ありません。
しかし、この種のソリューションはスケーラビリティがなく、おそらくあなたが探しているものではない2つのプロセスに対してのみ機能します。
便利なアルゴリズムを見つけるには、wikipedia'e entry for deadlockをご覧ください。

EDIT:プロセスがクリティカルセクションに入るときのプロセスごとのフラグを設定すると、私は気にしません。したがって、プロセスPがクリティカルセクションを所有しているがプロセスQが入力したい場合、それはPがクリティカルセクションを終了するときに実行されます。なぜなら、chedulerがPを再実行することを選択しても、Pはq == 0かどうかをチェックし、 。
もちろんあなたの例では、それは勉強のケースです。ポーリングや無限のサイクルを使用するため、実際のアプリケーションでは機能しません。私はそれを使用しようとしないことを強くお勧めします。

+0

ありがとうandreapier ...このアルゴリズムにどのように飢餓が当てはまるか説明できます。私はそれを理解することはできません。アルゴリズムと同様にデッドロックすることはできません。ではない? – desh

+0

ありがとうございました – desh

関連する問題