在了解什么是PV操作前先复习下互斥和同步是啥,首先是互斥:
如图所示,为了通过独木桥获得资源,进程们每次只能通过一个,所以会导致进程间为了夺取资源而互相排斥(计算机后宫传之进程们的宫心计),而同步则可以理解为进程间协同合作共同完成一件事情:
不同进程间为了共同完成一件事情,会及时调整自身的速度(有些进程跑得快有些跑得慢),当进程之间差得太快的时候,会停下来等待后面的进程,从而达到“进度同步”,携手一起走到进程的尽头。
1)有PV操作
我们通过一个例子来说明PV操作的必要性,假如有一家奶茶店的布局如图下所示:
正常情况下没有顾客的时候,服务员就在前台等待,并且停止制作奶茶:
等到有客户来到与服务员沟通得知需要买奶茶:
服务员收到指示,开始制作奶茶,把奶茶放到“奶茶摆放区”,并且通知顾客取餐:
整个过程我们可以了解以下几件事情:
看到这里,你应该了解了以上就是PV操作的核心本质——通过信号量维持进程间同步和互斥的工具。其中“沟通”代表了“信号量”,顾客和服务员分别代表两个不同进程,负责不同的事情,假如没有PV操作,两个进程间会发生什么呢?
2)无PV操作
情况一:没有客户(缺少进程间的同步),服务员没有沟通(没有信号量),不知道要不要做奶茶,为了保证客户来了就有奶茶喝,从而疯狂制作奶茶,奶茶放在那里没人要逐渐变质:
情况二:服务员不在场(进程跑哪里去了),顾客买不到奶茶(我要的资源呢),一直在那里等待:
情况三:服务员和顾客都在场,但是因为没有沟通(信号量呢)而不知道对方想要干啥:
对于系统中的每个进程来说,其工作的正确与否其实不仅仅取决于它自身的正确性,而且也在于它在执行过程中能否于其他相关进程正确地执行同步和互斥。PV操作是实现进程同步与互斥地常用方法。P操作和V操作是低级通信地原语,在执行期间不可分割,其中,P操作表示阻塞、等待、申请一个资源,V操作表示发出、释放一个资源。
信号量用符号S进行表示:
其中P操作可以定义为:
可以看到,P操作一进来就消耗一个信号量,然后再根据信号量的余量判断是继续还是插入阻塞队列中,所以P端可以理解为一个乙方处理需求的操作端。
V操作可以定义为:
可以看到,V操作一进来就增加一个信号量,然后再根据信号量的余量判断是继续还是插入阻塞队列中,所以V端可以理解为一个甲方提需求操作端。
最后,来到题目总结下学到的知识吧:
解析:(1)收银员与买奶茶的服务员类似,没有人来买单的时候应该在等待、阻塞状态,所以B1是P(X)操作,而购书者买完书之后应该要发出付款请求,所以A1是V(X)操作,显然B1和A1应该是一套PV操作,所以“X”所表示的信号量应该为同一个。
(2)等待收银员收完费用之后,打出小票并且顾客可以走了的信息,而客户在没收到信息前需要一直等待收银员完成操作,所以A2是P(X)操作,B2是V(X)操作,且A2和B2是一对操作。
最后,就可以知道第一个空填A(信号量Sn的作用是允许N个客户进入书店,所以排除Sn),自然而然就知道第二个空填C。