2016-11-18 311 views
-3

任何人都可以爲我解釋這個嗎?4個進程的信號量執行

在以下代碼中,四個進程使用printf產生輸出,並使用三個信號量R,ST進行同步。我們假設printf不會導致上下文切換。

/* initialization */ 
Semaphore R=1, S = 3, T = 0; 

/* process 1 */ 
while(true) { 
    P(S); 
    printf('A'); 
} 

/* process 2 */ 
while(true) { 
    P(T); 
    printf('B'); 
    printf('C'); 
    V(T); 
} 

/* process 3 */ 
while(true) { 
    P(T); 
    printf('D'); 
    V(R); 
} 

/*process 4 */  
while(true) { 
    P(R);  
    printf('E');  
    V(T); 
} 

當這組進程運行時會打印多少個A和B?

+3

請格式化您的代碼。這是'c'還是'java'? –

+0

這是一種僞代碼 –

+0

認真!很難閱讀和理解你在說什麼。請看看[如何創建一個最小化,完整和可驗證的示例](http://stackoverflow.com/help/mcve) – mmushtaq

回答

0

進程1與其他進程無關,因爲它只是獲取S,並且什麼都不釋放。它會打印'A'3次,並且會永久睡眠。

方法2 & 3將立即在啓動睡眠,因爲Ť源不可獲得在起動。過程4將獲取最後一個R並釋放一個T.此釋放將喚醒進程2或3.在下一個循環中,進程4將休眠,因爲沒有R。

到目前爲止,我們有:R = 0,S = 0,T = 1

假設T的釋放喚醒的進程2,然後將收購回來的T,打印 'BC',會釋放回一個T.這釋放將喚醒睡眠過程3在接下來的循環中,處理2將睡眠,因爲流程3取得的T.

方法3將使用T,將打印一個「d」,會釋放一個R. R的這個版本將把第二,第三和第四個進程放到無限循環中。因爲R和T永遠不會同時被完全獲得。

我們無法知道有多少燒烤將被打印出來,但是我們可以說「A」將被打印3次。

+1

非常清楚。非常感謝。 –

+0

不客氣。 –