#6–3 作業系統

Peterson’s Solution

慈慈
4 min readNov 28, 2020

這篇要來講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的程式碼

⚠️其實就是兩個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)

--

--

Responses (1)