作業系統中程序同步問題的幾個經典問題與解答
阿新 • • 發佈:2019-01-31
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操作寫出父親、母親、兒子、女兒程序的同步演算法。
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);
}
可列印,反之也然,雙方共用一個緩衝區,寫出此演算法。
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);
}
司機 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);
}