虛擬記憶體和物理記憶體

2021-10-05 17:32:48 字數 3201 閱讀 9031

程序的位址空間

作業系統有虛擬記憶體與物理記憶體的概念。在還沒有虛擬記憶體概念的時候,程式定址用的都是實體地址。程式能定址的範圍是有限的,這取決於cpu的位址線條數。比如在32位平台下,定址的範圍是2^32(即4g)並且這是固定的,如果沒有虛擬記憶體,且每次開啟乙個程序都給4g的物理記憶體,就可能會出現很多問題:

針對上面會出現的各種問題,有了虛擬記憶體。

乙個程序執行時會得到4g的虛擬記憶體。每個程序都認為自己擁有4g的空間,這只是每個程序認為的,但是實際上,在虛擬記憶體對應的物理記憶體上,可能只對應的一點點的物理記憶體,實際用了多少記憶體,就會對應多少物理記憶體。

程序得到的這4g虛擬記憶體是乙個連續的位址空間(這也只是程序認為),而實際上,它通常是被分隔成多個物理記憶體碎片,還有一部分儲存在外部磁碟儲存器上,在需要時進行資料交換

程序開始要訪問乙個位址,它可能會經歷下面的過程

每次要訪問位址空間上的某乙個位址,都需要把位址翻譯為實際物理記憶體位址

所有程序共享這整一塊物理記憶體,每個程序只把自己目前需要的虛擬位址空間對映到物理記憶體上

程序需要知道哪些位址空間上的資料在物理記憶體上,哪些不在(可能這部分儲存在磁碟上),還有在物理記憶體上的**,這就需要通過頁表來記錄

頁表的每乙個表項分兩部分,第一部分記錄此頁是否在物理記憶體上,第二部分記錄物理記憶體頁的位址(如果在的話)

當程序訪問某個虛擬位址的時候,就會先去看頁表,如果發現對應的資料不在物理記憶體上,就會發生缺頁異常

缺頁異常的處理過程,作業系統立即阻塞該程序,並將硬碟裡對應的頁換入記憶體,然後使該程序就緒,如果記憶體已經滿了,沒有空地方了,那就找乙個頁覆蓋,至於具體覆蓋的哪個頁,就需要看作業系統的頁面置換演算法是怎麼設計的了

計算機會對虛擬記憶體位址空間(32位為4g)分頁產生頁(page),對物理記憶體位址空間(假設256m)分頁產生頁幀(page frame),這個頁和頁幀的大小是一樣大的,所以虛擬記憶體頁的個數勢必要大於物理記憶體頁幀的個數。在計算機上有乙個頁表(page table),就是對映虛擬記憶體頁到物理記憶體頁的,更確切的說是頁號到頁幀號的對映,而且是一對一的對映。但是,虛擬記憶體頁的個數 > 物理記憶體頁幀的個數,豈不是有些虛擬記憶體頁的位址永遠沒有對應的物理記憶體位址空間?作業系統有個頁面失效(page fault)功能。作業系統找到乙個最少使用的頁幀,讓它失效,並把它寫入磁碟,隨後把需要訪問的頁放到頁幀中,並修改頁表中的對映,這樣就保證所有的頁都有被排程的可能了。這就是處理虛擬記憶體位址到物理記憶體的步驟。

虛擬記憶體和物理記憶體的匹配是通過頁表實現,頁表存在mmu(記憶體管理單元)中,頁表中每個項通常為32位,既4byte,除了儲存虛擬位址和頁框位址之外,還會儲存一些標誌位,比如是否缺頁,是否修改過,寫保護等。可以把mmu想象成乙個接收虛擬位址項返回實體地址的方法。因為頁表中每個條目是4位元組,現在的32位作業系統虛擬位址空間會是2的32次方,即使每頁分為4k,也需要2的20次方*4位元組=4m的空間,為每個程序建立乙個4m的頁表並不明智。因此在頁表的概念上進行推廣,產生二級頁表,二級頁表每個對應4m的虛擬位址,而一級頁表去索引這些二級頁表,因此32位的系統需要1024個二級頁表,雖然頁表條目沒有減少,但記憶體中可以僅僅存放需要使用的二級頁表和一級頁表,大大減少了記憶體的使用。

頁表的工作原理如下圖

cpu想訪問虛擬位址所在的虛擬頁(vp3),根據頁表,找出頁表中第三條的值。判斷有效位。 如果有效位為1,drma快取命中,根據物理頁號,找到物理頁當中的內容,返回

若有效位為0,引數缺頁異常,呼叫核心缺頁異常處理程式。核心通過頁面置換演算法選擇乙個頁面作為被覆蓋的頁面,將該頁的內容重新整理到磁碟空間當中。然後把vp3對映的磁碟檔案快取到該物理頁上面。然後頁表中第三條,有效位變成1,第二部分儲存上了可以對應物理記憶體頁的位址的內容

缺頁異常處理完畢後,返回中斷前的指令,重新執行,此時快取命中,執行1

將找到的內容對映到告訴快取當中,cpu從告訴快取中獲取該值,結束

虛擬記憶體位址由頁號(與頁表中的頁號關聯)和偏移量組成。頁號對應的對映到乙個頁幀。偏移量就是頁(或者頁幀)的大小,即這個頁(或者頁幀)到底能存多少資料。舉個例子,有乙個虛擬位址它的頁號是4,偏移量是20,那麼它的定址過程是這樣的:首先到頁表中找到頁號4對應的頁幀號(比如為8),如果頁不在記憶體中,則用失效機制調入頁,否則把頁幀號和偏移量傳給mmu(cpu的記憶體管理單元)組成乙個物理上真正存在的位址,接著就是訪問物理記憶體中的資料了。總結起來說,虛擬記憶體位址的大小是與位址匯流排位數相關,物理記憶體位址的大小跟物理記憶體條的容量相關。

當每個程序建立的時候,核心會為程序分配4g的虛擬記憶體,當程序還沒有開始執行時,這只是乙個記憶體布局。實際上並不立即就把虛擬記憶體對應位置的程式資料和**(比如.text .data段)拷貝到物理記憶體中,只是建立好虛擬記憶體和磁碟檔案之間的對映就好(叫做儲存器對映)。這個時候資料和**還是在磁碟上的。當執行到對應的程式時,程序去尋找頁表,發現頁表中位址沒有存放在物理記憶體上,而是在磁碟上,於是發生缺頁異常,於是將磁碟上的資料拷貝到物理記憶體中。

另外在程序執行過程中,要通過malloc來動態分配記憶體時,也只是分配了虛擬記憶體,即為這塊虛擬記憶體對應的頁表項做相應設定,當進**正訪問到此資料時,才引發缺頁異常。

可以認為虛擬空間都被對映到了磁碟空間中(事實上也是按需要對映到磁碟空間上,通過mmap,mmap是用來建立虛擬空間和磁碟空間的對映關係的)。

快取

將主存看做乙個儲存在磁碟空間上的位址空間的快取記憶體,在主存中只儲存活動區域,並根據需要在磁碟和主存之間來回傳送資料。

記憶體管理

為每個程序提供了一致的位址空間,簡化記憶體管理。在程式編譯的時候就會生成虛擬位址,對於不同的機器或者對於同一臺機器的不同時間,該虛擬位址可以對應不同的物理頁。試想,如果沒有虛擬位址,那麼編譯時產生的實體地址在某些機器上可能已經被占用而不能訪問。從而導致程式需要重新編譯。

記憶體保護

保護了每個程序的位址空間不被其他程序破壞。

每個程序被分配乙個4g的位址空間(稱為虛擬位址空間),程序中的程式使用的位址就是這個位址空間的位址(稱為虛擬位址),而實際進行的記憶體讀寫使用的是記憶體條的實體地址,在程式進行記憶體讀寫時,由記憶體管理單元mmu將虛擬位址對映到實體地址進行讀寫。使用者程式不能直接使用實體地址空間,作業系統為每個程序建立了乙個位址空間,稱為虛擬位址空間,對應的位址是虛擬位址。然後mmu將虛擬位址替換成了實體地址,然後將這個位址傳送到記憶體。

物理記憶體和虛擬記憶體

1.物理記憶體和虛擬記憶體 直接從物理記憶體讀取資料比從硬碟讀寫資料要快得多,因此,我們希望所有的資料的讀寫在記憶體中完成,但是記憶體是有限的,這樣就引出了物理記憶體與虛擬記憶體的概念。物理記憶體是系統硬體提供的記憶體大小,是真正的記憶體。虛擬記憶體是為了滿足物理記憶體不足而提出的策略,利用磁碟空間...

虛擬記憶體和物理記憶體

虛擬記憶體 物理記憶體 物理記憶體,在應用中,物理上,真實的插在板子上的記憶體是多大就是多大了。而在cpu中的概念,物理記憶體就是cpu的位址線可以直接進行定址的記憶體空間大小。比如8086只有20根位址線,那麼它的定址空間就是1mb,我們就說8086能支援1mb的物理記憶體,及時我們安裝了128m...

物理記憶體和虛擬記憶體

1 概念 物理記憶體 真實的硬體裝置 記憶體條 虛擬記憶體 利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間 swap space 為了滿足物理記憶體的不足而提出的策略 2.使用的順序 linux會在物理記憶體不足時,使用交換分割槽的虛擬記憶體。核心會將暫時不用的記憶體塊資...