行程與行程抽象

程式與行程的區別

這裡有一組好用的比喻。程式像一份樂譜:一套靜態的指令,無論有沒有人演奏,它都靜靜地放在那裡。行程則是那份樂譜的一次演出:一個活生生、有時間性的事件,有當前彈到的音符、有速度、有演奏者。同一份樂譜可以被演奏許多次,在許多房間裡同時上演。這正是程式與行程之間的關係。

具體來說,程式是磁碟上一個被動的檔案:一串機器指令外加初始資料,以可執行檔的形式儲存。它自己什麼也不做。行程則是一個活躍的實體:當作業系統把那個程式載入記憶體、給它一個位址空間、把程式計數器設到第一條指令、並讓 CPU 開始執行時,程式就成了行程。行程擁有程式在磁碟上沒有的狀態:當前的程式計數器、暫存器的值、函式呼叫的堆疊、已配置記憶體的堆積,以及開啟的檔案。把同一個程式執行兩次,就建立出兩個行程,各有兩套獨立的這類狀態。

為什麼要強調這一點?因為幾乎後面每個概念都仰賴它。作業系統排程的是行程,不是程式。它保護的是某個行程的記憶體不被另一個行程侵犯,而不是某個程式檔不被另一個程式檔侵犯。讓一個行程當掉的臭蟲,未必會讓另一個執行相同程式的行程當掉。而「執行中」這個說法只屬於行程:程式不會自己「執行」,它是被執行的——靠著被變成一個行程。

/usr/bin/python3 是一個程式(一個檔案)。在三個終端機分別輸入 python3,會從這同一個檔案啟動三個行程;每個都有自己的變數,結束其中一個並不影響其他。

那個檔案是程式(被動的);每個執行中的實例都是行程(活躍的)。

常見的口誤是說「我有兩個程式在跑」。你想表達的通常是兩個行程。程式檔始終只有一個;執行它才產生行程。

又称
passive vs active靜態程式與動態行程