以前我一直以為程序運行時只有物理內(nèi)存(RAM),,自從看了虛擬內(nèi)存,才發(fā)現(xiàn)我想太簡單了,。 一,、概念 我們平常寫的程序,大多數(shù)都有兩種訪問局部性特征,,即空間局部性和時間局部性,; 空間局部性是指程序傾向訪問最近訪問過的內(nèi)存附近的內(nèi)存,,這是由于指令是順序執(zhí)行的;時間即部性是指程序傾向于在不久的將來再次訪問剛訪問過的內(nèi)存,,這是由于循環(huán),。 正是由于訪問局部性特征,使程序即便僅有部分(地址空間)存在于RAM中,,依然可能得以執(zhí)行,,由此為了更加有效地管理內(nèi)存,現(xiàn)代系統(tǒng)提供了一種對主存的抽象概念,,稱為虛擬內(nèi)存,。虛擬內(nèi)存是硬件異常、硬件地址翻譯,、主存,、磁盤文件和內(nèi)核軟件的完美交互,它為每個進程提供了一個大的,、一致的,、私有的地址空間。 主存被組織成一個由M個連續(xù)的字節(jié)大小的單元組成的數(shù)組,。每個單元都有一個唯一的物理地址,。CPU訪問內(nèi)存的最自然的方式就是使用物理地址——物理尋址;與之相對應(yīng)就是使用虛擬地址訪問,,稱為虛擬尋址,。物理尋址和虛擬尋址系統(tǒng)如下圖所示: 虛擬內(nèi)存的規(guī)劃之一是將每個程序使用的內(nèi)存分成小的、固定大小的頁單元,。相應(yīng)的,,RAM(物理內(nèi)存或主存)也劃分成一系列與虛存頁尺寸相同的頁(頁幀)。任一時刻,,每個程序僅有部分頁需要駐留在物理內(nèi)存頁中,,這些頁構(gòu)成了所謂駐留集(resident set)。程序未使用的頁拷貝保存在交換區(qū)(swap area)內(nèi),,交換區(qū)是保留在磁盤空間中,,作為RAM的補充,僅在需要時才會載入RAM中,。若進程欲訪問的頁面并未駐留在RAM中,,將會發(fā)生頁面錯誤,這時內(nèi)核會掛起進程的執(zhí)行,,同時從磁盤中將該頁面載入內(nèi)存,。在磁盤和內(nèi)存之間傳送頁的活動叫做交換或者頁面調(diào)度。 為了支持這個機制,,內(nèi)核需要為每個進程維護一張頁表,,頁表描述了每個虛擬頁面是緩存在RAM中,,還是駐留在磁盤中。如下所示: 虛擬內(nèi)存概覽 二,、特性 1,、由于使用虛擬內(nèi)存導(dǎo)致每個進程使用的RAM減少了,所以RAM可以同時容納更多進程,,就間接導(dǎo)致CPU的利用率被提高了,。 2、由于內(nèi)核能夠為進程分配與釋放頁,,所以進程的有效虛擬地址在進程生命周期中可以發(fā)生變化,。 3、由于虛擬內(nèi)存的管理,,所以會把進程的虛擬地址控間與RAM物理地址空間隔離開來,。 4、由于可能存在大段的虛擬地址空間并未使用,,因此不是所有虛擬地址空間都有相應(yīng)的頁表條目,。若進程試圖訪問的地址并無頁表條目與之對應(yīng),將收到一個SIGSEGV信號,; 三,、實踐 可以在linux終端上輸入cat /proc/pid/status即可以看到相應(yīng)進程狀態(tài) (pid為相應(yīng)進程號);其中以Vm開頭是關(guān)于虛擬內(nèi)存的參數(shù),,比如VmSize是虛擬內(nèi)存大小,,VmRSS是進程駐留集(物理內(nèi)存)大小,;VmSwap是進程交換區(qū)大?。?/p> 四,、總結(jié) 本文對虛擬內(nèi)存只是起個拋磚引玉,如果有什么不對地方,,請大家多多包涵,,歡迎指出,如果覺得有用,,歡迎點個贊,。 |
|