Peterson's Solution 是一個以軟體為基礎的經典臨界區間問題解答,限制兩個行程在臨界區間和剩餘區間之間交替執行。
turn
; 表示輪到誰進入臨界區間。例如,turn = 0 => 行程 P0 允許在它的臨界區間執行。flag[2]
; 表示一個行程是否準備好進入它的臨界區間。例如,flag[1] = True => 行程 P1 準備好進去它的臨界區間。void Pi() {
do {
// 進入臨界區
flag[i] = true; // 表示想進入臨界區
turn = j; // 設置輪到另一個行程,自己想進入,但先讓給別人
while (flag[j] && turn == j); // 檢查別人有無意願,若對方有意且turn在對方手上,則等待。
critical section
// 退出臨界區
flag[i] = false; // 表示自己無意願進入臨界區
remainder section
} while (true);
}
提出解答之後,就是要證明滿足臨界區間問題的三項要求。用反證法來證明。
假設兩個行程都在CS(critical section)中,產生矛盾,故反證。
某個想進入的行程總是能進去CS。
想進去的行程不會無止盡的等待,因為行程執行的時候,會先把turn給對方,所以自己不能一直重複做多次。
參考:周志遠作業系統 Ch6: Process Synchronization (B): Software Solution