看板 Grad-ProbAsk 關於我們 聯絡資訊
※ 引述《i78524 (Shulei)》之銘言: : 這次想請教大家CS DISIGN的演算法,恐龍本後面習題的Mcguire's algorithm : 這個algo整個看不懂...有沒有什麼比較好的情境可以看懂他?(或是有解釋文章之類的) : 為了不要浪費版面,code和問題部份以圖片呈現 : (目前比較大的問題在其中一段) : (code最上面的注解來自於網路上抓到的chaly77714大的os筆記,恐龍似乎沒有對這個程 : 式的控制變數提太多...) : 問題圖片網址: : http://i.imgur.com/wLhmd.jpg : 好煩喔...看這支程式從早上10點看到下午3點一點進展都沒有 (又浪費一天...) : 這個演算法真的比麵包店難懂很多...(而且我覺得這段看懂之後一定還有其他問題...) : 根本快崩潰了... : 都11月底了連這個都還看不懂...真是難過 : 懇請各位高手大德幫忙,拜託了,真的拜託了! 謝謝大家... 這個code的前段主要分成兩個while loop, 第一個的離開條件是"從擁有turn的編號開始到自己都沒有人want-in", 如果有的話就會卡在這個while loop裡面。 這個while loop只會檢查turn到自己, 所以如果現在6號先檢查完發現沒有人想進去,它就會變in-cs, 接著如果5號也想進去,因為1到4號依然沒有人想進去,它也會變in-cs, 依次類推,可能會很多個process都把自己改成in-cs。 第二個while loop,也就是你看不懂的那一段, 離開條件有兩種,第一種是在j==n時離開, 這種情況代表現在沒有其它process有in-cs狀態, 所以下一個if會跟著檢查現在擁有turn的人是不是idle,或者自己就有turn, 如果都成立就進去break,離開do while loop。 第二種離開條件是有其它人有in-cs的狀態,那麼這時j會還沒到n就離開, 所以下一個if的第一個條件一定是false而不會break, 接著會回到do while的頂端去把自己改回want-in狀態重新檢查。 你的code在critical section前面少了一段turn = i; 也就是要把turn值改成自己, 不然如果現在是因為擁有turn的人idle才讓自己進來的, 這樣可能會造成turn值無法以process編號的順序傳遞下去, 這樣在bounded waiting時可能會無法驗證。 這個解法其實就是Peterson's solution with n processes 只是後來的Peterson's solution變成2 processes的了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.136 ※ 編輯: wheels 來自: 140.112.30.136 (11/28 12:32)
i78524:wheels大,謝謝你還特地開一篇來解釋他! 11/28 12:54
i78524:我終於弄清楚第2個WHILE的的功用了 11/28 12:54
i78524:trace過n次之後現在我完全弄懂整支程式了 11/28 12:55
i78524:這題是請我們把這個CS設計改成monitor,所以我本來應該是 11/28 12:55
i78524:正確無誤,想不到在bound wait還有小缺失... 11/28 12:56
i78524:謝謝您的提醒與指教,真是太感謝您了 :) 11/28 12:56
i78524:(因為第8版課本題目code中CS上面並沒有 turn = i 這一段) 11/28 12:59
wheels:其實後來想想如果以bounded waiting的定義來說,沒有加那行 11/28 21:21
wheels:可能會允許某個process i在process j前進入2次,這個2次也 11/28 21:21
wheels:算是有限次數,所以應該也沒有違反。那行應該是洪逸自己加 11/28 21:22
wheels:的吧XD 11/28 21:22
sneak: 算是有限次數,所以應該 https://daxiv.com 09/11 14:37