行程與行程控制

行程映像與其定址空間(process image)

當一個行程在執行時,它的整個世界都活在記憶體裡:它正在執行的機器指令、它握著的變數、它正進行到一半的函式呼叫堆疊、它配置出來的記憶體區塊。這份執行中程式在記憶體裡的完整樣貌,就叫做行程映像。想像某一台特定運行中汽車的內部:引擎本體(程式碼)、油箱裡的燃料(資料)、此刻坐著人的座椅(堆疊)。映像就是這整個排佈好的內部。

映像所在的空間,是行程的定址空間:一段屬於這一個行程、不屬於其他任何行程的記憶體位址範圍。慣例上它被分成幾個區段——文字段(唯讀的機器碼)、資料段與 BSS 段(已初始化與清為零的全域變數)、堆積(程式在執行期向系統要的記憶體,向上成長)、堆疊(函式呼叫框,向下成長)。關鍵在於這些是虛擬位址:每個行程都看見自己乾淨、私有、從近乎零開始的範圍,由核心加上硬體在背後悄悄把它們轉譯成真正的實體記憶體。兩個行程都可以用位址 0x1000 而永不相撞,因為每個位址都是各自映像私有的。

為何重要:行程映像正是 exec() 在一個程式啟動另一個程式時整批換掉的東西(它丟掉舊映像、載入新映像),也是 fork() 在一個行程一分為二時所複製的東西。私有定址空間是隔離行程的那道牆:某行程裡一個失控的指標無法塗改另一行程的記憶體,因為那個位址根本不指向同一批實體位元組。理解映像——文字、資料、堆積、堆疊——正是讓你能把記憶體區段、堆疊與堆積當成同一個運行整體的各部分來推理的關鍵。

一個小小 C 程式的映像可能長這樣:低位址處是文字段,存放已編譯的程式碼,接著是放全域變數的資料段/BSS,再來是隨你呼叫 malloc() 而向上成長的堆積,而在很遠的高位址處,是隨函式呼叫函式而向下成長的堆疊。全都在核心為這個行程建立的同一個私有定址空間之內。

一個行程的定址空間:文字、資料、向上長的堆積、向下長的堆疊——全是虛擬且私有的。

這些「私有」位址是虛擬的,不是實體的。好幾個行程可以顯示一模一樣的位址,卻指向不同的真實記憶體;轉譯由核心與 MMU(虛擬記憶體那一欄)完成,這正是隔離得以成立的原因。

又称
process address spacememory image行程記憶體映像