乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      關(guān)于PV操作

       春華_秋實 2012-04-16

      關(guān) 于 PV 操 作

      8346人閱讀 評論(4) 收藏 舉報
      在計算機(jī)操作系統(tǒng)中,PV操作是進(jìn)程管理中的難點(diǎn)。
      首先應(yīng)弄清
      PV操作的含義PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對信號量進(jìn)行操作,具體定義如下:
         
      P
      S):①將信號量S的值減1,即S=S-1;
                
      ②如果S30,則該進(jìn)程繼續(xù)執(zhí)行;否則該進(jìn)程置為等待狀態(tài),排入等待隊列。
         
      V
      S):①將信號量S的值加1,即S=S+1
                
      ②如果S>0,則該進(jìn)程繼續(xù)執(zhí)行;否則釋放隊列中第一個等待信號量的進(jìn)程。
      PV
      操作的意義
      :我們用信號量及PV操作來實現(xiàn)進(jìn)程的同步和互斥。PV操作屬于進(jìn)程的低級通信。

      什么是信號量?信號量(semaphore)的數(shù)據(jù)結(jié)構(gòu)為一個值和一個指針,指針指向等待該信號量的下一個進(jìn)程。信號量的值與相應(yīng)資源的使用情況有關(guān)。當(dāng)它的值大于0時,表示當(dāng)前可用資源的數(shù)量;當(dāng)它的值小于0時,其絕對值表示等待使用該資源的進(jìn)程個數(shù)。注意,信號量的值僅能由PV操作來改變。
           一般來說,信號量S30時,S表示可用資源的數(shù)量。執(zhí)行一次P操作意味著請求分配一個單位資源,因此S的值減1;當(dāng)S<0時,表示已經(jīng)沒有可用資源,請求者必須等待別的進(jìn)程釋放該類資源,它才能運(yùn)行下去。而執(zhí)行一個V操作意味著釋放一個單位資源,因此S的值加1;若S0,表示有某些進(jìn)程正在等待該資源,因此要喚醒一個等待狀態(tài)的進(jìn)程,使之運(yùn)行下去。

          利用信號量和PV操作實現(xiàn)進(jìn)程互斥的一般模型是:
      進(jìn)程
      P1              進(jìn)程P2           ……          進(jìn)程Pn
      ……                  ……                           ……
      P
      S);              PS);                         PS);

      臨界區(qū);
                   臨界區(qū);                        臨界區(qū);
      V
      S);              VS);                        VS);
      ……                  ……            ……           ……

          其中信號量S用于互斥,初值為1。
         
      使用PV操作實現(xiàn)進(jìn)程互斥時應(yīng)該注意的是:
         
      1)每個程序中用戶實現(xiàn)互斥的PV操作必須成對出現(xiàn),先做P操作,進(jìn)臨界區(qū),后做V操作,出臨界區(qū)。若有多個分支,要認(rèn)真檢查其成對性。
         
      2P、V操作應(yīng)分別緊靠臨界區(qū)的頭尾部,臨界區(qū)的代碼應(yīng)盡可能短,不能有死循環(huán)。
         3)互斥信號量的初值一般為1。

          利用信號量和PV操作實現(xiàn)進(jìn)程同步
      PV
      操作是典型的同步機(jī)制之一。用一個信號量與一個消息聯(lián)系起來,當(dāng)信號量的值為0時,表示期望的消息尚未產(chǎn)生;當(dāng)信號量的值非0時,表示期望的消息已經(jīng)存在。用PV操作實現(xiàn)進(jìn)程同步時,調(diào)用P操作測試消息是否到達(dá),調(diào)用V操作發(fā)送消息。
         
      使用PV操作實現(xiàn)進(jìn)程同步時應(yīng)該注意的是:

          1)分析進(jìn)程間的制約關(guān)系,確定信號量種類。在保持進(jìn)程間有正確的同步關(guān)系情況下,哪個進(jìn)程先執(zhí)行,哪些進(jìn)程后執(zhí)行,彼此間通過什么資源(信號量)進(jìn)行協(xié)調(diào),從而明確要設(shè)置哪些信號量。
         
      2)信號量的初值與相應(yīng)資源的數(shù)量有關(guān),也與P、V操作在程序代碼中出現(xiàn)的位置有關(guān)。
         
      3)同一信號量的P、V操作要成對出現(xiàn),但它們分別在不同的進(jìn)程代碼中。

      【例1生產(chǎn)者-消費(fèi)者問題
      在多道程序環(huán)境下,進(jìn)程同步是一個十分重要又令人感興趣的問題,而生產(chǎn)者
      -消費(fèi)者問題是其中一個有代表性的進(jìn)程同步問題。下面我們給出了各種情況下的生產(chǎn)者-消費(fèi)者問題,深入地分析和透徹地理解這個例子,對于全面解決操作系統(tǒng)內(nèi)的同步、互斥問題將有很大幫助。

      1)一個生產(chǎn)者,一個消費(fèi)者,公用一個緩沖區(qū)。
      定義兩個同步信號量:

      empty
      ——表示緩沖區(qū)是否為空,初值為1。
         full——表示緩沖區(qū)中是否為滿,初值為0。
      生產(chǎn)者進(jìn)程

      while(TRUE){

      生產(chǎn)一個產(chǎn)品
      ;
          
      P(empty);

          
      產(chǎn)品送往Buffer;
          
      V(full);
      }

      消費(fèi)者進(jìn)程

      while(True){
      P(full);

        
      Buffer取出一個產(chǎn)品;
        
      V(empty);

        
      消費(fèi)該產(chǎn)品;
        
      }
      2)一個生產(chǎn)者,一個消費(fèi)者,公用n個環(huán)形緩沖區(qū)。
      定義兩個同步信號量:

      empty
      ——表示緩沖區(qū)是否為空,初值為n。
      full
      ——表示緩沖區(qū)中是否為滿,初值為0。

          設(shè)緩沖區(qū)的編號為1n-1,定義兩個指針inout,分別是生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程使用的指
      ,指向下一個可用的緩沖區(qū)。

      生產(chǎn)者進(jìn)程

      while(TRUE){

           
      生產(chǎn)一個產(chǎn)品;
          
      P(empty);

          
      產(chǎn)品送往bufferin);
          
      in=(in+1)mod n
      ;
          
      V(full);
      }

      消費(fèi)者進(jìn)程

      while(TRUE){

       
      P(full);

        
      bufferout)中取出產(chǎn)品;
        
      out=(out+1)mod n

        
      V(empty);

        
      消費(fèi)該產(chǎn)品;
        
      }

      3)一組生產(chǎn)者,一組消費(fèi)者,公用n個環(huán)形緩沖區(qū)
         
      在這個問題中,不僅生產(chǎn)者與消費(fèi)者之間要同步,而且各個生產(chǎn)者之間、各個消費(fèi)者之間還必須互斥地訪問緩沖區(qū)。
      定義四個信號量:

      empty
      ——表示緩沖區(qū)是否為空,初值為n。
      full
      ——表示緩沖區(qū)中是否為滿,初值為0。
      mutex1
      ——生產(chǎn)者之間的互斥信號量,初值為1。
      mutex2
      ——消費(fèi)者之間的互斥信號量,初值為1

          設(shè)緩沖區(qū)的編號為1n-1,定義兩個指針inout,分別是生產(chǎn)者進(jìn)程和消費(fèi)者進(jìn)程使用的指針,指向下一個可用的緩沖區(qū)。
      生產(chǎn)者進(jìn)程

      while(TRUE){

           
      生產(chǎn)一個產(chǎn)品;
          
      P(empty);
          
      P(mutex1)

          
      產(chǎn)品送往bufferin);
          
      in=(in+1)mod n

          
      V(mutex1);
          
      V(full);
      }

      消費(fèi)者進(jìn)程

      while(TRUE){

       
      P(full)
         P(mutex2)
      ;
        
      bufferout)中取出產(chǎn)品;
        
      out=(out+1)mod n
      ;
        
      V
      mutex2);
        
      V(empty);

        
      消費(fèi)該產(chǎn)品;
        
      }
        需要注意的是無論在生產(chǎn)者進(jìn)程中還是在消費(fèi)者進(jìn)程中,兩個P操作的次序不能顛倒。應(yīng)先執(zhí)行同步信號量的P操作,然后再執(zhí)行互斥信號量的P操作,否則可能造成進(jìn)程死鎖。

      【例2桌上有一空盤,允許存放一只水果。爸爸可向盤中放蘋果,也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規(guī)定當(dāng)盤空時一次只能放一只水果供吃者取用,請用P、V原語實現(xiàn)爸爸、兒子、女兒三個并發(fā)進(jìn)程的同步。

      分析 在本題中,爸爸、兒子、女兒共用一個盤子,盤中一次只能放一個水果。當(dāng)盤子為空時,爸爸可將一個水果放入果盤中。若放入果盤中的是桔子,則允許兒子吃,女兒必須等待;若放入果盤中的是蘋果,則允許女兒吃,兒子必須等待。本題實際上是生產(chǎn)者-消費(fèi)者問題的一種變形。這里,生產(chǎn)者放入緩沖區(qū)的產(chǎn)品有兩類,消費(fèi)者也有兩類,每類消費(fèi)者只消費(fèi)其中固定的一類產(chǎn)品。

          :在本題中,應(yīng)設(shè)置三個信號量SSo、Sa,信號量S表示盤子是否為空,其初值為l;信號量So表示盤中是否有桔子,其初值為0;信號量Sa表示盤中是否有蘋果,其初值為0。同步描述如下:
      int S
      1;
      int Sa
      0;
      int So
      0;

           
      main()
           
      {
             
      cobegin
                 
      father();      /*
      父親進(jìn)程*/
                 
      son();        /*
      兒子進(jìn)程*/
               
        daughter();    /*
      女兒進(jìn)程*/
             
      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);

                   
      吃蘋果;
                 


       

      思考題:

      四個進(jìn)程A、BC、D都要讀一個共享文件F,系統(tǒng)允許多個進(jìn)程同時讀文件F。但限制是進(jìn)程A和進(jìn)程C不能同時讀文件F,進(jìn)程B和進(jìn)程D也不能同時讀文件F。為了使這四個進(jìn)程并發(fā)執(zhí)行時能按系統(tǒng)要求使用文件,現(xiàn)用PV操作進(jìn)行管理,請回答下面的問題:
         
      1)應(yīng)定義的信號量及初值:                    。
         
      2)在下列的程序中填上適當(dāng)?shù)?/SPAN>P、V操作,以保證它們能正確并發(fā)工作:
          
      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=1S2=1。其中進(jìn)程AC使用信號量S1,進(jìn)程BD使用信號量S2。
      2)從[1][8]分別為:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多