作者gn00618777 (123)
看板Grad-ProbAsk
标题[理工] [OS]-Semaphore
时间Sat Jan 30 18:24:33 2010
要制作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)
1F:推 ianwuzack:process2把CPU抢走时候的s.value是多少呢进的去吗 01/30 18:50
2F:→ ianwuzack:我是朝这方面想 讨论看看XD 01/30 18:50
3F:→ gn00618777:假设process执行玩是-1,又被process2抢 +1之後为0 01/30 19:25
4F:→ gn00618777:还是可以进去阿 01/30 19:25
5F:推 supergud:这是观念问题 通常WAIT是先执行的 所以一定是一个PROCESS 01/30 20:28
6F:→ supergud:通过WAIT进入CS执行再通过SINGAL才会有另一个PROCESS通过 01/30 20:29
7F:→ supergud:WAIT 所以不会有你所谓的RACE CONDITION 01/30 20:30
8F:推 supergud:而且wait中的enable interrupt完只会block 不会影响其他 01/30 20:34
9F:→ supergud:process的执行 01/30 20:34
10F:→ gn00618777:我忽略了wait通常是写在signal前面了,感谢!! 01/30 21:31
11F:推 supergud:加油 01/30 21:39