行程與行程控制

行程狀態(執行中、就緒、阻塞、停止)

一個 CPU 核心真正同時只能跑一個行程,可是系統裡有許多行程都需要往前推進。所以在任一瞬間,多數行程其實並沒有在執行——它們在等輪到自己,或在等某件事發生。為了管理這點,核心替每個行程貼上一個狀態標籤,就像航管員追蹤每架飛機是在空中、排隊等起飛、還是停在登機門。狀態住在行程控制區塊裡,並且不斷變化。

粗看一眼這幾個核心狀態:執行中(running)表示行程此刻正在某顆 CPU 上跑。就緒(ready,又稱可執行 runnable)表示它隨時可以跑,只是在等排程器給它一顆 CPU——它在排隊。阻塞(blocked,又稱睡眠 sleeping 或等待 waiting)表示在某事件發生前它無法繼續,例如資料從磁碟或網路抵達、或某個鎖被釋放;阻塞的行程不用 CPU,也不在執行佇列裡。停止(stopped)表示行程被一個信號暫停(例如在 shell 裡按 Ctrl-Z),在被告知繼續之前不會再跑。行程隨著工作流動在這些狀態間移動:它從就緒開始,排程器把它派到執行中,當它呼叫 read() 而資料還沒到時它阻塞,資料來了又變回就緒。

為何重要:狀態能解釋你否則會覺得莫名其妙的行為。一個在等網路而「什麼都沒做」的程式是阻塞,不是在燒 CPU——這是正確又有效率,不是卡住。一長排就緒行程爭搶少數核心,正是負載高時一切都變慢的原因。還有一個特殊、容易混淆的狀態——已終止但父行程尚未回收它的行程——就是殭屍,它之所以仍佔著一個位置,正是因為它的結束狀態還沒被收走。讀懂行程狀態(ps 或 top 裡的字母:R、S、D、T、Z)是理解系統真正在做什麼最快的方法之一。

執行 top,看 S 欄。一個在等鍵盤輸入的行程顯示 S(睡眠/阻塞)。一個密集運算迴圈顯示 R(執行中或就緒)。對前景程式按 Ctrl-Z,它翻成 T(停止);一個在父行程忽略它時就結束的子行程顯示 Z(殭屍)。

ps/top 的狀態字母:R 執行中/就緒、S/D 睡眠、T 停止、Z 殭屍。

阻塞(睡眠)中的行程不是問題——它正確地在等待,且不用 CPU。初學者有時會去「修」一個只是阻塞在 I/O 上的程式;慢的是那個 I/O,不是卡住的行程。

又称
process lifecycle statesrunning ready blocked行程的狀態