Unix系統程式設計()虛擬記憶體管理

2021-09-08 13:58:56 字數 1534 閱讀 6449

在之前學到過程序的記憶體布局中忽略了乙個事實:這一布局存在於虛擬檔案中。

因為對虛擬記憶體的理解將有助於後續對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...

虛擬記憶體管理

定義 虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體 乙個連續完整的位址空間 而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。我的理解 程序例項在使用者態並不直接操作物理記憶體位址,實際物理記憶體是可能是...

作業系統記憶體管理 虛擬記憶體

按照固定大小將程序的位址空間分為多個頁面,每乙個頁面內部都有連續的位址.這些頁被對映到物理記憶體,但是並不是所有的頁都在記憶體中時程式才能執行.當程式需要已經在物理記憶體中的位址空間時,由硬體完成對映 當程式引用不在記憶體中的位址空間時,產生缺頁中斷,由作業系統將頁面調入記憶體.位址的轉化 建立頁表...