l 何为PV操作
要想理解PV操作,首先我们得先了解两个概念:同步和互斥。
² 同步
同步也就是协同完成,就是大家的目的是一样的。大家相互协调沟通的,共通完成一个目的。
比如:下面的图
目的就是将A仓库的货物搬到B仓库中,这需要搬运工甲与乙的共同协调与沟通,中转站满了那么甲歇会再搬,此时乙就得搬,如果空了或者不满,乙可以选择休息或者继续搬,但是目的只有一个,那就是完成整个协作。
² 异步,也就是互斥
互斥:就是一个人在使用资源的时候,别的人不能同步使用。
一个形象的例子就是千军万马过独木桥。
也就是一次只能允许一个人通过,不可能同时两个人一起经过独木桥。
同时还有两个重要的概念:
Ø 临界资源
临界资源(Criticalresource,CR):在多道程序系统环境中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用。如打印机,共享变量和表格。
Ø 临界区
临界区(Criticalsection,CS):进程中对临界资源实施操作的那段程序。
l 那么什么又是PV操作呢
PV操作是实现进程同步与互斥的常用方法,PV操作包括P操作和V操作,它们都是低级通信语言,在执行期间不可为0。其中P操作表示申请一个资源,V操作表示释放一个资源。
² PV操作的特点(米老师的精心讲解)
一、 以生产者消费者为例,就是说生产者消费者均有P操作和V操作。
二、 P操作改变的是自身(Sp,表示信号量),而V操作改变的是别人(Sv:表示信号量)。
三、 在PV操作中信号量不为0。
四、 PV操作具有原子性,也就是实现了解耦。
下面我们来逐条说说。
Ø 同时存在PV操作
拿生产者和消费者来说
我们可以看到PV操作不仅仅存在于生产者,同时也存在消费者中。
Ø P改变自己,V改变别人
P操作改变的是自身(Sp,表示信号量),而V操作改变的是别人(Sv:表示信号量)。而在做P操作之前,我们需要先判断Sp-1>=0,这时我们才能执行P操作。执行完之后,V操作的作用就是将信号量的Sv加1,即Sv+1;同样在消费者中我们也要同时判断Sv+1>=0,此时执行消费者的P操作,执行之后,消费者的V操作就是将Sp信号量加人,即Sp+1;之后这样不断地进行循环,因为PV操作是一个在执行期间不间断的或者说不可分割的过程。
生产者:P(Sp-1>=0)
Then
V(Sv+1)
消费者:P(Sv-1>=0)
Then
V(Sp+1)
Ø 米老师独特解(Pv操作信号量不可为0)
这是怎么一回事呢?还是以生产者消费者为例
我们知道在这个过程中,生产者消费者可用的资源数不再是1,而是多个。我们知道其实在生产者和消费者这个过程当中,生产者不可可以不断地进行生产,而消费者可以不断地消费,只要资源允许。
缓冲区是个盛放资源的地方,我们知道如果Sp<0,那么资源是不能放到缓冲区的,因为没有空间可用,同样,如果Sv<0,也是没有资源可用的,就是缓冲区没有资源可消费,但是如果消费了一个,那么就会有一个空间,Sp为负值,代表的是生产者生产的东西处于 一个等待状态,一旦有空间那么就会进入缓冲区,即使有那么一瞬间Sp为0,但是同时消费者也会立刻进行消费,生产者又会进入生产,因为PV操作是一个不间断的过程。
生活中的实例(公交车)
比如我们乘坐公交车时,就是一个很好的例子,公交车上的座位是有限的,但是我们知道其实坐公交的不仅仅有做的,而且有站的,只有有人下车,那么只要有等待座位的人,那个座位就会立刻被占,空着的状态很短暂,基本可以忽略,也可以说只是一个由一个人坐到另一个人坐的中间转换过程。
12306购票(典型实例)
想必大家都有网购车票的经历吧,就是一个典型的PV操作,米老师幽默的讲述了这一点。
想想自己的亲身经历,也是,尤其是过年回家的时候,购票,好难啊,我们都在等待人不要票,然后自己赶紧抢。我们知道售票买票就是一个PV操作,有票可买的时候我们就买,没有的话只能等着,一旦有人退票,我们肯定在刷票的时候立马抢到,排队买票就是一个PV的操作。
Ø Pv操作原子性,也就是实现了解耦
以生产者消费者问题为例,均是对缓冲区的操作,但是使用PV的算法,可以把信号量看成是Sp和Sv,Sp是生产者看缓冲区的状态,而Sv是消费者看缓冲区的状态。其实他们两者都是看缓冲区的状态是否能满足自身的需求,只是两者的看法是对立的。生产者是看缓冲区是否为空,而消费者看是否为满的。
解耦实现详见链接
http://blog.csdn.net/han_yankun2009/article/details/8761528;
http://blog.csdn.net/hejingyuan6/article/details/8776429