#6–3 作業系統
這篇要來講Critical Section Problem的解法(Peterson’s Solution)
前言
如果還沒看過之前的文章,可以先去複習一下喔~
#6–1 Race Condition
#6–2 Critical Section
正文開始
Peterson’s Solution
他是一個基於軟體的演算法,在現在的架構下,不保證能成功執行
因為為了提高系統性能,處理器或編譯器可以重新排序沒有依賴性的讀取和寫入操作,這樣會出問題(Reordering)
現在我們有兩個process,分別是process i 和 process j
還有兩個變數int turn;
//turn=i,就代表是i進入Critical Section
boolean flag[2];
//flag是用來記錄,process是否「想」進入Critical Section
//peterson's solution的程式碼while(true){ //entry section
flag[i] = true; //代表我想進入critical section
turn = j; //但我把執行權讓給j
while(flag[j] && turn==j){
//如果j也想執行 -> j執行critical section
//如果j不想執行 -> i執行critical section
} //critical section //exit section
flag[i] = false; //代表我不想進入critical section了
//因為已經執行完了
//remainder section
}
⚠️其實就是兩個process一直讓對方先進入critical section⚠️
證明1. mutual exclusion
因為 while(flag[j] && turn==j)
所以 j不想執行以後才會輪到i執行
因此 i j 不可能同時值行critical section
-> 即證
2. progress
假設是process i想進去,process j不想進去
process i就一定會進去
因為process j 會 先禮讓process i
若兩個都想進去
看是先執行哪個process
另一個process就會先執行critical section
-> 即證
3. bounded waiting
因為process i 進入critical section前做了
flag[j]=true; 和 turn = j;
代表「我想執行了,但先讓給對方執行」
因此對兩支process來說
都不會無限插隊
-> 即證
Reordering
為了提高系統性能
處理器或編譯器可以重新排序
沒有依賴性的讀取和寫入操作
這樣會出問題
看下面的圖
會同時有兩個process進入
各自的Critical Section(CS)