1. 程式人生 > >有關作業系統同步互斥的一些經典問題

有關作業系統同步互斥的一些經典問題

1.過橋問題:
消除飢餓現象  為公平起見,進一步的改進演算法:再增加一個訊號量B,初值為1。每個準備上橋的車,都需先爭奪訊號量B,這樣可阻止對面後來的車的上橋機會,從而消除飢餓現象。  

B: 對橋使用權的互斥
S:橋兩邊的互斥
S1:左邊人數計數器count1互斥
S2:右邊人數計數器count2互斥
東邊的汽車程序:  
P(B);  
P(S1); 
count1 = count1 + 1; 
if (count1 == 1)  
P(S);  
V(S1); 
V(B);  
上橋;  
P(S1);  
count1 = count1 - 1  
if (count1 == 0
)  V(S);   V(S1) ;    西邊的汽車程序:     P(B);   P(S2);   count2 = count2 + 1;   if (count2 == 1)   P(S);   V(S2);  V(B);   上橋;  P(S2);  count2 = count2 - 1   if (count2 == 0)   V(S);   V(S2);

2.和尚取水問題:
某寺廟,有小和尚和老和尚若干,有一個水缸,由小和尚提水入缸供老和尚飲用。水缸可以容納10桶水,水取自同一口井中,由於水井口窄,每次只能容納一個水桶取水.水桶總數為3個.每次入水、取水僅為一桶,且不可同時進行。
試給出有關取水、入水的演算法描述.
訊號量:semaphore

Var mutex_well,mutex_vat,empty,full,count,:semaphore 1,1,10,0,3
//mutex_well 表明水井的互斥關係
//mutex_vat表明水缸的互斥關係
//empty將水以桶為單位後,水缸中未有水的桶數
//full將水以桶為單位後,水缸中已由水的桶數
//count可用水桶數
           小和尚:
                P(empty);
                P(mutex_well);
                     P(count);
                     從井中取水;
                     V(mutex_well)
; P(mutex_vat); 送水入水缸; V(mutex_vat); V(count); V(full); 老和尚: P(full); P(mutex_vat); P(count); 從缸中取水; V(mutex_vat); V(count); V(empty);

3.奇偶列印問題:
三個程序R、W1、W2共享一緩衝池B,而B中能存放2個數。R將從輸入裝置上讀入的自然數放到緩衝器B中。若存放的是奇數,則允許W1將其取出列印,如果是偶數,由程序W2取出列印。請利用PV操作保證三個程序間的同步和互斥。

empty=2;緩衝區數量
mutex=1;緩衝區使用權互斥
full1=0;奇數數量
full2=0;偶數數量
void R()
{
    p(empty);
    p(mutex);
    向B中放入自然數;
    v(mutex);
    if(x%2!=0)
    v(full1) 奇數
    else
    v(full2);
}
void W1()
{
  p(full1);
  p(mutex);
  print("x");
  v(mutex);
  v(empty);
}
void W2()
{
  p(full2);
  p(mutex);
  print("x");
  v(mutex);
  v(empty);
}

4.蘋果橘子問題
蘋果桔子問題:桌上有一隻盤子,每次只能放入一隻水果;爸爸專向盤子中放蘋果(apple),媽媽專向盤子中放桔子(orange),兒子專等吃盤子中的桔子,女兒專等吃盤子裡的蘋果。請用PV操作和訊號量來描述四者的同步動作。

公用訊號量 mutex 初值為1,用於實現臨界區的互斥。
爸爸的私有訊號量 empty1=1, 表示果盤中可以放的水果數目。
媽媽的私有訊號量 empty2=1, 表示果盤中可以放的水果數目。
兒子的私有訊號量 full1=0,指示盤子中橘子的數量。
女兒的私有訊號量 full2=0, 指示盤子中蘋果的數量。
Void father()
{
While1)
{
P(empty1)//果盤是否為空。
P(mutex)//是否有其他的人正在使用果盤.
放蘋果。
V(mutex)
P(full1)//通知兒子可以去取蘋果了。
}
}
Void mother()
{
While(1)
{
P(empty2)
P(mutex)
放橘子。
V(mutex)
P(full2)
}
}
Void son()
{
While(1)
{
P(full1)//果盤中是否有蘋果
P(mutex)//是否有其他人在使用果盤。
吃蘋果。
V(mutex)
P(empty1)// 通知爸爸可以放蘋果了。
}
}
void daughter()
{
While(1)
{
P(full2)
P(mutex)
吃橘子。
V(mutex)
P(empty2)
}
}