本文中的PV操作例子都取自上课时老师讲的例题,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等
首先,讲 semWait操作(P操作)和semSignal操作(V操作)的一些基本原则。(接下来同意称为P,V操作)
1. P操作,s - -,if(s<0)阻塞自己
2. V操作,s++,if(s<=0)唤醒一个其他进程
3. P,V操作时原语(通俗讲,就是执行PV操作时时不能被打打断的)
4. P,V操作总是成对出现的。P:资源申请/分配;V操作:资源的释放
一般每个进程的PV操作代码:
s = ? //根据资源数进行初始化
P(s)
临界区
V(s)
一.《越狱》寄信
题目描述:
T-boy给brad送信,Mike给Lincon送信,但他们送信收信都通过同一个树洞。
解答:
信号量:
Lincon: 是否有Mike的信,s1 = 0
Brad: 是否有T-boy的信,s2 = 0
Mike和T-boy: 树洞是否为空,s3 = 1
Mike: T-boy: Lincon: Brad:
write() write() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) readit() readit()
二. 家庭吃水果(对第一题的扩充,不同的只是现在资源比之前多了,变成了3个)
解答:
信号量:
儿子: 是否有苹果,s1 = 0
女儿: 是否有桔子,s2 = 0
爸妈: 是否可以放水果,s3 = 3
爸: 妈: 儿子: 女儿:
makeit() makeit() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) eatit() eatit()
三. 五子棋
题目描述:白子和黑子各有32个,黑子先行,怎样设置信号量,才能黑子先行,且是交替下子
解答:
信号量:
白子可下吗? s1 = 0
黑子可下吗? s2 = 1
白 黑
for(i=0;i<32;i++){ for(i=0;i<32;i++){
取子 取子
P(s1) P(s2)
放白子 放黑子
V(s2) V(s1)
} }
四.接力赛跑
题目描述:四个人进行接力赛跑,要求使用信号量的方法使得跑的顺序是P1->P2->P3->P4
解答:
信号量:
s2:2号接棒 0
s3:3号接棒 0
s4:4号接棒 0
P1 P2 P3 P4
P(s2) P(s3) P(s4)
run run run run
V(s2) V(s3) V(s4)