行程與行程控制

行程控制區塊/行程描述符(process control block)

如果把作業系統想成一間同時照顧許多病人(行程)的醫院,它需要在每張床尾掛一張病歷表——這位病人是誰、需要什麼、目前狀況、是誰收他入院。行程控制區塊就是那張病歷表:核心替每個行程保存的一個資料結構,存放作業系統管理這個行程、以及在暫停它之後能精準從原處接續所需的全部記錄。

PCB 裡有什麼?粗看一眼:PID 與 PPID;存下來的 CPU 暫存器值(包含程式計數器),好讓行程能被精準地暫停與恢復;目前的行程狀態(執行中、就緒、阻塞等等);關於其定址空間的資訊(記憶體在哪);它的檔案描述符表;它的憑證(使用者與群組 ID);像優先順序這樣的排程資訊;以及像已用了多少 CPU 時間這樣的會計記錄。在 Linux 上這個結構叫 task_struct。核心把這些放在一張表或一張清單裡,以便用 PID 找到任一行程並在它們之間切換。當核心暫停一個行程、改跑另一個時——一次上下文切換——它把執行中行程的暫存器存進它的 PCB,再把下一個的從它的 PCB 載出來。

為何重要:從作業系統的角度看,PCB 正是一個行程真正「居住」的地方——它是作業系統對一個執行中實例的完整記錄。這個欄位裡幾乎每個操作都會碰到它:fork() 複製一份 PCB,exec() 更新描述記憶體映像的那些部分,wait() 讀取核心存在那裡的結束狀態,排程則翻動狀態欄位。你很少會直接碰 PCB(它住在核心記憶體裡),但知道它存在,就能把作業系統如何同時周旋於數百個行程、又能完美恢復每一個的奧祕揭開。

在 Linux 上,你可以透過讀 /proc/<pid>/status 瞥見住在 PCB 裡(或從中導出)的欄位:它顯示 PID、PPID、狀態(像「R (running)」或「S (sleeping)」)、擁有者使用者等等——這是一扇通往核心內部描述符、人類可讀的窗。

/proc/<pid>/status 是核心存在 PCB 裡那些記錄的一個可讀視圖。

PCB 是核心的資料,不是你的程式擁有、能在記憶體裡隨意讀取的東西。ps 與 /proc 檔案這類工具提供的是經過整理的安全視圖;真正的結構住在受保護的核心空間裡。

又稱
PCBprocess descriptortask struct行程控制區塊