操作系統—物理內存與虛擬內存

概念解析
     物理內存,在應用中,自然是顧名思義,物理上,真實的插在板子上的內存是多大就是多大了。而在CPU中的概念,物理內存就是CPU的地址線可以直接進行尋址的內存空間大小。比如8086只有20根地址線,那麼它的尋址空間就是1MB,我們就說8086能支持1MB的物理內存,及時我們安裝了128M的內存條在板子上,我們也只能說8086擁有1MB的物理內存空間。同理我們現在大部分使用的是32位的機子,32位的386以上CPU就可以支持最大4GB的物理內存空間了。

      正在運行的一個進程,他所需的內存是有可能大於內存條容量之和的,比如你的內存條是256M,你的程序卻要創建一個2G的數據區,那麼不是所有數據都能一起加載到內存(物理內存)中,勢必有一部分數據要放到其他介質中(比如硬盤),待進程需要訪問那部分數據時,在通過調度進入物理內存。所以,虛擬內存是進程運行時所有內存空間的總和,並且可能有一部分不在物理內存中,而物理內存就是我們平時所瞭解的內存條。有的地方呢,也叫這個虛擬內存爲內存交換區。

早期沒有虛擬內存的時候出現的問題:

1.現在有多個程序需要運行,但是內存空間不足了,就需要將其他程序暫時拷貝到硬盤當中,然後將新的程序裝入內存運行.由於大量的數據裝入裝出,內存的使用效率會十分Low。

2.由於程序都是直接訪問物理內存的,所以一個進程可以修改其他進程的內存數據,甚至修改內核地址空間中的數據。

3.因爲內存地址是隨機分配的,所以程序運行的地址也是不正確的

Linux下虛擬內存的結構圖:


以32位機爲例,我們上圖看到的進程虛擬存儲器佔用3G虛擬內存空間,內核虛擬存儲器佔用1G的虛擬內存空間

什麼是虛擬內存地址和物理內存地址呢

假設你的計算機是32位,那麼它的地址總線是32位的,也就是它可以尋址0~0xFFFFFFFF(4G)的地址空間,但如果你的計算機只有256M的物理內存0x~0x0FFFFFFF(256M),同時你的進程產生了一個不在這256M地址空間中的地址,那麼計算機該如何處理呢?

回答這個問題前,先說明計算機的內存分頁機制。計算機會對虛擬內存地址空間(32位爲4G)分頁產生頁(page),對物理內存地址空間(假設256M)分頁產生頁幀(page frame),這個頁和頁幀的大小是一樣大的,所以呢,在這裏,虛擬內存頁的個數勢必要大於物理內存頁幀的個數。在計算機上有一個頁表(page table),就是映射虛擬內存頁到物理內存頁的,更確切的說是頁號到頁幀號的映射,而且是一對一的映射。但是問題來了,虛擬內存頁的個數 > 物理內存頁幀的個數,豈不是有些虛擬內存頁的地址永遠沒有對應的物理內存地址空間?不是的,操作系統是這樣處理的。操作系統有個頁面失效(page fault)功能。操作系統找到一個最少使用的頁幀,讓他失效,並把它寫入磁盤,隨後把需要訪問的頁放到頁幀中,並修改頁表中的映射,這樣就保證所有的頁都有被調度的可能了。這就是處理虛擬內存地址到物理內存的步驟。

虛擬內存地址由頁號和偏移量組成。頁號對應的映射到一個頁幀。那麼,說說偏移量。偏移量就是我上面說的頁(或者頁幀)的大小,即這個頁(或者頁幀)到底能存多少數據。舉個例子,有一個虛擬地址它的頁號是4,偏移量是20,那麼他的尋址過程是這樣的:首先到頁表中找到頁號4對應的頁幀號(比如爲8),如果頁不在內存中,則用失效機制調入頁,否則把頁幀號和偏移量傳給MMU(CPU的內存管理單元)組成一個物理上真正存在的地址,接着就是訪問物理內存中的數據了。總結起來說,虛擬內存地址的大小是與地址總線位數相關,物理內存地址的大小跟物理內存條的容量相關。



發佈了78 篇原創文章 · 獲贊 34 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章