我想了解Peterson的N進程算法,並且遇到了這個問題。試圖瞭解Peterson的N進程算法
問:假設3個進程具有進程ID 0, 1 and 2
。這些進程在單處理器上同時執行,並使用Peterson的N進程算法來控制關鍵部分的執行。每個進程運行以下僞代碼:
lock(pid);
<critical section>;
unlock(pid
其中lock()
和unlock()
函數的定義如
lock(for Process i):
/* repeat for all partners */
for (count = 0; count < (NUMPROCS-1); count++) {
flags[i] = count;
turn[count] = i;
"wait until (for all k != i, flags[k]<count) or (turn[count] != i)"
}
Unlock (for Process i):
/* tell everyone we are finished */
flags[i] = -1;
假設由<flags[0], flags[1], flags[2], turn[0], turn[1]>
值所定義的系統在任何特定時間的狀態和的id當前正在執行的進程。進一步假設系統的當前狀態爲<0,0,0,2,-1>
而進程0
當前正在執行。顯示三個進程從此狀態開始運行到完成的一種特殊方式。在跟蹤三個進程的併發執行時,請在每個步驟顯示系統的狀態。
我的意見上的單處理器並行運行
的進程不能在同一時間在CPU上執行。一次只能在CPU上執行其中的一個。 當一個進程在CPU上執行時,它可能會執行其代碼的任何部分。
// NUMPROCS = 3
- 對於i = 0
lock(for Process 0):
for (count = 0; count < 2; count++) {
flags[0] = count;
turn[count] = 0;
"wait until (for all k != 0, flags[k]<count) or (turn[count] != 0)"
}
Unlock (for Process 0):
flags[0] = -1;
- 對於i = 1
lock(for Process 1):
for (count = 0; count < 2; count++) {
flags[1] = count;
turn[count] = 1;
"wait until (for all k != 1, flags[k]<count) or (turn[count] != 1)"
}
Unlock (for Process 1):
flags[1] = -1;
- 對於i = 2
lock(for Process 2):
for (count = 0; count < 2; count++) {
flags[2] = count;
turn[count] = 2;
"wait until (for all k != 2, flags[k]<count) or (turn[count] != 2)"
}
Unlock (for Process 2):
flags[2] = -1;
我的問題是,從哪裏開始跟蹤代碼?它被認爲是flags[0]=0, flags[1]=0, flags[2]=0, turn[0]=2, turn[1]=-1
,但它將如何幫助我們開始追蹤代碼?
如果我們開始在之前的過程
0
那麼所有的 轉值將被設置爲比什麼是給 給我們不同的值的循環。如果我們通過執行問題的假設意味着過程
0
是在它的 關鍵部分,則在接下來的過程中會設置 轉值別的東西的循環。
爲什麼他們給了我們狀態值以及它如何幫助我們找到從哪裏開始跟蹤代碼。
如果我得到一些提示來幫助我開始跟蹤代碼,那將會很棒。
謝謝你,對於長期問題抱歉。