一、什麼是臨界區?對臨界區的訪問應該遵循什麼準則?
臨界區:訪問臨界資源的那段代碼。
準則:
- 互斥,如果有進程在某個臨界區執行,其他進程將被排斥在臨界區外,有相同臨界資源的臨界區都需要互斥,無相同臨界資源的臨界區不需要互斥。
- 有空讓進,臨界區內無進程執行,應允許一個請求進入臨界區的進程立即進入自己的臨界區,以有效利用臨界資源。
- 有限等待,每個進程進入臨界區前的等待時間必須有限,以免陷入“死等”狀態。
二、請談談同步信號量的值有什麼含義。
同步信號量的值大於0時,表示這一資源沒有被使用的數量,或者釋放的數量,可分配請求使用這個資源的進程。
同步信號量的值等於0時,表示這一資源分配完畢,或者沒有被釋放,如果現在有進程申請這個資源,必須等待。
同步信號量的值小於0時,表示請求這一資源沒有得到而正在等待這一資源的數目。
三、有四個進程S1、R1、R2和R3,其中S1向緩衝區BUFF發送消息,R1、R2和R3從緩衝區中接收消息。發送和接收的規則如下:
- 緩衝區BUFF任何時候只能存放1個消息;
- R1、R2和R3每次可取S1存放在緩衝區中的消息;
- 每個存放在緩衝區中的消息必須被R1、R2和R3均接收後才能清除。
請用信號量機制來實現這4個進程間的同步。
信號量初值S1=1,S2=0,S3=0,S4=0,MUTEX=1;
int Count=0;
S1 R1 R2 R3
repeat repeat repeat repeat
P(S1) P(S2) P(S3) P(S4)
Send message get message get message get message
P(MUTEX) P(MUTEX) P(MUTEX) P(MUTEX)
Count=0 Count=Count+1 Count=Count+1 Count=Count+1
V(S2) if(Count=3) if(Count=3) if(Count=3)
V(S3) V(S1) V(S1) V(S1)
V(S4) V(MUTEX) V(MUTEX) V(MUTEX)
V(MUTEX) until false until false until false
until false
四、桌上有一個空的水果盤,且盤中一次只能放一個水果。爸爸專向盤中放蘋果,媽媽專向盤中放桔子,一個兒子專等吃盤子中的桔子,一個女兒專等吃盤子中的蘋果。固定每次當盤子空時爸爸或媽媽可向盤中放一個水果,僅當盤中有自己需要的水果時,兒子或女兒可從中取出。請用PV操作實現爸爸、媽媽、兒子和女兒四個進程的同步。
信號量初值apple=0,orange=0,plate=1
Dad(){
while(1){
準備蘋果;
P(plate);
放蘋果;
V(apple);
}
}
Daughter(){
while(1){
P(apple);
拿蘋果;
V(plate);
吃蘋果;
}
}
Mom){
while(1){
準備桔子;
P(plate);
放桔子;
V(orange);
}
}
Son(){
while(1){
P(orange);
拿桔子;
V(plate);
吃桔子;
}
}