帕特森(Peterson)解決方案


這是在使用者模式下實現的軟體機制。 這是一個繁忙的等待解決方案,只能實施兩個流程。 它使用兩個變數:迴轉變數和感興趣變數。

解決方案的程式碼如下-

# 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行之後進程被搶占,那麼它在下一次機會中肯定會進入臨界區。

可移植性

這是完整的軟體解決方案,因此它在每個硬體上都是可移植的。