行程與行程抽象
父子行程關係(parent-child relationship)
家庭有一種自然的結構:每個人都有父母,而這層關係帶著義務(父母照顧子女)。行程也是這樣運作。除了最初的那個之外,每個行程都是由另一個行程建立的,這層關係稱為父行程與子行程:做出建立動作的是父行程,被建立出來的是子行程。這層關係背負著實實在在的責任,尤其是清理。
當行程呼叫 fork 時,它成為父行程,新行程是它的子行程。子行程在建立的那一刻從父行程繼承許多東西——記憶體的副本、開啟的檔案等等——但之後它們作為各自獨立、各有狀態的行程而執行。作業系統記錄每個子行程的父行程(每個行程都知道自己父行程的 PID),這讓父行程得以追蹤並管理它的子行程。最重要的義務是:當子行程結束時,父行程應當等待它並收取它的退出狀態,這個動作稱為回收(reaping);在父行程這麼做之前,結束了的子行程會以殭屍的形式滯留,佔著一個行程表的位置。
這層父子連結正是整棵行程樹得以編織起來的那條線:每個行程都指回一個父行程,一路向上直到最初的那個行程。它也解釋了你可能遇到的兩種怪事。殭屍是已退出、但父行程尚未回收的子行程。孤兒是父行程先死掉的子行程;孤兒會被最初的行程(init)收養,由它接手回收它們的義務。所以父子關係不只是家譜,更是終止的行程得以被清理的機制。
命令列直譯器(父行程)fork 出一個子行程來執行指令。指令執行期間,直譯器是它的父行程;指令退出時,直譯器等待它、回收它,並讀取它的退出狀態,以得知指令是否成功。
父行程建立子行程,之後回收它並讀取它的狀態。
回收是父行程的工作。若父行程從不等待已結束的子行程,子行程就成了殭屍;若父行程先死,子行程就成了孤兒,由 init 收養。
又称
另见