行程與行程抽象
行程表(process table)
想像一間大飯店的櫃檯,有一塊看板(或一個資料庫)列出當前所有已入住的房客:房號、姓名、需求、帳務。員工查它來找到任一房客,並讓整間飯店井然有序。行程表就是作業系統對「它當前所知的所有行程」的總清單,每個行程一筆紀錄,讓作業系統能找到並管理其中任何一個。
實務上,行程表是一個核心資料結構(依系統而定,可能是陣列、雜湊表或鏈結串列),其中每筆紀錄就是、或指向某個行程的 PCB。當行程被建立時,作業系統加入一筆紀錄;當行程終止並被清理時,紀錄被移除。透過這張表,作業系統可以遍歷所有行程(例如列出它們,或找出某個子行程來清理)、依 PID 查找某個行程,並在環境切換時取得每個行程被保存的狀態。表的大小為「同時能存在多少行程」設下一個硬上限。
行程表讓「作業系統追蹤眾多行程」這件事從一個含糊的承諾變成具體的東西。它與 PCB 緊密相連(表裡裝著它們),也與排程及建立相連(行程來去之間,紀錄隨之出現與消失)。一個誠實的限制:由於表是有限的,一個盡其所能不斷建立行程的「fork 炸彈」終將填滿這張表、使新行程無法啟動,這正是為什麼系統要對每位使用者施加行程數量上限。
一個列出所有執行中行程的指令,實際上是(透過核心)在讀取行程表,每筆紀錄印一行:它的 PID、狀態、擁有者,以及它正在執行的程式。
列出行程,就是在讀取作業系統的行程表。
行程表是有限的。一個無止境衍生行程的程式可以把它耗盡(fork 炸彈),這正是為什麼存在每位使用者的行程數上限。
又稱
另見