并发进程同步
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原語描述如下:
未完待續。。。
總結