开门见山:PV操作解决的是并发进程之间某些约束关系的问题,心急的直接看【做题分析技巧】
P操作会阻塞;
V操作会唤醒P操作;
P操作与V操作成对出现;
💯原理
P(S)、V(S)中的S就是信号量
T--进程操作阻塞(不会往下执行)
F--继续循环操作(执行下面的内容)
✅示例分析
这部分如果有点晕,可以直接看后面的【做题技巧分析】之后再回头看这里就好了。
设置S1初值为1,S2初值为0.
😈PV操作的流程【我个人理解】:
①生产者角度,S1=1,先进行P操作,S1=0,将产品送到缓冲区后继续循环生产者S1-=1,=》 S1=-1,此时S1<0了,阻塞当前进程(等待消费者发出继续的指令)
②S2+=1 =》 S2=1
③消费者拿到S2信号量后进行P操作,S2-=1 =》 S2=0,消费者开始使用缓冲区的商品,此时对S1进行V操作,S1+=1 =》 S1=0,消费产品。生产者拿到S1后,发现S1不小于0,阻塞停止,生产者继续进行。
消费者继续循环S2-=1 =》 S2=-1,此时S2<0了,消费者将阻塞住,不会继续从缓冲区取东西,直到生产者再次向缓冲区中加入新产品,S2至0时为止。
先从消费者开始也是类似的。S2初值是 0,P(S2)后得-1<0此时会被阻塞,防止从空集合中取出内容。
📖做题分析技巧
下面是书店购书的一个PV操作例子
注意:
①P操作具备阻塞的职能,V操作不具备阻塞能力。
②PV操作关键要找到约束,找到谁是因变量,谁是自变量,谁约束谁。【PV操作是成对出现的】
③一对儿PV操作信号量是相同的。
看题发现已经存在了一对PV操作,信号量为Sn,Sn的值为n,很容易想到这对PV操作的作用就是控制进入书店的人数的。当人数达到n了,阻止人继续进入书店,这种状态直到有人付款离开书店为止。
再来看题发现还有两对PV操作,首先通过图能知道购书者和收银员之间存在约束关系,收银员要等待购书者付款才能工作,购书者要等待收银员反馈才能离开书店。那么这两对PV操作就是控制这个约束的。
先从购书者分析,购书者开始付款了,收银员才能开始收款,所以a1与b1之间是一对PV操作,进一步分析,如果没有购书者付款,那么收银员是不能执行收款操作的,也就是说收银员进程应该及时阻塞,故b1应该是P(S1),a1应该是V(S1)。
购书者发起付款操作的时候,不能马上离开书店,因为他要等收银员的反馈,付款成功拿到 小票才能离开,也就是说购书者在等待收银员反馈的时候应该及时阻塞住,故a2与b2之间是一对PV操作,且a2是P(S2),对应的b2就是V(S2)。
再检查一遍看看是否合理呢?
从收银员角度开始,假设没有人付款,P操作能及时阻塞,使得收银员进程不会进入收费状态,所以b1位置放P操作没有问题,进一步分析信号量S1的初始值应该为0,经过b1后S1为-1,阻塞。
从购书者角度看,开始付款的时候激活收银员进程,所以a1是V操作也没有问题,通过a1的操作,S1信号量又为0了,收银员进程可以进行收费了。
再返回收银员角度,收费完毕后要给购书者信号,购书者从才能离开,所以b2为V操作没有问题。
从购书者角度看,a2应该是P操作,应该及时阻塞住。进一步分析,S2信号量也应该是0才符合要求。
😁总结
PV操作从做题的角度出发,我认为首先要找到约束关系,就是谁和谁是一对约束,第二步确定这对约束谁是P谁是V(用反证方法推一下看看),最后一步考虑信号量,信号量为多少取决于是否马上阻塞还是说执行几次后再阻塞,这个要结合具体问题具体分析。