天天看點

java pv原語_作業系統中的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);

}

}

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