行程與行程抽象
行程位址空間(process address space)
想像每個行程都拿到一間自己的公寓,從大門(位址 0)到最裡面的牆(最高位址)一間一間編號。在裡面,行程隨自己喜好擺放家具,而且看不到也碰不到別人的公寓。行程位址空間就是這段私有、編了號、允許某個行程使用的記憶體位址範圍,並劃分成幾個眾所周知的區域。
典型的配置,由低位址往上是:存放機器指令的文字(程式碼)區段;接著是初始化資料與 BSS(未初始化資料),存放全域與靜態變數;再來是堆積,它在程式執行時要求更多記憶體時往上長;最頂端是堆疊,隨著函式被呼叫而往下長。堆積與堆疊穿越中間那塊大空隙朝彼此生長,使各自都有擴張的餘地。關鍵在於這些通常是虛擬位址:同一個位址數字在兩個行程裡指向不同的實體記憶體,因為硬體會分別轉譯每個行程的位址。這正是公寓得以保持私密的原因。
這個抽象默默承擔了大量工作。它讓每個行程都能假裝自己擁有一整塊從零開始、乾淨而連續的記憶體,而作業系統與記憶體硬體則暗中把真正的儲存散落在任何放得下的地方。它是保護(一個行程未經許可不能讀取另一個行程的位址空間)與虛擬記憶體(部分空間可以放在磁碟上、需要時再載入)的基礎。一個常見的誤解是把位址空間當成實際用掉的 RAM;它其實是一張位址地圖,其中許多部分隨時可能沒有實體支撐、被共享、或被換出。
一個 32 位元行程可以指名從 0 到 2^32 - 1 的位址,範圍達 4 GB,即使機器只有 1 GB 的 RAM 也一樣。其中大部分範圍是空的;只有它實際碰到的程式碼、資料、堆積頁與堆疊頁才有真正的記憶體支撐。
位址空間是一張「可能位址」的地圖,而不是已用 RAM 的度量。
那張整齊的圖(文字、資料、BSS、堆積、空隙、堆疊)是經典配置;真實系統還會加入共享程式庫、記憶體映射檔案與隨機化擺放,所以別假設位址是固定的。
又稱
另見