用信號量及其PV操作處理實際問題


43、現有3個生產者P1、P2、P3,他們都要生產橘子汁,每個生產者都已分別購得兩種不同的原料,待購齊第三種原料后就可配制成橘子汁裝瓶出售。有一供應商能源源不斷的供應糖、水、橘子精,但每次只拿出一種原料放入容器中供應給生產者。當容器中有原料時,需要這種原料的生產者可以取走,當容器空時供應商又可放入一種原料。假定:生產者p1已購得糖和水;生產者P2已購得水和橘子精; 生產者P3已購得糖和橘子精; 試用: (1)管程(2)信號量和P、V操作寫出供應商和3個生產者之間能正確同步的程序。

Cemaphore empty=1;

橘子精=0;糖=0;水=0;

         Process product(){

               While(true){

                      P(empty);

                      產生一個隨機數s;

                     If(s==0) V(橘子精);

                     If(s==1) V(水);

                     If(s==2) V(糖);

              }

        }

       Process P1(){

                Process P2(){

                      Process P3(){

                           While(true){

                                  while(true){

                                         while(true){

                                               P(橘子精); 

                                               P(糖);

                       P(水);

                       取走橘子精;

                         取走糖;

                      取走水;

                        V(empty);

                        V(empty);

                     V(empty);

                  }

                                  }

                            }

                   }

            }

      }

Coend

 

2.IPO問題:有多個輸入進程、多個處理進程和多個輸出進程。輸入進程把數據逐步輸入到一個有M個單位緩沖區B1上,經處理進程處理之后放到有N個單位的緩沖區B2上,由輸出進程進行輸出。

        a.這個問題有哪些進程?進程之間有什么樣的制約關系?

        b.用信號量及PV操作寫出這些進程之間的同步算法

解:

   a:有輸入進程、處理進程、輸出進程,進程之間有同步關系。

   b:     semaphore B1;B1=M;        /*B1可用的空緩存區*/

           semaphore B2;B2=N;        /*B2可用的空緩存區*/

           semaphore mutex;mutex=1;           /*同步信號*/

           cobegin

                  process input(){

                          while(true){

                                p(mutex);

                  輸入;

                  B1--;

                                v(mutex);

                           }

                    }

                 process chuli(){

                        while(true){

                                p(mutex);

                  處理;

                  B1++;

                                 B2--;

                                v(mutex);

                          }

                    }

                 process output(){

                          while(true){

                                p(mutex);

                  輸出;

                  B2++;

                                v(mutex);

                           }

                    } 

  coend       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM