2014-01-05 86 views
1

我是一名機械工程師,我無法理解他們如何才能在以下問題中解決此問題。如果有人能幫助我理解,那對我來說真的很有幫助,至於他們如何得到這樣的解決方案。瞭解信號燈

給定兩個進程P1和P2訪問共享資源ShR。使用信號來確保P1,P1,P2(即P1,P1,P2(第一週期),P1,P1,P2(第二週期),...)的循環訪問順序到ShR。你也應該給使用的初始值。

解決這個問題是:

/* semaphore initialization */ 
init (S1,2) 
init (S2,0) 

/* process P1 */ 
loop 
    wait(S1) 
    access(ShR); 
    signal(S2) 
end loop; 

/* process P2 */ 
loop 
    wait(S2) 
    wait(S2) 
    access(ShR); 
    signal(S1) 
    signal(S1) 
end loop; 

回答

2

一個semaphore用於限制對資源的同時訪問。比方說,如果我想讓500人進入俱樂部,我可以列出誰進出俱樂部。

這相當於信號燈up()down()(在你的代碼是signal()wait()

說我們的信號是保鏢:

我們將初始化它通過調用init (Bouncer, 500)

一個人進入俱樂部會讓保鏢稱它爲wait(Bouncer)的方法,使得更少的空間可用。 210離開俱樂部的人會讓保鏢稱它爲signal(Bouncer)方法,使得更多的房間可用。

當保鏢調用500多個wait總比signal S,還有在俱樂部沒有空間,沒有人可以在去

在你的問題:

/* semaphore initialization */ 
1. init (S1,2); /* make two rooms available for P1 in shared resource */ 
2. init (S2,0); /* make no room for P2 */ 

/* process P1 */ 
1. loop 
1.1. wait(S1); /* make one less room available for P1 */ 
1.2. access(ShR); /* access resource... */ 
1.3. signal(S2) /* make one more room for p2 */ 
1. end loop; 

/* process P2 */ 
1. loop 
1.1. wait(S2); /* wait for room to clear for P2 on resource */ 
1.2. wait(S2); /* wait for room to clear for P2 on resource */ 
1.3. access(ShR); /* access resource... */ 
1.4. signal(S1); /* make one more room to P1 */ 
1.5. signal(S1); /* make one more room to P1 */ 
1. end loop; 

這些循環將展開這個序列(假設我們從初始狀態開始):

P1循環迭代兩次,因爲它有兩個允許訪問資源的開始。

環路P2 等待兩次,(wait在循環的開始調用了兩次),只有環路P1後達到1.3發生兩次(兩個資源爲P1訪問?檢查!)

然後循環用於P1絕等待來自P2的循環信號,它在1.4和1.5上。這兩個信號允許兩次循環訪問P1,這在實踐中將系統「重置」爲初始狀態,因此符合練習標準(只需循環我的解釋,然後再...然後吃一些冰淇淋)

重要: 的循環不一定展現在這個特定的順序,但解釋應足以理解程序流程。 P2的循環在它從P1的兩個循環得到兩個signal之前無法訪問該資源,並且循環1在來自P1的循環中的兩個signal之前不能重新迭代。

+1

非常好。整齊地解釋。非常感謝你。 – Max

+0

如果您覺得有用,請不要忘記接受該答案。 –