有小伙伴要考软设证,遇到个PV信号量的问题,没整的很明白,网上各种都说的云里雾里,这里一起研究下,题目如下:
某书店有一个收银员该书店最多允许n个购书者进入。将收银员和购书者看作不同的进程,其工作流程如下图所示。利用PV操作实现该过程,设置信号量S1,S2和Sn,初值分别为0,0,n.则图中a1,a2及b1,b2应该填入?

信号量s:一般代表当前某类型资源(或者某种条件)可被进程同时操作的数量,如果小于0则代表操作该信号量类型的进程应该被挂起等待,大于或等于0则能继续执行
P操作:表示申请一个信号量资源,会将信号量S-1,然后判断S,小于0则挂起等待
V操作:表示释放一个信号量资源,会将信号量S+1,并且唤醒其他等待该信号的线程
这个题目不好理解,原因有下面几个
1:整个购书流程不清楚,是先收银还是先付款这个流程很关键,但这里没有说明
eg:流程1:进店->购书->收银->付款->离开
流程2:进店->购书->准备付款->收银->离开
不同的流程,导致触发的操作会有不一致
2:资源不清晰,这里信号量代表的临界资源不清晰,刚看题目很容易认为付款人是临界资源,因为同时只允许一个人付款,这里有2个信号量,正常是有2个临界资源,但S1,S2各代表哪边的资源也没有清晰指定
3:这个题目的解不一定是唯一的,也就是说要达到线程同步,可能有多种方式可以做到,甚至有时用一个信号量也可以(不是说这题用一个就可以),信号量的设计,使用是很灵活的;
以上3点综合起来,让这个题目很迷…一时间真不好理解,好的是,它是个选择题,可以从选项排除
1:这里Sn 的使用是很清楚的,进店->出店,所以选项里带sn 操作的肯定可以排除了
2:信号量操作很关键的点就是,线程唤起做操作前一定是需要做P操作的,不然这个资源就可能被无限线程操作,所以对b1来说一定是个P操作,(选项排除sn 也只剩P 操作选项了…),同样对a1,a2 中一定有个P操作,表示付款进程占据了资源,很显然就是不能上来就P操作,因为s1,s2初始信号量都为0,上来P操作线程就直接挂起了,后面所有流程也就没有了(因为b那边肯定是P操作了),即a1是V,a2是P,这里可以得到1的答案为A,从选项可以看出S1代表付款资源,S2代表收银资源,所有b1操作肯定是P(s2),得到2的答案为C
1:完整流程
题目真正的流程是:
进店->购书->进入付款区域->收银->离开
2:临界资源
A:进入付款区域这个条件,每次只能一个顾客进入
B:可以理解为收银机,同时只能有一个人操作收银机
这里要把进入付款跟收银看为一个整体,即能进入付款区就必定能被收银员收银;
所以整个流程也很清晰了
顾客进入付款区后需要做2件事
1:通知收银员(释放收银机权限/钥匙)=>V操作
2:阻止其他人进入=>P操作
并且这2件事之间应该是原子性的,否则付款区域就可能被其他人进来了,严格来说我认为这里应该先阻止其他人进入等待区即先P操作后在给钥匙给收银员,但是题目限制初始信号量为0,先P操作后面就被挂起了,所有说信号量的设计跟使用是很灵活的,可以有其他很多方式也能达到目的,这里只能以题目进行
收银员收到信息后开始收银,此时他需要保证其他人员不能再用这个收银机收银了即 P操作,等收银完成,需要通知排队区域让下一个顾客进入付款区即 V操作
1:一般信号量S都会代表某个临界资源或者限制条件
2:信号量的使用跟程序流程是密切相关的,设计前一定要理解好流程
3:信号量使用是非常灵活的,可以有多个方式达到相同目的,一切以题目为中心