虛擬內存和物理內存的聯繫和區別

操作系統有虛擬內存與物理內存的概念。在很久以前,還沒有虛擬內存概念的時候,程序尋址用的都是物理地址。程序能尋址的範圍是有限的,這取決於CPU的地址線條數。比如在32位平臺下,尋址的範圍是2^32也就是4G。並且這是固定的,如果沒有虛擬內存,且每次開啓一個進程都給4G的物理內存,就可能會出現很多問題:

因爲我的物理內存時有限的,當有多個進程要執行的時候,都要給4G內存,很顯然你內存小一點,這很快就分配完了,於是沒有得到分配資源的進程就只能等待。當一個進程執行完了以後,再將等待的進程裝入內存。這種頻繁的裝入內存的操作是很沒效率的
由於指令都是直接訪問物理內存的,那麼我這個進程就可以修改其他進程的數據,甚至會修改內核地址空間的數據,這是我們不想看到的
因爲內存時隨機分配的,所以程序運行的地址也是不正確的。
於是針對上面會出現的各種問題,虛擬內存就出來了。

在之前一篇文章中進程分配資源介紹過一個進程運行時都會得到4G的虛擬內存。這個虛擬內存你可以認爲,每個進程都認爲自己擁有4G的空間,這只是每個進程認爲的,但是實際上,在虛擬內存對應的物理內存上,可能只對應的一點點的物理內存,實際用了多少內存,就會對應多少物理內存。

進程得到的這4G虛擬內存是一個連續的地址空間(這也只是進程認爲),而實際上,它通常是被分隔成多個物理內存碎片,還有一部分存儲在外部磁盤存儲器上,在需要時進行數據交換。

進程開始要訪問一個地址,它可能會經歷下面的過程

每次我要訪問地址空間上的某一個地址,都需要把地址翻譯爲實際物理內存地址
所有進程共享這整一塊物理內存,每個進程只把自己目前需要的虛擬地址空間映射到物理內存上
進程需要知道哪些地址空間上的數據在物理內存上,哪些不在(可能這部分存儲在磁盤上),還有在物理內存上的哪裏,這就需要通過頁表來記錄
頁表的每一個表項分兩部分,第一部分記錄此頁是否在物理內存上,第二部分記錄物理內存頁的地址(如果在的話)
當進程訪問某個虛擬地址的時候,就會先去看頁表,如果發現對應的數據不在物理內存上,就會發生缺頁異常
缺頁異常的處理過程,操作系統立即阻塞該進程,並將硬盤裏對應的頁換入內存,然後使該進程就緒,如果內存已經滿了,沒有空地方了,那就找一個頁覆蓋,至於具體覆蓋的哪個頁,就需要看操作系統的頁面置換算法是怎麼設計的了。
 

關於虛擬內存與物理內存的聯繫,下面這張圖可以幫助我們鞏固。

頁表的工作原理如下圖


我們的cpu想訪問虛擬地址所在的虛擬頁(VP3),根據頁表,找出頁表中第三條的值.判斷有效位。 如果有效位爲1,DRMA緩存命中,根據物理頁號,找到物理頁當中的內容,返回。
若有效位爲0,參數缺頁異常,調用內核缺頁異常處理程序。內核通過頁面置換算法選擇一個頁面作爲被覆蓋的頁面,將該頁的內容刷新到磁盤空間當中。然後把VP3映射的磁盤文件緩存到該物理頁上面。然後頁表中第三條,有效位變成1,第二部分存儲上了可以對應物理內存頁的地址的內容。
缺頁異常處理完畢後,返回中斷前的指令,重新執行,此時緩存命中,執行1。
將找到的內容映射到告訴緩存當中,CPU從告訴緩存中獲取該值,結束。

再來總結一下虛擬內存是怎麼工作的
當每個進程創建的時候,內核會爲進程分配4G的虛擬內存,當進程還沒有開始運行時,這只是一個內存佈局。實際上並不立即就把虛擬內存對應位置的程序數據和代碼(比如.text .data段)拷貝到物理內存中,只是建立好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射)。這個時候數據和代碼還是在磁盤上的。當運行到對應的程序時,進程去尋找頁表,發現頁表中地址沒有存放在物理內存上,而是在磁盤上,於是發生缺頁異常,於是將磁盤上的數據拷貝到物理內存中。

另外在進程運行過程中,要通過malloc來動態分配內存時,也只是分配了虛擬內存,即爲這塊虛擬內存對應的頁表項做相應設置,當進程真正訪問到此數據時,才引發缺頁異常。

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

 

利用虛擬內存機制的優點 
既然每個進程的內存空間都是一致而且固定的(32位平臺下都是4G),所以鏈接器在鏈接可執行文件時,可以設定內存地址,而不用去管這些數據最終實際內存地址,這交給內核來完成映射關係
當不同的進程使用同一段代碼時,比如庫文件的代碼,在物理內存中可以只存儲一份這樣的代碼,不同進程只要將自己的虛擬內存映射過去就好了,這樣可以節省物理內存
在程序需要分配連續空間的時候,只需要在虛擬內存分配連續空間,而不需要物理內存時連續的,實際上,往往物理內存都是斷斷續續的內存碎片。這樣就可以有效地利用我們的物理內存
--------------------- 
原文:https://blog.csdn.net/lvyibin890/article/details/82217193 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章