虛擬內存原理

虛擬內存:爲了更加高效並且少出錯,現代操作系統提供了一種對主存的抽象概念,叫做虛擬內存。虛擬內存是硬件異常,硬件地址翻譯,主存,磁盤文件和內核軟件的完美交互,他爲每個進程提供了一個大的,一致和私有的地址空間,虛擬內存提供三個能力:
他將主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,並根據需要在主存和磁盤之間來回傳送數據,通過這種方式高效使用了主存
他爲每個進程提供了一致的地址空間,從而簡化了內存管理
他保護了每個進程的地址空間不被其他進程破壞

物理和虛擬尋址
計算機主存被組織成一個由M個連續的字節大小的單元組成的數組。每字節都有一個唯一的物理地址,每一個字節的地址爲0,接下來的字節地址爲1,在下一個爲2,以此類推,給定這種簡單的結構,CPU訪問內存的最自然的方式就是使用物理地址,我們把這種方式稱爲物理尋址。
現在操作系統都是用虛擬尋址的尋址形式。CPU通過生成一個虛擬地址來訪問內存,這個虛擬地址在送到內存之前會被轉換成適當的物理地址,將虛擬地址轉換成物理地址這一過程成爲地址翻譯。需要硬件系統個操作系統之間的緊密配合,CPU芯片上的叫做內存管理單元的專用硬件,利用存放在主存中的查詢表來動態翻譯虛擬地址,該表的內容由操作系統管理。
地址空間:地址空間是一個由非負整數組成的有序集合。一個地址空間大小是由表示最大地址所需要的位數描述的,例如一個包含N=2^n個地址的虛擬地址空間就叫做一個n位地址空間。現在操作系統通常支持32位或者64位尋地址空間。

地址空間區分了數據對象和他們的屬性,一旦認識到這種區別,我們就可以將其推廣,允許每個數據對象有多個獨立的地址空間,其中每個地址都選自不同的地址空間,這是虛擬內存的基本思想。主存中的每個字節都以一個選自虛擬地址空間和一個選自物理地址空間的物理地址。

虛擬內存作爲緩存的工具:
虛擬內存被組織成一個有存放在磁盤上的N個連續的字節大小的單元組成的數組,每字節都有唯一的虛擬地址,作爲數組的索引,磁盤上的內容被緩存在主存中,和存儲器層次結構中的其他緩存一樣,磁盤上的數據被分割成塊,這些快被分割成磁盤和主存之間的傳輸單元,VM系統通過將虛擬內存分割成稱爲虛擬頁的大小固定的塊來處理這個問題,每個虛擬頁的大小爲P=2^p字節,類似的,物理內存被分割成物理頁,大小爲p字節。被稱爲頁幀。

在任意時刻,虛擬頁面都分爲三個不相交的子集:
未分配的:VM系統還未分配的頁,未分配的塊沒有任何數據和他們相關聯,因此,也就不佔用任何磁盤空間。
緩存的:當前已經緩存在物理內存中的已經分配的頁
爲緩存的:未緩存到物理內存中已分配的頁

DRAM緩存的組織結構:
SRAM爲CPU和主存之間的L1,L2,L3高速緩存
DRAM表示虛擬內存系統的緩存,他在主存中緩存虛擬頁
DRAM要比SRAM慢10倍,而磁盤要比DRAM慢大約100000倍,因此DRAM不命中比起SRAM不命中要昂貴的多。因爲DRAM緩存不命中是由磁盤來服務的。

在習慣說法中,DRAM緩存不命中,我們稱爲缺頁。

一次缺頁的處理過程:
在這裏插入圖片描述
如上圖所示:CPU引用了vp3一個字,vp3並未緩存在內存中(DRAM)中,地址翻譯硬件會從內存中讀取PTE3,從有效位推斷vp3未被緩存,並觸發一個缺頁異常,缺頁異常調用內核中的缺頁異常處理程序,改程序會選擇一個犧牲頁,在此例中就是vp4,如果vp4被修改了,那麼內核就會將其複製回磁盤,無論哪種情況,內核都會修改vp4的頁表條目PTE4,反應vp4不再緩存在主存中這一事實。
接下來,內核從磁盤複製vp3到內存中的原來vp4的位置,更新PTE3,隨後返回,當異常處理程序返回時,他會重新啓動導致缺頁的指令,該指令會將導致缺頁的虛擬地址發送給地址翻譯硬件,現在vp3已經被緩存到主存中了,那麼頁命中也能由地址翻譯硬件處理了。
下面是完成卻也異常處理的示意圖:

在這裏插入圖片描述
在虛擬內存的說法中,塊被稱爲頁,在磁盤和內存之間傳送頁的活動叫做頁面調度。頁從磁盤換入DRAM和從DRAM換出磁盤,一直到最後時刻,也就是當不命中發生時,才換入頁面的這種策略,稱爲按需頁面調度。
調用malloc會使磁盤新的頁面在磁盤上產生。
局部性
儘管在整個運行期間程序引用的不同頁面的總數可能超出物理內存總大小,但是局部性原則保證了在任意時刻,程序趨向在一個較小活動頁面上工作,這個集合叫做工作集,或者常駐集合,在初始開銷,將工作集頁面調度到主存之後,接下來對這個工作集的引用將導致命中,而不會產生額外開銷。只要程序有好的時間局部性,虛擬內存系統就能工作相當好,如果工作集的大小超出了物理內存的大小,程序將產生一種不幸的狀態,叫做抖動,這個時候頁面會被不停的換進與換出。使得程序性能下降。

按需頁面調度和獨立的虛擬地址空間的結合,對系統中內存的使用和管理造成了深遠的影響,VM簡化了連接與加載,代碼和數據共享,以及應用程序的內存分配。

簡化鏈接:獨立的地址空間允許每個進程的內存映像使用相同的基本格式,而不管代碼和數據實際存放在物理內存何處。
簡化加載:虛擬內存還使得容易想內存中加載可執行文件和共享對象文件。
將一組連續的虛擬頁映射到任意一個文件中的任意位置表示法稱爲內存映射。
簡化共享:獨立的地址空間爲操作系統提供了一個管理用戶進程和操作系統的自身之間共享的一致機制。一般而言,每個進程都有自己私有的代碼、數據、堆以及棧區,是不和其他進程共享的,在這種情況下,操作系統創建頁表,將相應的虛擬頁映射到不連續的物理頁面。
在一些情況下,還是需要進程來共享數據和代碼,比如每個進程必須調用相同的操作系統內核代碼,而每個C程序都會調用C標準庫中的程序,操作系統通過將不同進程中適當的頁面映射到相同的物理頁面,從而安排多個進程共享這部分代碼的副本,而不是每個進程單獨擁有內核或者C標準庫。
簡化內存分配:虛擬內存爲用戶提供了簡化內存分配的機制,當一個運行在用戶進程中的程序要求分配額外的堆空間的話,操作系統分配相應適當的數字個連續個虛擬內存頁面,並且將它們映射到物理內存中任意位置的k個任意的物理頁面,由於頁表的工作方式,沒必要分配連續的物理頁面,而是隨機分散在物理內存中。

虛擬內存作爲內存保護的工具:
現代計算機系統必須爲操作系統提供手段來控制對內存系統的訪問,不應該允許一個進程修改他的只讀代碼段,而且也不用改允許他讀或者修改任何內核中的代碼或者數據結構。不應該允許他度或者寫其他進程的私有內存,並且不允許他修改與其他進程共享的虛擬頁面,除非共享者都顯式的允許他這麼做。
每次CPU生成一個地址時,地址翻譯硬件都會讀一個PTE,所以通過在PTE上添加一些額外的許可位來控制對一個虛擬頁面的訪問十分簡單。

在這裏插入圖片描述

用虛擬內存提供頁面級的內存保護

當用戶進程訪問一些頁面越過權限時,就會觸發內核異常處理程序,報告段錯誤,並強制退出程序。

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