PV操作,是软考当中一个很重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少,听得稀里糊涂,也不是很理解,在小编的理解当中,PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。做过几套软考试题,看过软考视频,对PV操作有了一点傻傻的理解,PV操作属于操作系统方面的知识,在前面的博文中,小编介绍过进程和存储,这篇博文,小编主要和大家来学习一下PV操作的相关知识,小编会循着下面这张图的脉络,一一介绍,首先,我们来看一下整体的有关PV操作知识点的框架。
接下来,小编就沿着上图的痕迹,对PV操作进行一一解剖,有不同意见的小伙伴欢迎讨论交流。
概念
同步
关于同步,小编理解的意思是“协同合作,齐心协力”,换句话说就是我们的目标只有一个,大家的目标都一致,就是在大家的努力下共同完成某一件事情。看下面一张图:
我们来简单分析一下这张图,A仓库有一些货物,然后我们需要把A仓库的货物搬运到B仓库,由搬运工甲和搬运工乙来完成这个任务;那么他们的目标就只有一个,就是把货物从A仓库搬到B仓库去,共同奔着这个方向去努力,这是一个典型的同步问题。
互斥
古语中有句话,能很好的表达出互斥的概念--千军万马过独木桥,很简单的一句话,把互斥的概念表达的淋漓尽致,就好比有一个大部队来到独木桥边,想要走过独木桥,首先要做的工作就是排好队,一个一个来,挨个走过独木桥。还有一个很好的例子可以说明互斥的概念,比如打印机,打印机这个工具就非常好的体现了互斥的概念,比如,前阵日子,大家自考,各种打印真题,打印知识点,如果你去打印的时候,已经有人正在使用打印机,那么你需要做的就是静静的等待,这也是生活中一个能很好说明互斥概念的例子。在互斥中,还有两个重要的概念,临界资源和临界区,临界资源就是我们上文提到过的互斥,各个进程间需要互斥方式对其进行共享资源,如打印机。临界区就是进程访问临界资源的那段代码。
P? V? PV?
P操作:使S=S-1,若S>=0,则该进程继续执行,否则该进程排入等待队列。
V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。
PV操作:解决互斥和同步的问题。这样理解起来,很费解,也不知道是怎么个意思,我们还是从生活着手,看看PV是如何操作。
生活中的PV操作
生产者--消费者问题
首先我们来看下面一张图
这是一个著名的同步问题,虽然生产者进程和消费者进程都是异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。这是一个单缓冲区情况。那么这个单缓冲区的PV操作,应该是怎样的呢?我们来看看:
我们来分析一下这个流程,前提是S1初值为1,S2初值为0。我们需要明白P操作减1,V操作加1,然后这个分析就变得没有那么困难了,我们先对初值进行一下说明:
a、我们把S1的初值设为1:是说明缓冲区还有一个空间可以使用,对于生产者而言,每一个缓冲区的一个空间就是一个资源,也就是说,一开始运行的时候,就允许生产者投放一个产品到缓冲区,
b、然后投放到缓冲区之后,我们来看消费者进程,P(S2):首先我们要进程一个判断,判断缓冲区中是否有产品,对消费者而言,缓冲区中有产品,就代表有一个资源可以使用,但是最初状态那个缓冲区中是没有资源的,所以S2的初值应该是为0。我们刚才都提到了资源的问题,就是信号量的一个值应该是表示资源的数量,但是就消费者和生产者而言,对于他们的资源是不同的,概念是不同的,生产者:缓冲区有多少个空格,就有多少个资源;而对消费者来说,缓冲区有多少个满的格,就有多少个资源,是刚好是相反,所以当消费者从缓冲区取出一个产品之后,对于生产者而已,就多了一个资源。
关于这个进程,我们可以这样来理解:
1、生产者:P(S1),那么P(S1),S1=S1-1,得到P(S1=0)这个进程还能进行,那么生产者把一个产品投放到缓冲区。
2、V(S2),S2=S2+1,S2初值为0,所以S2=S2+1>0,那么就激活了P(S2),那么消费者就能取出一个产品。
3、消费产品:消费产品之前,还有一个V(S1),就激活了P(S1),让生产者继续投放产品到缓冲区;这是单缓冲区分析。
我们接下来看一个相对来说,有点复杂一点点的--多缓冲区的PV操作,对比我们的单缓冲区的PV操作,我们还是来分析生产者和消费者的问题:
对应的PV操作如下图
有一点区别,就是要引用互斥的概念,因为缓冲区是一个临界资源,它始终只能有一个进程对其进行操作,所以我们就可以用一个互斥信号量来完成这一点,所以当某一个进程要使用到缓冲区之前,我们就进行以下判断,判断这个缓冲区现在是不是空闲呢?是不是有生产者或者消费者的进程在使用这个这个缓冲区呢?如果有,mute的初值为1,当有人使用这个缓冲区的时候,这个mute的值就由1变为0,这时,第二个进程向再来操作这个缓冲区,就不可能了,就会被阻塞。
公交车司机与售票员的问题:
我们来分析这个过程,我们把S1和S2的初值都设为0。我们来分析分析:
1、P(S1):S1=S1-1=-1,那么司机进程就被暂停,等会售票员进程,售票员关车门。
2、V(S1):S1=S1+1=0,激活了司机进程,那么司机就开始启动车辆、正常行驶、到站停车,当然售票员也 有可能同时在售票。
3、P(S2):S2=S2-1,售票员在售票之后的进程就被暂停,等待司机进程。这样就避免了售票员售票之后就开车门了。因为这是不允许的。
4、V(S2):S2=S2+1,司机到站停车之后,就激活了售票员P(S2)的进程,那么售票员就进程 开车门、上下客的操作。那么这个进程就完成了。
小编寄语:该博文小编主要浅显的讲述了一下PV操作的有关知识,分别三个方面对PV操作进行相关阐述,首先是概念,包括同步和互斥的概念,其次是什么是PV操作,最后,从生活入手,讲解了两个PV操作的例子,生产者消费者问题和公交车司机和售票员的问题,还有一个例子就是上次米老师上课提到的12306售票系统和顾客之间的关系,也是PV操作的一个很好的例子典型。这些例子都是我们生活中实实在在存在的,理解起来比较容易,也比较容易接受,软考之路,未完待续......