【操作系统】吃苹果与PV操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/srk950606/article/details/51114974


【前言】

       为了解决进程共享资源的问题,我们在操作系统中引入了PV操作的概念;那么PV操作到底是怎么一回事呢?让我们从吃苹果入手,一起浅析PV操作。

 

【正文】

【概念】

        首先我们来看一下”P”和“V”分别是什么

 

         狄克斯特拉荷兰文定义此操作,因为在荷 兰文中,通过叫                           passeren,释放叫vrijgevenPV操作因此得名 

                                                                             ——百度百科

 

        然后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操作和吃苹果也没什么不同。


展开阅读全文

没有更多推荐了,返回首页