操作系統中的PV原語
阿新 • • 發佈:2018-04-13
PV原語一:桌上有1空盤,允許存放1個水果。爸爸向盤中放蘋果,也可以向盤中放桔子。兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規定當盤空時一次只能放1個水果供吃者取用。請用Wait()、Signal()原語實現爸爸、兒子、女兒三個並發進程的同步。
Semaphore mutex=1,mutex1=0,mutex2=0;
main(){
cobeign
father();
son();
daugther();
coend
}
father(){
while(1){
wait(mutex);
將水果放在盤子
if(放的是橘子) signal(mutex1);
else signal(mutex2); {
wait(mutex1);
吃橘子
signal(mutex);
}
}
daugther(){
while(1)
{
wait(mutex2);
吃蘋果
signal(mutex);
}
} 正常行車
到站停車
V(S1);
V(S2);
Semaphore mutex=1,mutex1=0,mutex2=0;
main(){
cobeign
father();
son();
daugther();
coend
}
father(){
while(1){
wait(mutex);
將水果放在盤子
if(放的是橘子) signal(mutex1);
else signal(mutex2);
}
}
son(){
while(1)
wait(mutex1);
吃橘子
signal(mutex);
}
}
daugther(){
while(1)
{
wait(mutex2);
吃蘋果
signal(mutex);
}
}
二:在一輛公共汽車上,司機和售票員各行其職,司機負責開車和到站停車;售票員負責售票和開、關門,當售票員關好車門後,司機才能繼續開車行駛。試用P、V操作實現司機與售票員之間的同步。
semaphore door1=door2=1;
semaphore S1=S2=0;
main(){
cobegin
driver();
busserver1();
busserver2();
coend
}
driver(){
P(door1);
P(door2);
啟動車輛
到站停車
V(S1);
V(S2);
}
busserver1()
{
P(S1);
開前門
關前門
V(Door1);
售票
}
busserver2()
{
P(S2);
開後門
關後門
V(Door2);
售票
}
三:某銀行提供1個服務窗口和10個供顧客等待的座位。顧客到達銀行時,若有空座位,則到取號機上領取一個號,等待叫號。取號機每次僅允許一位顧客使用,當營業員空閑時,通過叫號選取一位顧客,並為其服務。顧客和營業員的活動過程描述如下:
semaphore emptyseats=10
semaphore fullseats=0
semaphore mutex=1
cobegin
{
process 顧客i { wait(emptyseats); //獲取一個座位 wait(mutex); //占用取號機取號 從取號機取號 wait(mutex); signal(fullseats); //座位上增加一個顧客 等待叫號,獲得服務 signal(emptyseats); }
}
process 營業員
{
while(TRUE)
{
wait(fullseats);
叫號
為顧客服務;
}
}
}coend
操作系統中的PV原語