Dekker s演算法和Peterson演算法

2021-07-11 20:48:20 字數 2554 閱讀 4714

首先了解幾個術語

mutual access:互斥訪問,即一次只允許乙個程序訪問

critical region:臨界區,一些會引起衝突的共享變數,共享記憶體等,所以要進行互斥訪問

race condition:競爭條件,即哪個程序進入臨界區完全取決於哪個程序獲得了cpu

dekker』s演算法和peterson演算法都是用於實現critical region的互斥訪問的軟體方法。

先看幾個反例,理解為什麼演算法要設計的這麼麻煩。

例1:

void p1(void)

critical_section();

turn=2;

}}

void p2(void)

critical_section();

turn=1;

}}

這段**確實可以確保互斥訪問,但是存在如下兩個問題:

1. busy waiting的問題,一直忙等待浪費了cpu時間

2. 並不滿足race condition,即兩個程序是相互交替執行的,而且那個最開始先執行取決於turn的初始值,並不是兩個程序哪個先競爭得到了cpu時間片

例2:

void p1(void)

//timeout

p1inside=true;

critical_region();

p1inside=false;

}

}void p2(void)

//timeout

p2inside=true;

critical_region();

p2inside=false;

}}

例子2相對於例子1解決了race condition的問題,即兩個程序哪個進入critical region取決於哪個先獲得時間片。

且乙個程序可能執行多次之後另乙個程序才能夠得到執行。race condition發生在while(p1inside)和while(p2inside)處。

這段**乍一看很好,可是會發生p1和p2同時進入critical region的情況。比如,p2剛檢查完p1inside為false要進入critical region(跳出while迴圈),此時p1講p1inside置為true進入critical region,此時就會發生同時進入critical region的情況。

出現這種情況的原因在於在while(p2inside)之後(相當於獲取了進入critical region的許可權),才更改p1inside的狀態。而這兩個步驟之間並不是原子操作,所以可能發生while(p2inside)之後還沒有來得及更改p1inside的狀態便發生上下文切換。

如果在while(p2inside)獲得進入critical region之前就設定p1inside,可以解決上述問題,具體看例3

例3:

void p1(void)

critical_region();

p1wantenter=false;

}}

void p2(void)

critical_region();

p2wantenter=false;

}}

例3雖然不會發生p1和p2同時進入critical region的情況,但是會產生deadlock的情況。原因是p1wantenter=true並不表示p1已經進入了critical region,而p2以p1wantenter作為檢查的條件,就是認為p1已經進入了critical region,此時會發生p1和p2同時設定了wantenter=true但二者都不能進入critical region的情況!

dekker』s algorithm

對例3的問題改進得到dekker』s algorithm

void p1(void)

p1wantenter=true;}}

critical_region();

turn=2;

p1wantenter=false;

}}

void p2(void)

p2wantenter=true;}}

critical_region();

turn=1;

p2wantenter=false;

}}

其實可以模擬上課舉手回答問題的情形:

兩個同學同時舉手回答問題(wantenter=true),老師選擇乙個回答(turn來控制),這時候另乙個同學放下手(wantenter=false),等待另乙個同學回答完後(turn來控制)再舉手(wantenter=true)。

如果沒有同時舉手回答問題時,則直接獲得回答問題的機會,此時不需要turn來控制。

peterson演算法:

peterson演算法相比dekker』s 演算法更加簡單

void p1(void)

critical_region();

p1wantenter=false;

}}

演算法和演算法分析

一 演算法的基本概述 演算法是為了解決某類問題而規定的乙個有限長的操作序列。乙個演算法必須滿足以下五個重要特性 1 有窮性2 確定性3 可行性 4 有輸入5 有輸出 二 設計演算法的原則 1.正確性 2.可讀性 3 健壯性 4.高效率與低儲存量需求 三 演算法的時間複雜度簡介 語句頻度 語句重複執行...

演算法和演算法分析

演算法是為了解決某類問題而規定的乙個有限長的操作序列。五個特性 1.有窮性2.確定性3.可行性4.輸入5.輸出 1.正確性2.可讀性3.健壯性4.高效性 1.問題規模和語句頻度 不考慮計算機的軟硬體等環境因素,影響演算法時間代價的最主要因素是問題規模。問題規模是演算法求解問題輸入量的多少,是問題大小...

演算法和演算法分析

1.定義 是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示乙個或多個操作。2.特徵 1 有窮性 乙個演算法必須在執行有窮步之後結束,即演算法中的每個步驟在有限的時間內完成。2 確定性 每條指令必須有確定的含義,無二義性,在任何條件下,演算法都只有一條執行路徑。3 可行性 乙個演...