在之前學到過程序的記憶體布局中忽略了乙個事實:這一布局存在於虛擬檔案中。
因為對虛擬記憶體的理解將有助於後續對fork系統呼叫、共享記憶體和對映檔案之類的主題闡述,這裡還要學習一下有關虛擬記憶體的詳細內容。
linux像大多數現代核心一樣,採用了虛擬記憶體管理技術。
該技術利用了大多數程式的乙個典型特徵,即訪問區域性性(locality of reference),以求高效使用cpu和ram資源。
大多數程式都展現了這兩種型別的區域性性。
空間區域性性(spatial locality):是指程式傾向於訪問在最近訪問過的記憶體位址附近的記憶體(由於指令是順序執行的,且有時會按順序處理資料結構)。
正是由於訪問區域性性特徵,使得程式即便僅有部分位址空間存在於ram中,依然可能得以執行。
虛擬記憶體的規劃之一是將每個程式使用的記憶體切割成小型的、固定大小的"頁"(page)單元。
相應的,將ram劃分成一系列與虛擬記憶體尺寸相同的頁幀。
任一時刻,每個程式僅有部分頁需要駐留在物理記憶體頁幀中。
這些也構成了所謂駐留集(resident set)。
程式未使用的頁拷貝儲存在交換區(swap area)內——這是磁碟空間中的保留區域,作為計算機ram的補充——僅在需要時才會載入物理記憶體。
若程序欲訪問的頁面目前並未駐留在物理記憶體中,將會發生頁面錯誤(page fault),核心即刻掛起程序的執行,同時從磁碟中將該頁面載入記憶體。
在不同的系統中頁幀的大小不一樣,一般常見的4096、8192和16384位元組等。
為了支援這一組織方式,核心需要為每個程序維護一張頁表(page table)。
該頁表描述了每頁在程序虛擬位址空間(virtual address space)中的位置(可為程序所用的所有虛擬記憶體頁面的集合)。
頁表中的每個條目要麼指出乙個虛擬頁面在ram中的所在位置,要麼表明其當前駐留在磁碟上。
在程序虛擬位址空間中,並非所有的位址範圍都都需要頁表條目。
通常情況下,由於可能存在大段的虛擬位址空間並未投入使用,故而也無必要為其維護相應的頁表條目。
若程序試圖訪問的位址並無頁表條目與之對應,那麼程序將收到乙個sigse**訊號。
由於核心能夠為程序分配和釋放頁(和頁表條目),所以程序的有效虛擬位址範圍在其生命週期中可以發生變化。
這可能發生於如下場景。
由於棧向下增長超出之前曾達到的位置。
當在堆中分配或釋放記憶體時,通過呼叫brk、sbrk或malloc函式族來提公升program break的位置。
當呼叫shmat連線system v共享記憶體區時,或當呼叫shmdt脫離共享記憶體區時。
當呼叫mmap建立記憶體對映時,或者呼叫munmap解除記憶體對映時。
虛擬記憶體的實現需要硬體中分頁記憶體管理單元(pmmu)的支援。pmmu把要訪問的每個虛擬記憶體位址轉換成相應的物理記憶體位址,當特定虛擬記憶體位址所對應的頁沒有駐留於ram中時,將以頁面錯誤通知核心。
虛擬記憶體管理使程序的虛擬位址空間與rma實體地址空間隔離開來,這帶來許多優點。
unix系統程式設計
popen pclose popen介面定義 include file popen const char command,const char type int pclose file stream popen函式會建立乙個管道,並且建立乙個子程序來執行shell,shell會建立乙個子程序來執行c...
虛擬記憶體管理
定義 虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體 乙個連續完整的位址空間 而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。我的理解 程序例項在使用者態並不直接操作物理記憶體位址,實際物理記憶體是可能是...
作業系統記憶體管理 虛擬記憶體
按照固定大小將程序的位址空間分為多個頁面,每乙個頁面內部都有連續的位址.這些頁被對映到物理記憶體,但是並不是所有的頁都在記憶體中時程式才能執行.當程式需要已經在物理記憶體中的位址空間時,由硬體完成對映 當程式引用不在記憶體中的位址空間時,產生缺頁中斷,由作業系統將頁面調入記憶體.位址的轉化 建立頁表...