以前我一直以為程序運行時隻有物理内存(RAM),自從看了虛拟内存,才發現我想太簡單了。
一、概念
我們平常寫的程序,大多數都有兩種訪問局部性特征,即空間局部性和時間局部性;
空間局部性是指程序傾向訪問最近訪問過的内存附近的内存,這是由于指令是順序執行的;時間即部性是指程序傾向于在不久的将來再次訪問剛訪問過的内存,這是由于循環。
正是由于訪問局部性特征,使程序即便僅有部分(地址空間)存在于RAM中,依然可能得以執行,由此為了更加有效地管理内存,現代系統提供了一種對主存的抽象概念,稱為虛拟内存。虛拟内存是硬件異常、硬件地址翻譯、主存、磁盤文件和内核軟件的完美交互,它為每個進程提供了一個大的、一緻的、私有的地址空間。
主存被組織成一個由M個連續的字節大小的單元組成的數組。每個單元都有一個唯一的物理地址。CPU訪問内存的最自然的方式就是使用物理地址——物理尋址;與之相對應就是使用虛拟地址訪問,稱為虛拟尋址。物理尋址和虛拟尋址系統如下圖所示:
虛拟内存的規劃之一是将每個程序使用的内存分成小的、固定大小的頁單元。相應的,RAM(物理内存或主存)也劃分成一系列與虛存頁尺寸相同的頁(頁幀)。任一時刻,每個程序僅有部分頁需要駐留在物理内存頁中,這些頁構成了所謂駐留集(resident set)。程序未使用的頁拷貝保存在交換區(swap area)内,交換區是保留在磁盤空間中,作為RAM的補充,僅在需要時才會載入RAM中。若進程欲訪問的頁面并未駐留在RAM中,将會發生頁面錯誤,這時内核會挂起進程的執行,同時從磁盤中将該頁面載入内存。在磁盤和内存之間傳送頁的活動叫做交換或者頁面調度。
為了支持這個機制,内核需要為每個進程維護一張頁表,頁表描述了每個虛拟頁面是緩存在RAM中,還是駐留在磁盤中。如下所示:
虛拟内存概覽
二、特性
1、由于使用虛拟内存導緻每個進程使用的RAM減少了,所以RAM可以同時容納更多進程,就間接導緻CPU的利用率被提高了。
2、由于内核能夠為進程分配與釋放頁,所以進程的有效虛拟地址在進程生命周期中可以發生變化。
3、由于虛拟内存的管理,所以會把進程的虛拟地址控間與RAM物理地址空間隔離開來。
4、由于可能存在大段的虛拟地址空間并未使用,因此不是所有虛拟地址空間都有相應的頁表條目。若進程試圖訪問的地址并無頁表條目與之對應,将收到一個SIGSEGV信号;
三、實踐
可以在linux終端上輸入cat /proc/pid/status即可以看到相應進程狀态 (pid為相應進程号);其中以Vm開頭是關于虛拟内存的參數,比如VmSize是虛拟内存大小,VmRSS是進程駐留集(物理内存)大小;VmSwap是進程交換區大小;
四、總結
本文對虛拟内存隻是起個抛磚引玉,如果有什麼不對地方,請大家多多包涵,歡迎指出,如果覺得有用,歡迎點個贊。
文中圖片來自互聯網,如果有侵權,可以留言删除。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!