推 f111222003: 懂了 謝謝^^11/13 16:45
→ f111222003: 不好意思 又想到如果第二個while block前先wake別人11/13 17:08
→ f111222003: 讓其他人測試呢 這樣就總會輪到可以成功進去的那個pr11/13 17:08
→ f111222003: ocess進入了11/13 17:08
我有點沒懂你的意思
但如果你的意思是每個人經過都執行wake
那當你wake第一個人進去
而他還沒出來
你又在wake第二個人
而他是本來應該第二個人進去的
所以他也能通過條件再進去
那這時就不能保證只有一個人進到cs
不知道這樣有沒有回答到你的問題
※ 編輯: forever3580 (223.139.216.107), 11/13/2015 18:09:08
推 f111222003: 在while條件失敗後 process在block前去wake別人 讓其 11/13 19:02
→ f111222003: 他人去嘗試 如果有人在vs內 因為他的number還沒改成0 11/13 19:02
→ f111222003: 所以其他人也進不去 不過這樣好像變回另一種形式busy 11/13 19:02
→ f111222003: waiting了 11/13 19:02
我也不知道這樣算不算busy waiting
但是這樣還是有一個問題
你可能沒看懂我上面的回答
我講清楚一點好了
假設 ID 為 A<B<C
此時A B C 三個程式都拿到1號號碼
但A還沒ASSIGN
而B進到第一個WHILE時因為A而被BLOCK
而C此時通過第一個WAKEUP時 叫醒 B
這時B會通過第二個WHILE而進到 CS
然後A此時也通過第一跟第二個WHILE 進到CS
這時候就會有兩個程式在CS了
※ 編輯: forever3580 (118.171.146.189), 11/14/2015 23:44:22
→ f111222003: C wake up B, 11/15 17:06
→ f111222003: B不是還會在第一個while嗎(如果A還在choosing) 11/15 17:06
對欸 抱歉我那時候沒有想清楚
那你這樣的設計我也想不出有什麼問題欸
而且我覺得這樣也不會算busy waiting
我唯一想的到比較好的解釋就是
你的設計也許是正確的
但是你這樣會浪費掉非常多的時間在做block 跟 wakeup
所以效率極差
如果是這樣的話就解釋得通了
因為 如果要non busy waiting的話
你也可以用disable interrupt
但是為什麼說不行
原因是因為他效率太低
同理 你這樣的設計可能是正確的
但是他不被用在解決同步問題的理由就跟disable interrupt一樣
它的效率極低 你看他的for 迴圈 是有可能發生每當j+1就block一次的問題
所以 結論還是 busy waiting 是無法被避免的
※ 編輯: forever3580 (114.40.58.3), 11/15/2015 22:52:15
※ 編輯: forever3580 (114.40.58.3), 11/16/2015 00:04:46