有關作業系統同步互斥的一些經典問題
阿新 • • 發佈:2018-12-31
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()
{
While(1)
{
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)
}
}