pv操作

         pv操作是电脑中比较有意思的一个点,主要是用来解决电脑运行时的进程互斥的问题。

         比如说,系统现在有四个灯,进程1的任务就是开灯,而进程2的任务是关灯。在进程1进行开灯的操作的时候,要先看看是否有关着的灯。而在进程2进行操作的时候,需要看看是否有开着的灯。如果进程1执行,则进程2就不能执行。如何在开灯执行以后关灯可以在短时间内得到执行呢?这个时候我们就可以用pv操作来解决这个问题。

         我们在这里引入一个信号量的概念s,代表有多少个资源。假设刚开始的时候灯都是关着的,那么,对于进程开灯来说,s1的值为4(有四个关着的灯),代表电脑拥有的进程开灯可以用的资源数量为4。对于进程关灯来说,s2的值则是0(所有的灯都是关着的),代表进程关灯可用的资源数量为0.

         当我们进行开灯的操作的时候,首先需要检查s1的值是否大于0,也就是说,我们需要检查是否有超过一个的灯是关闭状态供开灯时使用,如果s1的值大于零,表示有关着的灯,这时我们就可以进行一次开灯的操作。为了避免在执行开灯操作的时候别的进程调用开灯要用到的资源,这时我们要先申请使用一个s1。这些操作具体的做法是,将代表进程1可用资源的s1的值减1,如果得到的新的s1的值大于0,那么,我们就可以得到这样的结论:电脑拥有供开灯的进程调用的资源,(被减后的s1仍然大于0)。并且已将开灯需要使用使用的资源锁定(s1已经进行了减1的操作)。

         申请完以后执行开灯操作,这时,可以供关灯使用的资源就多了一个。那么我们需要将代表关灯可以使用的资源s2的值增加1,这时我们进行的具体操作是将s2加1,代表电脑多了一个可以关灯使用的资源。

         进程关灯在得到资源后,进行类似于开灯的操作, 先通过s2减1的方式验证是否有可以供关灯使用的资源,然后进行操作,操作结束后,可以供开灯使用的资源就多了一个,这时我们将代表可以供开灯使用的资源s1的数量增加1.

         然后再次进行开灯的操作,如此循环,就解决了开灯和关灯互斥使用资源的问题。这就是我们的pv操作的原理。在我们把s1和s2的值减1的时候,我们进行的操作称为p操作,分别是p(s1)和p(s2);在我们把s1和s2的值增加1的时候,我们进行的是v操作,分别是v(s1)和v(s2)。

        

原文地址:https://www.cnblogs.com/liyasong/p/6387865.html