技巧:
1. 按从P1到P5的顺序分析
2. 箭头指向一端是P操作,另一端是V操作
分析:
先从P1出发,P1->P2的信号量用S1标示,
再从P2出发,P2->P3之间是S2,P2->P4之间是S3
同理可得
P3->P5之间是S4
P4->P5之间是S5
又因 箭头指向一端是P操作,另一端是V操作,所以对于S1来说 a处是V(S1),b处有对应的P(S1)
对于S2来说 c处有V(S2),d处有P(S2),
对于S3来说 c处有V(S3),f处有P(S3),
对于S4来说 e处有V(S4),g处有P(S4),
对于S5来说 已有V(S5),g处有P(S5),
综上所说
a处:V(S1)
b处:P(S1)
c处:V(S2),V(S3)
d处:P(S2)
e处:V(S4)
f处:P(S3)
g处:P(S4),P(S5)
技巧:
消费者要等待生产者生产出产品才可以往下执行,因此消费进程的第一步肯定是P操作且信号量S大小为0;
生产者在生产结束后,要唤起消费者从缓冲区中取产品,因此生产进程最后一步肯定是V操作,且信号量名称要与第一步保持一致,即S,系统才能循环运行起来。
P操作是从自身往外输出东西,因此是S-1,又因为只要自身不为0便可对外输出,因此 S<0 [P操作S-1,往队列插入数据,S<0]
V操作是从外部拿东西进来,因此是S+1,即使自身为0了,还可以从外部继续拿东西,因此S<=0 [V操作S+1,从队列取出数据,S<=0]