首先了解幾個術語
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 可行性 乙個演...