看板 Grad-ProbAsk 關於我們 聯絡資訊
要製作semaphore的 wait(s),signal(s) 需要用到Disable interrupt 和 Enable interrupt 來達到CPU不被搶走的效果 L為一個queue wait(s): singal(s): Disable interrupt Disable interrupt; s.value=s.value+1; s.value=s.value-1; if s.value<=0 then if s.value<0 then { { add process p to s.L remove process Enable interrupt; from s.L Block(p); Wakeup(p); } } Enable interrupt else Enable interrupt 假設一個process1執行wait裡的Enable interrupt,還沒執行到Block(p) 然後突然有一個process2把CPU搶走 執行了 signal裡的 wakeup(p),假如process1是即將要第一個被block住的process 但是process2搶先執行wakeup,那不就沒有救到一個process,一樣有race condition 的問題阿.....我是看洪逸的講義 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.138.111.227 ※ 編輯: gn00618777 來自: 220.138.111.227 (01/30 18:33)
ianwuzack:process2把CPU搶走時候的s.value是多少呢進的去嗎 01/30 18:50
ianwuzack:我是朝這方面想 討論看看XD 01/30 18:50
gn00618777:假設process執行玩是-1,又被process2搶 +1之後為0 01/30 19:25
gn00618777:還是可以進去阿 01/30 19:25
supergud:這是觀念問題 通常WAIT是先執行的 所以一定是一個PROCESS 01/30 20:28
supergud:通過WAIT進入CS執行再通過SINGAL才會有另一個PROCESS通過 01/30 20:29
supergud:WAIT 所以不會有你所謂的RACE CONDITION 01/30 20:30
supergud:而且wait中的enable interrupt完只會block 不會影響其他 01/30 20:34
supergud:process的執行 01/30 20:34
gn00618777:我忽略了wait通常是寫在signal前面了,感謝!! 01/30 21:31
supergud:加油 01/30 21:39