pv操作操作系统

2012-10-23 13:49:38 feixiang_john 阅读数 3904
计算机操作系统--PV操作详细说明
 
在计算机操作系统中,PV操作是进程管理中的难点。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
    P(S):①将信号量S的值减1,即S=S-1;
           ②如果S>=0,则该进程继续执行(说明资源申请成功);否则该进程置为等待状态,排入等待队列(本进程状态进入等待状态)。
    V(S):①将信号量S的值加1,即S=S+1;
           ②如果S>0,则该进程继续执行(说明没有进程在等待状态了,资源已经存在了);否则释放队列中第一个等待信号量的进程(改变队列中某个等待状态的进程的状态为就绪状态), 本进程继续执行

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

什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
     一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

    利用信号量和PV操作实现进程互斥的一般模型是:
进程P1              进程P2           ……          进程Pn
……                  ……                           ……
P(S);              P(S);                         P(S);
临界区;             临界区;                        临界区;
V(S);              V(S);                        V(S);
……                  ……            ……           ……

    其中信号量S用于互斥,初值为1。
    使用PV操作实现进程互斥时应该注意的是:
    (1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
    (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
   (3)互斥信号量的初值一般为1。

    利用信号量和PV操作实现进程同步
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
    使用PV操作实现进程同步时应该注意的是:

    (1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
    (2)信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
    (3)同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。

【例1】生产者-消费者问题
在多道程序环境下,进程同步是一个十分重要又令人感兴趣的问题,而生产者-消费者问题是其中一个有代表性的进程同步问题。下面我们给出了各种情况下的生产者-消费者问题,深入地分析和透彻地理解这个例子,对于全面解决操作系统内的同步、互斥问题将有很大帮助。

(1)一个生产者,一个消费者,公用一个缓冲区。
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为1。
   full——表示缓冲区中是否为满,初值为0。

生产者进程
while(TRUE){
生产一个产品;
     P(empty);
     产品送往Buffer;
    
V(full);
}

消费者进程
while(True){
P(full);

   从Buffer取出一个产品;
   V(empty);
   消费该产品;
  
}
(2)一个生产者,一个消费者,公用n个环形缓冲区。

定义两个同步信号量:
empty——表示缓冲区是否为空,初值为n。
full——表示缓冲区中是否为满,初值为0。

    设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指
,指向下一个可用的缓冲区。

生产者进程
while(TRUE){
     生产一个产品;
     P(empty);
     产品送往buffer(in);
     in=(in+1)mod n;
    
V(full);
}

消费者进程
while(TRUE){
 P(full);
   从buffer(out)中取出产品;
   out=(out+1)mod n;
   V(empty);
   消费该产品;
   }
3)一组生产者,一组消费者,公用n个环形缓冲区
    在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区。
定义四个信号量:
empty——表示缓冲区是否为空,初值为n。
full——表示缓冲区中是否为满,初值为0。
mutex1——生产者之间的互斥信号量,初值为1。
mutex2——消费者之间的互斥信号量,初值为1。

    设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。
生产者进程
while(TRUE){
     生产一个产品;
     P(empty);
     P(mutex1);
     产品送往buffer(in);
     in=(in+1)mod n;
     V(mutex1);
    
V(full);
}

消费者进程
while(TRUE){
 
P(full)
   P(mutex2);

   从buffer(out)中取出产品;
   out=(out+1)mod n;
   V(mutex2);
   V(empty);
   消费该产品;
  
}
  需要注意的是无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒。应先执行同步信号量的P操作,然后再执行互斥信号量的P操作,否则可能造成进程死锁。

【例2】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

分析 在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

   :在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S
=1;
int Sa=0;
int So=0;

      main()
      {
        cobegin
            father();      /*父亲进程*/
            son();        /*儿子进程*/
            daughter();    /*女儿进程*/
        coend
   
    father()
    {
        while(1)
          {
            P(S);
            将水果放入盘中;
            if(放入的是桔子)V(So);
            else  V(Sa);
           }
     }
    son()
    {
        while(1)
          {
             P(So);
             从盘中取出桔子;
             V(S);
             吃桔子;
           
    }
    daughter()
    {
         while(1)
            {
              P(Sa);
              从盘中取出苹果;
              V(S);
              吃苹果;
           


 

思考题:

四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
    (1)应定义的信号量及初值:                   
    (2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:
    
A()                B()                  C()                 D()
      {                 {                    {                  {
      [1];                [3];                  [5];                 [7];
      read F;             read F;                read F;              read F;
     [2];                [4];                  [6];                 [8];
      }                  }                    }                  } 

    思考题解答:
(1)定义二个信号量S1、S2,初值均为1,即:S1=1,S2=1。其中进程A和C使用信号量S1,进程B和D使用信号量S2。
(2)从[1]到[8]分别为:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)

2015-04-05 18:49:35 u013045214 阅读数 15859

       大家都说操作系统中的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。

       

    begin
          count:integer;
          S:semaphore;
          count:= 0 //计数器count初始值为0
          S:= 1 //信号量初始值为1
       cobegin
           //进程PIN
           process PIN
           R1:integer;
           begin
                P(S);  //执行P操作
                R1:= count;
                R1:= R1 + 1;
                count:= R1;
                V(S)  //执行V操作
            end;
           //进程POUT
           process POUT
           R2:integer;
           begin
                P(S);  //执行P操作
                R2:= count;
                R2:= R2 + 1;
                count:= R2;
                V(S)  //执行V操作
            end;
       coend
    end;


       进程同步


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

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

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

       总结:


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



2012-04-24 13:07:39 wulingmin21 阅读数 36592

    刚开始学习操作系统的时候,就听说PV操作,简单说说PV操作。


  P(S): S=S-

            如果S≥0,则该进程继续执行;

              S<0进程暂停执行,放入信号量的等待队列

 

●  V(S): S=S+1

            如果S>0,则该进程继续执行;

                S≤0 唤醒等待队列中的一个进程


    到底怎么分析,下面看看一个具体的问题:


    

首先设信号量S1,S2,其中

S1,表示是否允许司机启动汽车,其初值为0,

S2,表示是否允许售票员开车门,初值为O;


          


● 分析:

    司机进程:

            P:S1=S1-1 得:S1=0-1=-1<0 司机进程暂停执行,放入信号量的等待队列(售票员进程

 

    售票员进程:

           关车门;

           V:S1=S1+1得:S1=-1+1=0≤ 0  唤醒等待队列中的一个进程


    (解释:唤醒司机进程,使司机进程成为就绪状态,司机可以启动车辆,正常行驶,……,直到到V(S2),  S2=S2+1 得:S2=0+1=1>0 ,司机进程在此时往下就没有操作了;

在唤醒司机进程的同时,售票员可以售票,执行售票进程,到P(S2)。

如果之前司机进程到V(S2),这里P(S2):S2=S2-1得:S2=1-1=0 ≥ 0,接着往下执行,到最后上下客;

如果之前司机进程未到V(S2),售票员的进程到P(S2),则如下进行


           售票;(同时司机可能,启动车辆;正常行驶;……

           P:S2=S2-1得:S2=0-1=-1< 0 售票员进程暂停执行,放入信号量的等待队列(运行司机进程

 

    司机进程:   

         接着上面未完成的继续往下执行

          启动车辆;

          正常行驶;

          到站停车;

           S2=S2+1 得:S2=-1+1=0≤ 0 唤醒等待队列中的一个进程(运行售票员进程

 

    售票员进程:

        开车门;

        上下客;


    以上过程(可以是如下):

          

     在售票员进程进程到V(S1),往下售票的同时司机可以启动车辆、……


● 使用PV操作实现进程同步时应该注意的是:

    (1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。

    (2)信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。

    (3)同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。


2018-10-30 10:58:57 ws_Ando 阅读数 6370

PV操作概念:操作系统中的一种同步机制,实现对于并发进程中临界区的管理

并发进程分为两种:

无交互的并发进程:每个进程是相互独立的,谁也不影响谁,基本不会用到PV操作。

有交互的并发进程:多个进程共享资源,一个进程的运行,有可能会被外界的原因而中断,且断点不固定。进程执行的相对速度不能由进程自己来控制,于是就会导致并发进程在共享资源的时出现与时间有关的错误

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

P操作:申请资源操作。

V操作:释放资源操作。

信号量S:用来记录资源数量,看是否能满足申请资源的操作。例如:S=3 表示三个可用空闲资源S<0表示可用空闲资源无,进程申请要进入等待队列中。

P(S):S <—— S - 1 

          如果S >= 0,进程继续执行

          如果S < 0,进程停止执行,放入信号量等待队列中。

V(S):S <—— S +1 

           如果S > 0,进程继续执行;

           如果S <= 0,唤醒等待队列中的一个进程。

例子:银行排队取号,按号叫人,值得一提的是窗口上有个大大的LED屏,显示着有几个人在等待,一共三个窗口,这时,10个人想办理业务。(资源-窗口,人-进程,大屏幕-S,很符合了吧)

    没人在窗口办理业务,屏幕:3个窗口可以办理;

    1人在窗口办理业务,屏幕:2个窗口可以办理;

    2人在窗口办理业务,屏幕:1个窗口可以办理;

    3人在窗口办理业务,屏幕:0个窗口可以办理;

    又来一个人取号,屏幕:1人在等待;       。。。。。

   第十个人来了,屏幕:7人在等待;

以上取号都是申请资源操作 P(S),取号就相当于对屏幕上信号量减一,即 P(S) 中的 S-1 , 减成负数时就要在等待区等待。

当一个人办理完业务,将释放一个窗口,则屏幕信号量 V(S) 中的 S 加1, 1人办理完业务,屏幕:6人在等待(一人去了窗口办理业务)

用PV操作表示

申请资源P(S)中的S 操作:信号量初始值S = 3 ,一个申请 S <—— 3-1 ,S >= 0,进程继续。不阻塞。。。。。到第4个申请的时候,

S <——0-1,S < 0 ,进入阻塞队列中等待。。。。。到第10个申请的时候, S <—— -6-1,,S = -7 ,等待队列中有7个正着等着用资源。

释放资源V(S)中的S 操作:1人办理完业务,释放资源,S <—— -7+1 ,S < =0 ,唤醒等待队列中的一个。。。。7个人办理完业务,释放资源 S <—— -1 +1 ,S <=0 ,没有申请了,就空闲继续执行进程即可。全部办理完,S = 3 则有3个空闲资源可用。

关于PV操作前驱后继图的解答

重要的几点解题条件:

①信号量初值都为0

②将信号量看成一个互斥量,如果想要某个结点停止执行,那么就对它做P操作,这样信号量的值就小于0,被压入阻塞队列。如果完成了某个结点的计算,那么就把它连向的结点做V操作,这样就相当于“激活”了下一个其他的结点,继续执行程序,这样就完成了进程间的同步过程。

③前驱图可以看作是拓扑结构图,想要执行 P2 ,必须先执行 P1 后才可以 ,想要执行 P3,必须执行 P1 和 P2 后才可以。

总结就是:一个进程 A 引出某些信号量,则在 A 进程末尾对这些信号量执行 V 操作。

                 信号量指向某进程 A ,则在 A 进程开始位置有这些信号量的 P 操作。

如上图,四个信号量都为0,我们将信号量标记在图上,但不是随意乱标记,有一定的规则

【原创】PV操作 <wbr>前驱图

情况1中:P1 进程引出信号量 S1、S2 ,所以在 P1 末尾对这些信号量执行 V(S1)、V(S2);P2 进程引入 S1 信号量,则在 P2 开始的位置有 P(S1) 操作,P2 进程引出 S3 信号量,则在 P2 末尾执行 V(S3) 操作;依次类推。

情况2中:同情况1一样分析。

带入答案中会发现,只有 情况1 符合题意,所以按照 情况1 来标记信号量,做题时,尽量先按照顺序来标记,有很大的机会误打误撞标记正确。

学习资料:http://blog.sina.com.cn/s/blog_6d79d83a0101b6tp.html

2016-05-16 11:25:23 daijin888888 阅读数 1168

基本概念:

进程状态进程通常分为就绪、运行和阻塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:


进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。

信号量:信号量是最早出现的用来解决进程同步与互斥问题的机制。信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。注意,信号量的值只能由PV操作来改变

同步:其实说同步还不如说”协作“,就是我们的目标只有一个,我们奔着同一个目标去的,都是在大家的努力下共同完成这么一件事情。还是比较容易理解的吧。不见得太难。

互斥:借用别人的一句话“千军万马过独木桥”,很通俗的一句话,就把咱们这个概念表达的淋漓尽致,就好比有一个大部队来到独木桥这,但是必须排好队,一个一个来;其实现实生活中,还有一个很好的例子可以说明这个互斥的概念,比如打印机,打印机这个工具就非常好的体现了互斥的概念,打印机一旦被别人占用了,那无乱你有多着急,都只能等着,对吧。

我们接下来还继续看一下一张同步的图:

这张图也特别的形象具体,我们具体来看看这张图,A仓库有货物,然后我们需要把货物搬运到B仓库,由搬运工甲和搬运工乙来完成这个过程;那么他们的目标就只有一个,就是把货物从A搬到B去,共同奔着这个方向去发展,所以我们说这是一个同步的问题。

临界资源:就是咱们刚刚说的互斥,诸进程间需要互斥方式对其进行共享资源,如打印机、光驱等。

临界区:就是进程访问临界资源的那段代码。

PV操作:解决互斥和同步的问题。分开来看,

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

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

这样理解不太好理解,咱们还是来看例子吧:

接下来,我们来看一个与咱们生活很贴切的问题:生产者——消费者问题:

我们还是一样,通过图片来分析问题:

这是一个著名的同步问题,虽然生产者进程和消费者进程都是异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。这是一个单缓冲区情况。那么这个单缓冲区的PV操作,应该是怎样的呢?我们来看看:

我们分析分析,很容易的发现这个流程,前提是S1初值为1,S2初值为0。我们需要记住P操作减1,V操作加1,然后这个分析就变得易如反掌了,我们先对初值进行一下说明:

a、我们把S1的初值设为1:是说明缓冲区还有一个空间可以使用,对于生产者而言,每一个缓冲区的一个空间就是一个资源,也就是说,一开始运行的时候,就允许生产者投放一个产品到缓冲区,

b、然后投放到缓冲区之后,我们来看消费者进程,P(S2):首先我们要进程一个判断,判断缓冲区中是否有产品,对消费者而言,缓冲区中有产品,就代表有一个资源可以使用,但是最初状态那个缓冲区中是没有资源的,所以S2的初值应该是为0的。

我们刚才都提到了资源的问题,就是信号量的一个值应该是表示资源的数量,但是就消费者和生产者而言,对于他们的资源是不同的,概念是不同的,生产者:缓冲区有多少个空格,就有多少个资源;而对消费者来说,缓冲区有多少个满的格,就有多少个资源,是刚好是相反,所以说,就是这么相反,所以当消费者从缓冲区取出一个产品之后,对于生产者而已,就多了一个资源。

其实这个过程就是这样的。

1、生产者:P(S1),那么P(S1),S1=S1-1,得到P(S1=0)这个进程还能进行,那么生产者把一个产品投放到缓冲区。

2、V(S2),S2=S2+1,S2初值为0,所以S2=S2+1>0,那么就激活了P(S2),那么消费者就能取出一个产品。

4、消费产品:消费产品之前,还有一个V(S1),就激活了P(S1),让生产者继续投放产品到缓冲区。

特别简单吧,这是单缓冲区分析。

我们接下来看一个相对来说,有点复杂一点点的,多缓冲区的,其实也一样一样的,继续:

我们还是分析一样的问题,生产者、消费者问题:

对应的PV操作应该是这样的:

有一点区别,就是要引用互斥的概念,因为缓冲区是一个临界资源,它始终只能有一个进程对其进行操作,所以我们就可以用一个互斥信号量来完成这一点,所以当某一个进程要使用到缓冲区之前,我们就进行以下判断,判断这个缓冲区现在是不是空闲呢?是不是有生产者或者消费者的进程在使用这个这个缓冲区呢?如果有,mute的初值为1,当有人使用这个缓冲区的时候,这个mute的值就由1变为0,这时,第二个进程向再来操作这个缓冲区,就不可能了,就会被阻塞,当第一个进程使用完缓冲区

 

公交车司机与售票员的问题:

我们来分析这个过程,我们把S1和S2的初值都设为0。我们来分析分析:

1、P(S1):S1=S1-1=-1,那么司机进程就被暂停,等会售票员进程,售票员关车门。

2、V(S1):S1=S1+1=0,激活了司机进程,那么司机就开始启动车辆、正常行驶、到站停车,当然售票员也有可能同时在售票。

3、P(S2):S2=S2-1,售票员在售票之后的进程就被暂停,等待司机进程。这样就避免了售票员售票之后就开车门了。因为这是不允许的。

4、V(S2):S2=S2+1,司机到站停车之后,就激活了售票员P(S2)的进程,那么售票员就进程 开车门、上下客的操作。

那么这个进程就完成了。

一些疑问

1,S大于0那就表示有临界资源可供使用,为什么不唤醒进程?

S大于0的确表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒。

2,S小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?

V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,表明该类资源刚好用完, 当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<0,表明有进程阻塞在该类资源上,于是唤醒一个。

3,如果是互斥信号量的话,应该设置信号量S=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S<0,也还是执行不了,这是怎么回事呢?

当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

4,S的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?

当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。



操作系统PV操作

阅读数 8699