行程與行程控制
行程(process)
想像食譜書上印的一道食譜,和此刻廚房裡真正在進行的烹飪之間的差別。食譜只是紙——同一道食譜可以被煮許多次。行程就是那場烹飪:程式的一個活生生、執行中的實例,有自己在爐上的鍋、自己切到一半的洋蔥、自己走到的步驟。食譜書(磁碟上的程式檔)本身什麼也不做;行程是作業系統把它拿起來、開始執行時所發生的事。
具體來說,當你啟動一個程式,作業系統會替它建立一個行程:它劃出一塊私有的記憶體區域,存放程式的程式碼、資料、堆疊與堆積;它給這個行程一個編號來辨識它;然後讓 CPU 代它去執行程式的指令。核心會保留一份小紀錄(行程描述符),追蹤這個執行中實例的一切——它擁有哪些記憶體、開了哪些檔案、目前是在執行還是在等待、它的父行程是誰。行程就是這一整捆執行狀態,而不是它源自的那個檔案。
為何重要:行程是作業系統「一個正在執行的程式」這個概念的基本單位。作業系統以行程為單位排程 CPU 時間、以行程為單位分配記憶體,並把行程彼此隔離,使得其中一個當掉不會搞壞其他的。這個欄位裡幾乎所有其他內容——建立行程、結束行程、查出它如何結束——都是在管理這些執行中的實例。請把這個區別記牢:程式是靜靜躺著的檔案;行程是那個檔案被賦予生命、拿到資源去執行的樣子。
把同一個文字編輯器開兩次,你就得到從同一個程式檔執行出來的兩個行程。每個都有自己的記憶體與自己的 PID;在其中一個裡打字不會改到另一個,即便兩者都源自磁碟上同一個可執行檔。
一個程式檔,兩個獨立執行的行程——檔案是共用的,執行狀態不是。
行程不等於執行緒:行程擁有一個定址空間與一批資源,而執行緒(欄位 m)是跑在同一個行程內、共用那個定址空間的多條獨立執行流。
又称
另见