欢迎来到网际学院,让您的头脑满载而归!

【操作系统】——PV操作

发布日期:2018-01-29 17:05:06 作者:管理员 阅读:1334

       大家都说操作系统中的PV操作部分看不懂,确实我在专业课中学习这门课时,PV操作被列为书中的重点和难点,就是因为它不好理解。当时自己听完课也是一头雾水,到期末考试结束,也没弄明白这是怎么一

【操作系统】——PV操作

       大家都说操作系统中的PV操作部分看不懂,确实我在专业课中学习这门课时,PV操作被列为书中的重点和难点,就是因为它不好理解。当时自己听完课也是一头雾水,到期末考试结束,也没弄明白这是怎么一回事,更没有意识到PV操作的重要性。米老师的一堂课,让我开始对它产生兴趣,于是才有了这篇博客。首先就来说说什么是PV操作吧!


       什么是PV操作?


       在说什么是PV操作前,首先讲讲它的历史(咱也像写书的人一样,上来先介绍它的历史和发展)

       PV操作是有名的计算机科学家狄克斯特拉为了解决一类问题而创造的,例如:假如P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫“PV操作”。我相信,很多人都很纳闷为什么他会取名叫“PV”操作呢?其实这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,“通过”叫passeren,“释放”叫vrijgeven,PV操作因此得名。这也是在计算机术语中不是用英语表达的极少数的例子之一。

       说了那么多,那到底什么叫PV操作呢?PV操作有P操作和V操作组成,它们是两个不可中断的过程,也叫做原语。它是为了能够实现对于并发进程中临界区的管理要求。


       为什么要有PV操作?


       其实这个问题上面也说到了,是为了防止两个进程并发时产生错误。这里不得不说的就是,并发进程之间分为两种,一种就是有交互的,一种是无任何关联的

       很简单,没有关联的并发进程是相互独立的,谁也不影响谁。但是交互的并发进程可就不一样了,因为他们是共享资源的,一个进程运行时,经常会由于自身或外界的原因而被中端,且断点是不固定的。也就是说进程执行的相对速度不能由进程自己来控制,于是就会导致并发进程在共享资源的时出现与时间有关的错误


       PV操作的使用


       名词解释


       临界区:我们把并发进程中与共享变量有关的程序段称为临界区。

       信号量S:信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。


       P操作和V操作


       P操作P(S):将信号量S减去1,若结果小于0,则把调用P(S)的进程置成等待信号量S的状态。即为请求资源。

       V操作V(S):将信号量S加上1,若结果不大于0,则释放一个等待信号量S的进程。即为释放资源。

       表示过程如下:

       Procedure P (Var S:Semaphore)

       begin

           S:=S - 1;

           if S<0 then W(S) 

       end; { P }

       

       Procedure V (Var S:Semaphore)

       begin

           S:=S + 1;

           if S< = 0 then R(S) 

       end; { V }

       注解:

       W(S):表示把调用P(S)的进程置成等待信号量S的状态。

       R(S):表示释放一个等待信号量S的进程。

       正如老师上课时所举的父亲给孩子吃苹果的例子一样,假如一个盘子只能放一个苹果,父亲往盘子里放了一个苹果。如果儿子吃了(V操作),父亲才可以接着放(P操作);如果儿子不吃,那父亲就不能放苹果,只能等着。


       进程互斥和进程同步


       进程互斥


       进程的互斥是指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。

       例如:两个并发进程都要使用共享的计数器Count。

       

[csharp] view plain copy print?

  1. begin  

  2.       count:integer;  

  3.       S:semaphore;  

  4.       count:= 0 //计数器count初始值为0  

  5.       S:= 1 //信号量初始值为1  

  6.    cobegin  

  7.        //进程PIN  

  8.        process PIN  

  9.        R1:integer;  

  10.        begin  

  11.             P(S);  //执行P操作  

  12.             R1:= count;  

  13.             R1:= R1 + 1;  

  14.             count:= R1;  

  15.             V(S)  //执行V操作  

  16.         end;  

  17.        //进程POUT  

  18.        process POUT  

  19.        R2:integer;  

  20.        begin  

  21.             P(S);  //执行P操作  

  22.             R2:= count;  

  23.             R2:= R2 + 1;  

  24.             count:= R2;  

  25.             V(S)  //执行V操作  

  26.         end;  

  27.    coend  

  28. end;  



       进程同步


       进程的同步是指在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。

       例如:一个司机与售票员的例子,在公共汽车上,为保证乘客的安全,司机和售票员应协调工作:停车后才能开门,关车门后才能行车。用PV操作来实现他们之间的协调。
       S1:是否允许司机启动汽车的变量
       S2:是否允许售票员开门的变量

[csharp] view plain copy print?

  1. driver()//司机进程  

  2. {  

  3.   while (1)//不停地循环  

  4.   {   

  5.    P(S1);//请求启动汽车  

  6.    启动汽车;  

  7.    正常行车;  

  8.    到站停车;  

  9.    V(S2); //释放开门变量,相当于通知售票员可以开门  

  10.   }  

  11. }  

[csharp] view plain copy print?

  1. busman()//售票员进程  

  2. {  

  3.    while(1)  

  4.    {  

  5.     关车门;  

  6.     V(S1);//释放开车变量,相当于通知司机可以开车  

  7.     售票  

  8.     P(S2);//请求开门  

  9.     开车门;  

  10.     上下乘客;  

  11.    }  

  12. }  



       总结:



       PV操作是操作系统中的重点和难点,不过如果细细分析,知道为什么要使用它以后。其实发现,PV操作也不过如此。并发进程间可以通过PV操作交换信息实现进程的互斥和同步,因此PV操作可以看做是进程间的一种低级的通信方式,只交换了少量的信息。但它解决了进程间对于资源共享而产生的与时间有关的错误。


Copyright oneie ©2014-2017 All Rights Reserved. 所有资料来源于互联网对相关版权责任概不负责。如发现侵犯了您的版权请与我们联系。 网际学院 版权所有
免责声明  商务合作及投稿请联系 QQ:86662817