【前言】
为了解决进程共享资源的问题,我们在操作系统中引入了PV操作的概念;那么PV操作到底是怎么一回事呢?让我们从吃苹果入手,一起浅析PV操作。
【正文】
【概念】
首先我们来看一下”P”和“V”分别是什么
狄克斯特拉用荷兰文定义此操作,因为在荷 兰文中,通过叫 passeren,释放叫vrijgeven,PV操作因此得名
——百度百科
然后PV操作是为了实现临界区管理而发明的一对原语操作。
临界区:并发进程中与共享变量有关的程序段称为临界区。
原语:不可中断的过程。
大家明白了吗? 好吧我知道你肯定蒙圈了。哈哈!要是这就明白了我往下也不用写了。哈! 不过没有关系,相信你看完这篇文章后会对PV操作有一个新的认识的。好了,不说废话了,相信大家也不是来看我抄概念的,让我们一起来吃苹果吧!
【原理】
【互斥进程】
【吃前准备】
首先我们给一些专有名词先做个变身:
进程A——王大吃苹果
进程B——钱二吃苹果
进程C——赵三吃苹果
临界区资源——苹果
临界区允许同时进入进程数——苹果数
【开吃】
现在箱子里有一个苹果,王大看见了想吃,王二也想吃,可是苹果只有一个不能同时给两人(别给我说一人一半啊,资源一人一半就死锁了)于是他们约定谁先抢到谁先吃,但是吃完要再买一个苹果放这儿(资源使用后不会损耗)。
可是如果王大在吃苹果的时候,钱二也来找苹果打开箱子这样就造成了浪费,我们不希望出现这种情况(并发进程会出现时间相关的错误,所以共享变量同一时间一个进程使用)。
所以我们就约定,在箱子写个1(信号量S),无论谁来了,开箱子之前把箱子上的数减一(p操作),等吃完苹果,买了新的,放回去的时候,关上箱子再把箱子上的数加一(V操作)。
这样如果谁来了,站在箱子前,减一之后是负数,那么此时他就应该等待,而且负几就有几个人在等待。
如果谁买回苹果来,关上箱子后,加一之后小于0,那么此时还有人在等待苹果,就把苹果交给下个人吃。而且负几就有几个人在等待。
这就是互斥的PV操作。
【同步进程】
【吃前准备】
宋荣凯削苹果--进程A
郑涛吃苹果--进程B
临界区资源——苹果
临界区允许同时进入进程数——苹果数
【开吃】
这种情况下,就要在上述互斥情况下稍作变化了。
如果我们还是在箱子上有一个数,那么我们就不能很好的体现同步的关系。如果现在有两个苹果在桌子上,那么郑涛就可以连着吃两个苹果,那么这是不符合同步进程要求的。
所以我们更新了机制, 箱子上写两个数 一个是给宋荣凯看的, 一个是给郑涛看的。 宋荣凯削苹果之前给自己的数-1,如果小于0就不等待(P(宋荣凯));削完一个苹果,给郑涛的数+1.(V郑涛)。郑涛吃完也是一样。(P郑涛)(V(宋荣凯))
这就是同步进程下的PV操作。
【混合进程】
这个例子我就不编了,大家自己糅合一下。
【伪代码】
<span style="font-size:24px;">procedure p(var s:samephore);
{
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
}
procedure v(var s:samephore);
{
s.value=s.value+1;
if (s.value<=0) wakeup(s.queue);
}</span>
【总结】
艺术来源于生活而高于生活,而编程则是一门艺术。 多思考,勤动脑!PV操作和吃苹果也没什么不同。