1. 程式人生 > >作業系統中程序同步問題的幾個經典問題與解答

作業系統中程序同步問題的幾個經典問題與解答

1、用記錄型訊號量解決以下問題,用類C語言編寫程序同步演算法。
司機   P1       售票員  P2
       REPEAT          REPEAT
       啟動             關門
       正常執行         售票
       到站停           開門
       UNTIL FALSE     UNTIL FALSE


semaphore s1,s2;
s1=0; //門
s2=0;//車
P1()  //司機
{
wait(s1);
啟動
正常行駛
到站
signal(s2);
}
P2()//售票員
{
關門;
signal(s1);
售票
wait(s2);
開門;
}


2、設有四個併發執行的程序P1、P2、P3、p4,其前趨圖如下,試用訊號量實現這四個程序同步。
解:semaphore s1=0,s2=0,s3=0,s4=0;
P1() {P1; signal(s1);signal(s2);}
P2() {wait(s1);P2;signal(s3);}
P3() {wait(s2);P3;signal(s4);}
P4() {wait(s3);wait(s4);P4;}

3.桌子上有一隻盤子,最多可容納兩個水果,每次只能放人或取出一個水果。
爸爸專向盤子中放蘋果(apple),媽媽專向盤子中放桔子(orange),兩個兒子專
等吃盤子中的桔子,兩個女兒專等吃盤子中的蘋果。請用P、V操作來實現爸爸
、媽媽、兒子、女兒之間的同步與互斥關係。

盤子為臨界資源,設互斥訊號量mutex表示四程序必須互斥訪問盤子
。因可放兩個水果,則empty初值為2;apple表示盤子中apple的數量
,orange表示盤子中orange的數量,初值均為0。
semaphore mutex=1;
int empty=2;
int apple=0;
int orange=0;
void father()

   while(1)
   {
p(empty);
p(mutex);
put an apple;
v(mutex);
v(apple);
   }
}
void mother()

while(1)
   {
p(empty);
p(mutex);
put an orange;
v(mutex);
v(orange);
   }
}
void son()
{ while(1)
   {
p(orange);
p(mutex);
get an orange;
v(mutex);
v(empty);
   }
}
void daughter()

while(1)
   {
p(apple);
p(mutex);
get an apple;
v(mutex);
v(empty);
   }
}
4.桌子上有一隻盤子,每次只能放入一隻水果。爸爸專向盤中放蘋果,
媽媽專向盤中放桔子,一個兒子專等吃盤中的桔子,一個女兒專等吃
盤中的蘋果。請利用P、V操作寫出父親、母親、兒子、女兒程序的同步演算法。

1:盤子是臨界資源.要實施互斥. 用訊號量 mutex 表示.

 2:蘋果用 apple 表示.  橘子用 orange 表示.

 3:盤子的狀態(空,或者滿) 用 ef 表示.

semphore mutex=1;
int  ef=1, apple=0, orange =0; 
ProcessDad()
{
    Wait(ef);//盤子中是否空
    Wait(mutex);//是否有人在用盤子,f保證盤子被獨佔。
    setApple();
    Signal(apple);//通知放了一個蘋果
    Signal(mutex); 
}
ProcessMom()
{
    Wait(ef);
    Wait(mutex);
    setOrange();
    Signal(orange);
    Signal(mutex); 
}
ProcessSon()
{
    Wait(orange);    //是否有橘子
    Wait(mutex); //是否有人在用盤子
    eatOrange();
    Signal(ef); //通知盤子為空
    Signal(mutex);
}
 
ProcessDaughter()
{
    Wait(apple);
    Wait(mutex);
    eatApple();
    Signal(ef);
    Signal(mutex);
}

5.兩個程序合作完成資料計算和列印工作,計算程序未計算完就不

可列印,反之也然,雙方共用一個緩衝區,寫出此演算法。


semaphore empty=1;
semaphore full=0;    
void Calculate()
{
while(1)
{
wait(empty);                           
計算;                      
signal(full);               
}
}   
void Print()
{
while(1)
{
wait(full);                    
列印;             
signal(empty); 
}
}  


6.獨木橋問題。某條河上只有一座獨木橋,以便行人過河。現在河的兩邊都有人要
過橋,按照下面的規則過橋。為了保證過橋安全,請用P、V操作分別實現正確的管理。
過橋的規則是:同一方向的可連續過橋,某方向有人過橋時另一方向的人 要等待。

將獨木橋的兩個方向分別標記為A和B;並用整形變數countA和countB分別表示A、B方
向上已在獨木橋上的行人數,初值為0;再設定三個初值都1的互斥訊號量:SA用來實
現對countA的互斥訪問,SB用來實現對countB的互斥訪問,mutex用來實現兩個方向的
行人對獨木橋的互斥使用。則具體描述如下:

semaphore SA,SB,mutex;
SA=1;
SB=1;
mutex=1;
int countA=0;
int countB=0;
void Process_A()
{
wait(SA);
if(countA==0)
{
wait(mutex);
countA+=1; 
}
signal(SA);
過獨木橋;
wait(SA);      
countA-=1;              
if(countA==0) 
{
signal(mutex);
}
signal(SA);
}
void Process_B()
{
wait(SB); 
if(countB==0)
{
wait(mutex); 
countB+=1;
}
signal(SB); 
過獨木橋;
wait(SB);
countB-=1;      
if (countB==0) 
{
signal(mutex); 
}
signal(SB);
}