• 操作系统——PV操作

    2018-10-30 10:58:57
    PV操作概念:操作系统中的一种同步机制,实现对于并发进程中临界区的管理。 并发进程分为两种: ①无交互的并发进程:每个进程是相互独立的,谁也不影响谁,基本不会用到PV操作。 ②有交互的并发进程:多个进程...

    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

    展开全文
  • 计算机操作系统--PV操作详细说明   在计算机操作系统中,PV操作是进程管理中的难点。 首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: ...
    计算机操作系统--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)

    展开全文
  • 大家都说操作系统中的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。

           

        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操作可以看做是进程间的一种低级的通信方式,只交换了少量的信息。但它解决了进程间对于资源共享而产生的与时间有关的错误。



    展开全文
  • 刚开始学习操作系统的时候,就听说PV操作,简单说说PV操作。 ● P(S): S=S-1    如果S≥0,则该进程继续执行;  S,进程暂停执行,放入信号量的等待队列   ● V(S): S=S+1  如果S>0,则...

        刚开始学习操作系统的时候,就听说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操作要成对出现,但它们分别在不同的进程代码中。


    展开全文
  • 操作系统PV操作

    2018-09-20 18:05:01
    进程三个状态之间的转换是通过PV操作和信号量来控制的,其中信号量起到了很重要的作用。   信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制。 信号量(Saphore)由一个值和一个指针组成,指针指向...

    三态模型

    进程通常分为就绪、运行和阻塞三种工作状态。

    三种状态在某些条件下可以转换,具体转换关系如下:

     

    img

     

    进程三个状态之间的转换是通过PV操作和信号量来控制的,其中信号量起到了很重要的作用。

     

    信号量

    信号量是最早出现的用来解决进程同步与互斥问题的机制。

    信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程,信号量的值表示相应资源的使用情况。

    信号量 S>=0 时,S 表示可用资源的数量,执行一次P操作意味着请求分配一个资源,因此 S 的值减 1 ;

    信号量 S<0 时,表示已经没有可用资源,S 的绝对值表示当前等待该资源的进程数,请求者必须等待其他进程释放该类资源才能继续运行,而执行一个V操作意味着释放一个资源,因此 S 的值加 1 ;

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

    注意,信号量的值只能通过PV操作来改变。

     

    两类问题

    在说明这两类问题之前首先解释一些相关的概念:

    PV操作:一种实现进程互斥与同步的有效方法,包含P操作与V操作。

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

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

    临界资源:同一时刻只允许一个进程访问的资源,与上面所说的 S 有关联。

     

    缓冲区问题

    进程 P1 将信息输入到缓冲区 B 中,进程 P2 负责从缓冲区 B 中取出数据输出,缓冲区容量为 n 。

     

    img

     

    对于进程 P1 来说,如果缓冲区满,则应暂停输入,等待 P2 进程取走数据后再输入新数据;

    而对于进程 P2 来说,如果缓冲区空,则应等待 P1 进程送来新数据。

     

    我们首先分析一下,假设缓冲区未满且有数据存在时, P2 进程可以顺利的取出一个数据,同样 P1 进程此时也可以顺利的添加一个数据。

    也就是说,对于这两个进程的每一次操作,只要初始条件满足,那么它一定可以顺利的执行下去,不会受到其他条件的制约。

     

    于是便有:

    P1()
    {
        P(empty);
        输入新数据;
        V(full);
    }
    
    P2()
    {
        P(full);
        取出数据;
        V(empty);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    其中 empty 初始值为缓冲区容量 n , full 初始值为 0 。

    假如缓冲区为空时, P2 进程阻塞, P1 可以顺利执行,随后唤醒 P2 进程运行。

    假如缓冲区为满时, P1 进程阻塞, P2 可以顺利执行,随和唤醒 P1 进程运行。

     

    其中的制约关系如下

     

    img

     

     

    公交车司机售票员问题

    设公交车上司机的活动是启动车辆,正常行车,到站停车;售票员的活动是关车门,售票,开车门,用信号量和PV操作来实现它们的同步。

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

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

    S2 表示是否允许售票员开门,初始值为 0 。

     

    于是便有:

    司机进程()
    {
        P(S1);
        启动车辆;
        正常行驶;
        到站停车;
        V(S2);
    }
    
    售票员进程()
    {
        关车门;
        V(S1);
        售票;
        P(S2);
        开车门;
        上下客;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    我们来分析一下这个过程, S1 与 S2 的初始值都为 0 。

    如果售票员没有关车门的话司机进程会阻塞在P操作之前,直到售票员关闭车门后执行V操作唤醒司机进程启动车辆…

    之后的一段时间司机进程与售票员进程可以同时运行。

    当司机到站停车前售完票的售票员会阻塞在P操作之前,直到司机到站停车后执行V操作唤醒售票员开车门,然后上下客。

    (那么问题来了,如果到站停车后售票员还没有售完票会怎么样呢?答案是售票员会继续售票,直到结束以后才会开车门上下客,然后耽误了好多乘客的时间于是被解雇了,hahah没有那么夸张啦~)

     

    这便是公交车司机与售票员之间的制约关系了,如下:

     

    img

     

     

    总结

    使用PV操作实现进程同步时应该注意的问题有:

    • 同一信号量的P、V操作要成对出现
    • 信号量的初始值与相应资源的数量有关,也与P、V操作在程序中出现的位置有关
    • 我们要首先分析出进程间的制约关系,在保证进程间有正确同步关系的情况下,确定哪一个进程先执行,哪一个进程后执行,彼此间应该用什么信号量来协调
    展开全文
  • 操作系统PV操作经典例题含详细讲解、适合冲刺。
  • PV操作的简单理解 一、什么是PV操作  在操作系统中,进程是一个很要花时间理解的东西,进程通常分为就绪、运行和阻 塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:    进程...
  • 操作系统PV操作

    2016-05-16 11:25:23
    进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。 信号量:信号量是最早出现的用来解决进程同步与互斥问题的机制。信号量(Saphore)由一个值和...
  • 操作系统PV操作

    2017-01-26 16:11:32
    在我们学习操作系统的时候,PV操作这一块有一些晦涩难懂,在对PV操作展开说明之前,首先了解一下进程的基本状态和临界区之后,形成了感官的认识,对PV操作会比较容易理解,否则看起来就是每一个都懂,连起来不知道说...
  • PV操作 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。 目录 1 简介 2 详细资料 3 解释 ▪ 信号量的概念 ▪ 典型理解偏差 简介 1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾...
  • 操作系统-PV操作 WHAT? 操作系统中的一种同步机制,实现对于并发进程中临界区的管理。 并发进程 无交互并发进程:每个进程独立,无需PV操作 有交互并发进程:多个进程共享资源,需控制进程次序,防止进程因资源被...
  • 操作系统 -- PV操作

    2017-07-03 19:47:33
    三种状态在某些条件下可以转换,具体转换关系如下:进程三个状态之间的转换是通过PV操作和信号量来控制的,其中信号量起到了很重要的作用。 信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制。 信号...
  • 总共有 读入、执行、打印 三个进程,试用PV操作描述读入B1打印B2的同步过程。 问题解读: 这个问题就是说了这样一件事:一个输入B1,被操作之后,成为B2,将B2打印。怎样用PV操作来说这件事。那么新的问题来了:啥...
  • 转自:http://blog.csdn.net/gnuhpc/article/details/7001865PV操作原语和信号量sem是计算机操作系统进程和线程同步的核心手段,虽然说起来只有句话,但有几个点非常容易引起模糊。先把PV操作的说明如下:P操作原语: ...
  • PV操作初学理解

    2019-10-13 10:41:58
    最近一直在学习操作系统,学到pv操作这里的时候想更好的理解一下 正文: 概要: pv操作只作用于并发进程,也就是说在非并发进程里面基本不会使用。 而在并发进程使用中就会出现共享资源,在共享资源的使用中就...
  • 【前言】  为了解决进程共享资源的问题,我们在操作系统中引入了PV操作的概念;那么PV操作到底是怎么一回事呢?让我们从吃苹果入手,一起浅析PV操作
  • 操作系统PV操作及读者写者问题目录:1、信号量:2、P、V操作原语可描述为以下式子:3、解释:4、互斥模式原理:5、同步模式原理:6、读者写者问题: 1、信号量:PV操作与信号量的处理有关,信号量是表示资源的实体...
  • 操作系统pv操作

    2017-04-24 23:38:47
    PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1;  ②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 ...
  • 操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步(完成异步的两个进程的协作)两种关系.为了有效的处理这两种情况,狄克斯特拉(W.Dijkstra)在1965年提出信号量 (semaphore)和PV操作.  信号量: ...
1 2 3 4 5 ... 20
收藏数 48,896
精华内容 19,558