理解「阻塞」是掌握 Linux 核心程式設計與效能調優的基石。本文深入解析阻塞與睡眠的關係、進程的三種執行狀態、調度演算法核心邏輯,幫助建立正確的核心觀念模型。
當進程呼叫一個阻塞型系統呼叫(如 read() 等待資料、sleep() 等待時間)時,該進程會被核心置於睡眠狀態。此時:
| 狀態 | 子狀態 | 描述 |
|---|---|---|
| 執行中 | 正在被調度執行 | CPU 处于该进程上下文,程式計數器 (eip) 指向其指令,通用暫存器保存中間結果,正在讀寫其位址空間。 |
| 就緒 | 不需等待事件,隨時可執行,但 CPU 暫時執行其他進程,進程在就緒佇列等待調度。 | |
| 睡眠 | — | 等待特定事件(I/O、訊號、鎖、時間等),不佔用 CPU,不在就緒佇列中。 |
Linux 採用基於優先級與時間片的動態調度:
EAGAIN),進程需輪詢或配合 select/poll/epoll 事件通知。usleep() 或 nanosleep(),否則佔滿 CPU。vmstat (r/b 欄位)、pidstat -w、/proc/PID/status (State 欄) 觀察阻塞情況。阻塞不是「卡住」,而是核心為了公平分配 CPU 資源而設計的主動放權機制。深入理解睡眠-就緒-執行的狀態流轉與調度決策,是寫出高效、穩定 Linux 系統軟體的關鍵。