一個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
之前不能重新迭代。
非常好。整齊地解釋。非常感謝你。 – Max
如果您覺得有用,請不要忘記接受該答案。 –