作者thanksgive (乾溫)
看板Grad-ProbAsk
標題Re: [問題] OS的Semaphore製作Monitor(Hoare)
時間Sun Jul 31 21:46:53 2011
※ 引述《eddiejacky (eddiejacky)》之銘言:
: ※ 引述《pigyellow ( ~犬!)》之銘言:
: : 共享變數宣告:
: : mutex: Semaphore = 1 (提供對Monitor的互斥控制)
: : next: Semaphore = 0 (儲存發出x.signal的P)
: : next_count: Integer = 0 (儲存發出x.signal的P的個數)
: : x_sem: Semaphore = 0 (儲存發出x.wait的P)
: : x_count: Integer =0 (儲存發出x.wait的P的個數)
: : x:condition 變數之製作
: : 製作 x.wait
: : x_count = x_count + 1
: : if next_count > 0 then signal(next); <----這行的意義
: : else signal(mutex);
: : wait(x-sem);
^^^^^^^^^^
請問為什麼不是這行來確保Hoare 而是上面的 signal(next)呢?
: : x_count = x_count -1; <----為什麼要回扣
: : 製作 x.signal
: : if x_count > 0 then
: : begin
: : next_count = next_count + 1;
: : signal(x-sem);
: : wait(next); <----這行的意義
: : next_count = next_count - 1;
: : end
: : 小弟不太了解這幾行的目的是什麼
: : 希望有人可以幫忙解說一下
: : 謝謝
: Q1:確保 Hoare性質
: Q2:因為某個在waiting queue 被救起來,所以在waiting queue裡的process總數要減一
: Q3:確保 Hoare性質
: Hoare性質:
: 當Q發出 x.wait 而block住
: 而P發出 x.singal 去救Q,P必須先自己block住,等到Q完成或再度block住
: 才能恢復執行
另外想請問external procedure F 會被換成
wait(mutex);
...
body of F
...
if(next_count>0)
signal(next); //這行看不懂它的意思:(
else
signal(mutex); //這行是不是指"現在monitor沒人使用了,
//解鎖讓外面的process使用"
該怎麼和上面的x.wait()與x.signal()配合?
我看了好久還是看不出來 T_T
謝謝各位~~
※ 編輯: thanksgive 來自: 61.224.223.52 (07/31 21:52)
→ thanksgive:if next_count > 0 then signal(next);是確保Hoare 08/01 00:36
→ thanksgive:沒錯,想了好久QQ signaler要resume的兩可能分別是 08/01 00:37
→ thanksgive:在Q離開或再度等待時,也就是body F和x.wait的 08/01 00:38
→ thanksgive:signal(next); 08/01 00:39