這是在使用者模式下實現的軟體機制。 這是一個繁忙的等待解決方案,只能實施兩個流程。 它使用兩個變數:迴轉變數和感興趣變數。
解決方案的程式碼如下-
# define N 2
# define TRUE 1
# define FALSE 0
int interested[N] = FALSE;
int turn;
voidEntry_Section (int process)
{
int other;
other = 1-process;
interested[process] = TRUE;
turn = process;
while (interested [other] =True && TURN=process);
}
voidExit_Section (int process)
{
interested [process] = FALSE;
}
到目前為止,每個解決方案都受到一個或另一個問題的影響。 但是,Peterson解決方案為您提供了所有必要的要求,例如互斥,進度,有限等待和可移植性。
Peterson解法分析
voidEntry_Section (int process)
{
1. int other;
2. other = 1-process;
3. interested[process] = TRUE;
4. turn = process;
5. while (interested [other] =True && TURN=process);
}
Critical Section
voidExit_Section (int process)
{
6. interested [process] = FALSE;
}
這是一個雙進程解決方案。假設有兩個合作進程:P1和P2。 入口部分和退出部分如下所示。 最初,感興趣的變數和轉向變數的值是0
。
最初進程P1到達並想要進入臨界區。 它將其感興趣的變數設定為True(指令行3),並將其設定為1(行號4)。 由於P1中給出的條件完全滿足P1,所以它將進入臨界區。
P1 → 1 2 3 4 5 CS
同時,進程P1被搶占,進程P2被計劃。 P2也想進入臨界區並執行入口部分的指令1,2,3和4。 在指令5中,由於它不滿足條件(其他感興趣的變數的值仍然為真),它被卡住了。 因此它進入了繁忙的等待狀態。
P2 → 1 2 3 4 5
P1再次按計劃執行,並通過執行指令編號完成臨界區。 6(將感興趣的變數設定為false)。 現在,如果P2檢查,那麼它將滿足條件,因為其他進程的感興趣變數變為false。 P2也將進入臨界區。
P1 → 6
P2 → 5 CS
任何過程都可以在臨界區輸入多次。 因此,該過程按迴圈順序進行。
相互排斥
該方法確實提供互斥。 在入口部分,while條件涉及兩個變數的標準,因此一個進程無法進入臨界區,直到另一個進程感興趣,並且進程是最後一個更新轉向變數。
進展
一個不感興趣的進程永遠不會阻止另一個感興趣的進程進入臨界區。 如果另一個進程也有興趣,那麼這個進程將會等待。
有限的等待
感興趣的變數機制失敗了,因為它沒有提供有限的等待。 但是,在Peterson解決方案中,死鎖永遠不會發生,因為首先設定轉向變數的進程肯定會進入臨界區。 因此,如果在執行入口部分的第4行之後進程被搶占,那麼它在下一次機會中肯定會進入臨界區。
可移植性
這是完整的軟體解決方案,因此它在每個硬體上都是可移植的。