背景、臨界區問題與 Peterson's Solution
備註
本系列文章內容參考自經典教材 Operating System Concepts, 10th Edition (Silberschatz, Galvin, Gagne)。本文對應章節:Section 6.1 Background、6.2 The Critical-Section Problem、6.3 Peterson's Solution。
在前幾章,我們看到行程(Process)可以並行(Concurrent)或平行(Parallel)執行。行程排程器(CPU Scheduler)在行程之間快速切換,使多支程式能夠「同時」推進。當這些行程需要共享資料時,問題就出現了:如果兩個行程在毫無協調的情況下同時讀寫同一份資料,結果可能是錯誤的,而且每次執行的結果都可能不同。本章的核心目標,就是找出一套機制,確保協作行程在共享資料時的有序執行。
6.1 背景 (Background)
從生產者-消費者問題談起
以第 3 章介紹的有界緩衝區(Bounded Buffer) 為例,生產者和消費者透過一個共享緩衝區交換資料。原本的實作為了追蹤緩衝區中的物品數量,加入了一個整數變數 count,初始值為 0。每次生產者放入一個物品時執行 count++,每次消費者取出一個物品時執行 count--。
// 生產者
while (true) {
while (count == BUFFER_SIZE)
; // 等待,緩衝區滿
buffer[in] = next_produced;
in = (in + 1) % BUFFER_SIZE;
count++;
}
// 消費者
while (true) {
while (count == 0)
; // 等待,緩衝區空
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
}
這兩段程式碼分開執行