码迷,mamicode.com
首页 > 其他好文 > 详细

PV操作的简单理解

时间:2015-03-03 13:43:55      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:多线程   并发   数据结构   指针   semaphore   

    

          PV操作的简单理解


一、什么是PV操作

      在操作系统中,进程是一个很要花时间理解的东西,进程通常分为就绪、运行和阻

塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:
         技术分享



      进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作

和信号量。其中信号量起到了至关重要的作用。



1、什么是信号量?

  信号量(semaphore),我们有时被称为信号灯,是在多线程环境下使用的一种设

施,是可以用来保证两个或多个关键代码段不被并发调用。信号量的数据结构为一个值

和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况

有关。

  

  一般来说,信号量S>0时,S表示可用资源的数量。执行一次P操作意味着请求分配

一个单位资源,因此S的值减1;

  当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才

能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;

  若S=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

    温馨贴士:信号量的值只能由PV操作来改变。
 


2、PV操作:

    自己通俗的理解, P就是请求资源,V就是释放资源。 P操作是减法运算(S:=S-

1),当信号量S小于0时申请资源;V操作是加法运算(S:=+1),当信号量小于等于0

时释放资源;P、V操作二者必须成对出现。



二、pv操作的意义

    我们用信号量及PV操作来实现进程的同步和互斥。PV操作是属于进程的低级通信。

进程的同步、互斥:

  同步:与其说同步我更愿说”协作“,就是我们的目标只有一个,我们奔着同一个目

标去的,都是在大家的努力下共同完成这么一件事情。还是比较容易理解的吧。不见得

太难。



  互斥:借用别人的一句话“千军万马过独木桥”,很通俗的一句话,就把咱们这个概

念表达的淋漓尽致,就好比有一个大部队来到独木桥这,但是必须排好队,一个一个

来;其实计算机中,还有一个很好的例子可以说明这个互斥的概念,比如打印机,打印

机这个工具就非常好的体现了互斥的概念,打印机一旦被别人占用了,那无乱你有多着

急,都只能等着,对吧。




 三、PV操作实践

  讲了那么久,我们接下来进入PV操作具体实践篇,看来这个PV操作还是挺有意思

的。

PV操作就是为了解决互斥和同步的问题。

PV操作是分开来看的:


P操作:使S=S-1,若S>=0,则该进程继续执行,否则该进程排入等待队列。

V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。



下面我们通过生活中的一个司机与售票员的例子来理解:

      在公共汽车上,为保证乘客的安全,司机和售票员应协调工作:停车后才能开门,

关车门后才能行车。用PV操作来实现他们之间的协调。


S1:是否允许司机启动汽车的变量
S2:是否允许售票员开门的变量


driver()//司机进程
{
  while (1)//不停地循环
  { 
   P(S1);//请求启动汽车
   启动汽车;
   正常行车;
   到站停车;
   V(S2); //释放开门变量,相当于通知售票员可以开门
  }
}


busman()//售票员进程
{
   while(1)
   {
    关车门;
    V(S1);//释放开车变量,相当于通知司机可以开车
    售票
    P(S2);//请求开门
    开车门;
    上下乘客;
   }
}




小结
     pV操作:
1、宏观:  P就是请求资源,V就是释放资源。

2、微观:P操作是减法运算(S:=S-1),当信号量S小于0时申请资源;V操作是加法运

算(S:=+1),当信号量小于等于0时释放资源;P、V操作二者必须成对出现。



    自己一开始看书没有很深入的理解,后来看第二遍的时候和同学一起交流讨论了,

论就是可以让自己变得印象时刻,把一些模糊的东西变得清晰明了了,更重要的是一

交流,通过生活中活生生的例子,让看起来高大上的PV操作,和生活中的例子建立起

系,PV操作也就是那么回事,这样不断的结网、建立知识网,用已有的、旧的知识去

理解新的知识点,学习起来越来越有劲。






PV操作的简单理解

标签:多线程   并发   数据结构   指针   semaphore   

原文地址:http://blog.csdn.net/u013067756/article/details/44036177

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!