在作業系統與並發程式設計中,臨界資源 是指:
一種稀缺資源,可被多個進程共享使用,但同一時刻只允許一個進程存取。
典型例子:
進程間通信(IPC)需解決三大核心問題:
前幾章已介紹訊號與管道解決「資料傳遞」問題,本章聚焦「資源共享」——即臨界資源的保護機制。
// 經典競態條件範例:銀行轉帳 // 進程 A:讀取餘額 1000 → 扣除 100 → 寫回 900 // 進程 B:讀取餘額 1000 → 扣除 200 → 寫回 800 // 最終結果:800(錯誤!正確應為 700)
臨界區 是進程中存取臨界資源的程式碼片段。若多進程同時進入各自的臨界區操作同一資源,即發生競態條件。
int turn; // 輪到誰
int flag[2] = {0}; // 想進入旗標
// 進程 i 進入臨界區
flag[i] = 1;
turn = j;
while (flag[j] && turn == j); // 忙等待
// 臨界區
flag[i] = 0; // 離開
// 原子操作範例(偽代碼)
boolean test_and_set(boolean *lock) {
boolean old = *lock;
*lock = true;
return old; // 原子執行,不可中斷
}
// 自旋鎖實現
while (test_and_set(&lock)); // 獲取鎖
// 臨界區
lock = false; // 釋放鎖
文章提到的 vim 與 gedit 同時編輯 test.c:
fcntl(F_SETLK)、flock() 或 lockf() 系統呼叫文章預告將介紹兩種核心 IPC 同步物件:
這兩者都是 System V IPC 體系的核心組件,廣泛應用於 Unix/Linux 系統程式開發。
臨界資源是並發程式設計的核心挑戰。理解競態條件、臨界區概念,掌握從軟體演算法到硬體指令再到 OS 核心原語的互斥演進脈絡,是寫出正確、高效並發程式的基石。下一章將深入 System V IPC 架構與具體 API 實戰。