[理工] [OS] test-and-set

作者: galapous (墨)   2014-12-24 21:07:37
想問的是使用此指令在design criticl section時,
恐龍的部分程式碼如下,
do{
waiting[i] = True;
key = True;
while ( waiting[i] && key )
key = TestAndSet(&lock);
C.S.
j = ( i+1 ) % n;
while ( j != i && !waiting[j] )
j = ( j+1 ) % n;
if ( j = = i )
lock = False;
else
waiting[j] = False;
R.S
}while(true);
第三行到第五行為何不能簡寫成如下呢?
while(waiting[i] && TestAndSet(&lock))
do no-ip
不了解為什麼要用一個key去接他的值。
作者: A4P8T6X9 (殘廢的名偵探)   2014-12-24 21:30:00
為了讓人覺得有拿到 key?
作者: coilion9670 (QQ軟)   2014-12-25 03:34:00
個人淺見不知道對不對while判斷時中呼叫副程式再傳回這樣花的時間比較久當有process卡在while中無法進入臨界區間就會一直call副程式,如果寫在while判斷後就可以避免此時間的浪費call副程式還有可能有搶資源的情形,能避免應該會是一大助益
作者: galapous (墨)   2014-12-25 09:17:00
但照原本那樣寫也是每個while會call一次test-and-set不是嗎?
作者: kkk99512 (小蜘蛛)   2014-12-25 18:07:00
這份Code在出口段的地方是不是有避免Starvation的動作?如果是的話,因為要做環狀的檢查,然後指定下一個進入C.S的Process,才會在入口段的地方加入這些條件
作者: galapous (墨)   2014-12-25 18:52:00
出口有在沒process想進來時把lock設成false,完全沒動到key,所以才想說為啥不能省略掉
作者: kkk99512 (小蜘蛛)   2014-12-25 19:21:00
就是說出口地方,會指定下一個進C.S的程式是誰,不改Key因為如果改到Key的話,會造成大家一起搶Key如果有一隻很衰一直搶不到,就違反Bounded-waiting了這樣可以在保持Key不變的狀況下,指定某隻程式接續執行
作者: qoojordon (穎川琦)   2014-12-25 19:38:00
kkk的解釋蠻好der , 受教惹 , 謝謝你
作者: galapous (墨)   2014-12-25 20:21:00
如果多個process想進入的話下面是改waiting變成false假設現在process i從c.s.出來,那只有從i開始檢查一輪到process i-1都沒人想進去,才會改lock成false,這樣應該沒有bounded-waiting問題吧?因為沒人想進等於重新開始?還是我哪邊想錯了QQ
作者: qoojordon (穎川琦)   2014-12-25 20:32:00
bounded waiting有錯是發生在入口,原先有key的寫法我更正 , 這份程式後半段和Peterson不同,我誤會惹
作者: kkk99512 (小蜘蛛)   2014-12-25 21:27:00
我想我了解您的意思了,一下子沒有看清楚 不好意思而且我開始覺得您說得好像有點道理

Links booklink

Contact Us: admin [ a t ] ucptt.com