P是荷蘭語Proberen(測試)的首字母。為阻塞原語,負責把當前進程由運行狀態轉換為阻塞狀態,直到另外一個進程喚醒它。也就是不好的一方面。
V是荷蘭語Verhogen(增加)的首字母。為喚醒原語,負責把一個被阻塞的進程喚醒,它有一個參數表,存放著等待被喚醒的進程信息。也就是變好的一方面。
1,桌上有一空盤,允許存放一只水果。爸爸可向盤中放蘋果也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規定當盤空時一次只能放一只水果供吃者取用,請用P、V原語實現爸爸、兒子、女兒三個并發進程的同步。
解:設三個信號量S、So、Sa;信號量S表示盤子是否為空,其初值為1;信號量So表示盤中是否有桔子,其初值為0;信號量Sa表示盤中是否有蘋果,其初值為0。同步描述如下:
int S=1;
int Sa=0;
int So=0;
main(){beginfather();son();daughter();end
}
father(){while(1){P(S);//將水果放入盤中if(放入盤中的是桔子){V(So);}else{V(Sa);}}
}
son(){while(1){P(So);//從盤中取出桔子V(S);//吃橘子}
}
daughter(){while(1){P(Sa);//從盤中取出蘋果V(S);//吃蘋果}
}
2,設公共汽車上,司機和售票員的活動分別是:
在汽車不斷地到站、停車、行駛過程中,這兩個活動有什么同步關系?用信號量和P、V操作實現他們的同步。
解:司機和售票員的活動得同步,如下所示
司機 | 售票員 |
---|---|
啟動車輛 | 關車門 |
正常行車 | 售票 |
到站停車 | 開車門 |
設兩個信號量S1,S2;
S1表示是否運行司機啟動汽車,其初值為0
S2表示是否運行售票員開門,其初值為0
用P、V原語描述如下:
int S1=0;
int S2=0;
main(){begindriver();busman();end
}
driver(){while(1){P(S1);啟動車輛;正常行車;到站停車;V(S2);}
}
busman(){while(1){關車門;V(S1);售票;P(S2);開車門;上下乘客;}
}
未完待續。。。