虛擬內(nèi)存的三大作用


CSAPP的閱讀筆記。

在系統(tǒng)中所有的進(jìn)程之間是共享CPU和主存這些內(nèi)存資源的。當(dāng)進(jìn)程數(shù)量變多時(shí),所需要的內(nèi)存資源就會(huì)相應(yīng)的增加。可能會(huì)導(dǎo)致部分程序沒有主存空間可用。此外,由于資源是共享的,那么就有可能導(dǎo)致某個(gè)進(jìn)程不小心寫了另一個(gè)進(jìn)程所使用的內(nèi)存,進(jìn)而導(dǎo)致程序運(yùn)行不符合正常邏輯。

為了更加有效的管理內(nèi)存并少出錯(cuò),現(xiàn)代系統(tǒng)提供了一種對主存的抽象的概念,叫做虛擬內(nèi)存(VM)。

`虛擬內(nèi)存`是硬件異常、硬件地址翻譯、主存、磁盤文件和內(nèi)核軟件間的完美交互,他為每個(gè)進(jìn)程提供了一個(gè)大的、一致的和私有的地址空間。

虛擬內(nèi)存提供了三個(gè)重要的能力: 緩存,內(nèi)存管理,內(nèi)存保護(hù)

1. 將主存視為一個(gè)存儲(chǔ)在磁盤上的地址空間的高速緩存,在主存中只保存活動(dòng)區(qū)域,并根據(jù)需要在磁盤和主存之間來回傳送數(shù)據(jù)

2. 為每個(gè)進(jìn)程提供了一致的地址空間,簡化內(nèi)存管理

3. 保護(hù)了每個(gè)進(jìn)程的地址空間不被其他進(jìn)程破壞


1.虛擬內(nèi)存作為緩存的工具

概念上,虛擬內(nèi)存被組織為一個(gè)由存放在磁盤上的N個(gè)連續(xù)字節(jié)大小的單元組成的數(shù)組。每字節(jié)都有一個(gè)唯一的虛擬地址,作為數(shù)組的索引。磁盤上的內(nèi)容被緩存在主存中。

VM系統(tǒng)將虛擬內(nèi)存分割為大小固定的塊,稱為虛擬頁(VP),來作為磁盤和主存之間的傳輸單元。每個(gè)虛擬頁的大小為P=2^p字節(jié)。類似地,物理內(nèi)存也被分割為物理頁(PP)(也稱為頁幀),大小也是P字節(jié)。

虛擬頁面分為三個(gè)互斥子集:

1. 未分配的:VM系統(tǒng)還未分配(或創(chuàng)建的)頁。未分配的塊沒有任何數(shù)據(jù)和它們相關(guān)聯(lián),因此也就不占用任何磁盤空間。

2. 緩存的:當(dāng)前已緩存在物理內(nèi)存中的已分配的頁。

3. 未緩存的:未緩存在物理內(nèi)存中的已分配的頁。

一個(gè)VM系統(tǒng)是如何使用主存作為緩存的

如上圖:有8個(gè)虛擬頁。虛擬頁0和3未分配,因此在磁盤上還不存在。虛擬頁1、4和6被緩存在物理內(nèi)存中。頁2、5和7已經(jīng)被分配了,但是當(dāng)前并未緩存在主存中。

1.1頁表

虛擬內(nèi)存必須知道一個(gè)虛擬頁是否放在物理頁中,如果在物理頁中,也需知道與之關(guān)聯(lián)的物理頁的具體物理地址。如果不在物理頁中,需要選擇一個(gè)犧牲頁,要將該虛擬頁從磁盤復(fù)制到DRAM中,并將被替換的犧牲頁保存到磁盤中。

這些功能是由軟硬件聯(lián)合提供的。VM系統(tǒng)要實(shí)現(xiàn)上面的功能需要操作系統(tǒng)軟件、MMU(內(nèi)存管理單元)中的地址翻譯硬件和一個(gè)存放在物理內(nèi)存中叫`頁表`的數(shù)據(jù)結(jié)構(gòu)幫助。頁表就是記錄了虛擬頁和物理頁映射關(guān)系的一種數(shù)據(jù)結(jié)構(gòu)。每次地址翻譯硬件將一個(gè)虛擬地址轉(zhuǎn)換為物理地址時(shí),都需要讀取頁表。操作系統(tǒng)負(fù)責(zé)維護(hù)頁表的內(nèi)容,以及在磁盤與DRAM之間來回傳送頁。

頁表

上圖展示了一個(gè)頁表的基本組織結(jié)構(gòu)。虛擬地址空間中的每個(gè)頁在頁表中一個(gè)固定偏移量處都有一個(gè)頁表?xiàng)l目(PTE)。假設(shè)一個(gè)PTE由一個(gè)有效位和一個(gè)n位地址字段組成的。有效位表示該虛擬頁當(dāng)前是否緩存在主存(DRAM)中。如果設(shè)置了有效位,那么一個(gè)空地址表示這個(gè)虛擬頁還未被分配。否則,這個(gè)地址就指向該虛擬頁在磁盤上的起始位置。

圖中展示了8個(gè)虛擬頁和4個(gè)物理頁。四個(gè)虛擬頁(VP1、VP2、VP7和VP4)當(dāng)前被緩存在DRAM中。兩個(gè)頁(VP0、VP5)還未被分配,而剩下的頁(VP3和VP6)已經(jīng)被分配了,但還未被緩存在DRAM中。

1.2頁命中

頁命中是指,該虛擬頁面是緩存的。

如圖,VP2被緩存在DRAM中。當(dāng)CPU想要讀取包含在VP2中的虛擬頁的一個(gè)字時(shí),地址翻譯硬件將虛擬地址作為索引并根據(jù)頁表中的PTE2來定位其物理地址,之后通過內(nèi)存總線讀取它。系統(tǒng)通過PTE2中標(biāo)志位判定VP2是已經(jīng)緩存在DRAM中。

VM頁命中

1.3缺頁

習(xí)慣上,DRAM中緩存不命中稱為缺頁。

VM缺頁(之前)。對VP3中的字的引用會(huì)不命中,從而觸發(fā)缺頁

上圖展示了在缺頁之前的頁表狀態(tài)的一個(gè)示例。CPU引用了VP3的一個(gè)字,VP3并未被緩存在DRAM中。地址翻譯硬件從內(nèi)存中讀取PTE3,從有效位推斷出VP3未被緩存,進(jìn)而觸發(fā)了一個(gè)缺頁異常

缺頁異常調(diào)用內(nèi)核中的缺頁異常處理程序,該程序會(huì)選擇一個(gè)犧牲頁,圖例中就是存放在PP3中的VP4。如果VP4已經(jīng)被修改了,那么內(nèi)核就會(huì)將它復(fù)制回磁盤。無論如何,內(nèi)核都會(huì)修改VP4的頁表?xiàng)l目PTE4,反映出VP4不在緩存在主存中這一事實(shí)。

VM缺頁(之后)。缺頁處理程序選擇VP4作為犧牲頁,并從磁盤上用VP3的副本取代它。在缺頁處理程序重新啟動(dòng)導(dǎo)致缺頁的指令后,該指令將從內(nèi)存中正常地讀取字,而不會(huì)再產(chǎn)生異常

然后,內(nèi)核會(huì)從磁盤復(fù)制VP3到內(nèi)存中的PP3,更新PP3,隨后返回。當(dāng)異常處理程序返回時(shí),它會(huì)重新啟動(dòng)導(dǎo)致缺頁的指令,該指令會(huì)把導(dǎo)致缺頁的虛擬地址重發(fā)送到地址翻譯硬件。但是現(xiàn)在,VP3已經(jīng)緩存在主存中了,頁命中也能由地址翻譯硬件正常處理。

2.虛擬內(nèi)存作為內(nèi)存管理的工具

操作系統(tǒng)為每個(gè)進(jìn)程提供一個(gè)獨(dú)立的`頁表`,因而也就是獨(dú)立的虛擬地址空間。

VM為每個(gè)進(jìn)程提供獨(dú)立的地址空間。操作系統(tǒng)為系統(tǒng)中的每個(gè)進(jìn)程都維護(hù)一個(gè)獨(dú)立的頁表

如上圖所示,進(jìn)程i的頁表將VP1映射到PP2,VP2映射到PP7。相似的,進(jìn)程j將VP1映射到PP7,VP2映射到PP10.注意,多個(gè)虛擬頁面可以映射到同一個(gè)`共享的物理頁面`上。

按需頁面調(diào)度和獨(dú)立的虛擬地址空間的結(jié)合,對系統(tǒng)內(nèi)存的使用和管理造成了深遠(yuǎn)的影響。VM簡化了加載和鏈接、代碼和數(shù)據(jù)的共享,以及應(yīng)用程序的內(nèi)存分配。

2.1簡化鏈接

獨(dú)立地址空間允許每個(gè)進(jìn)程的內(nèi)存映像使用相同的基本格式。例如在64位x86-64平臺(tái)上,代碼段總是從虛擬地址0x400000開始。數(shù)據(jù)段跟在代碼段后,中間夾雜著對齊空白。棧占據(jù)用戶進(jìn)程地址空間的最高部分,并向下增長。這樣的一致性極大地簡化了鏈接器的設(shè)計(jì)和實(shí)現(xiàn),運(yùn)行鏈接器生成完全連接的可執(zhí)行文件,這些可執(zhí)行文件是獨(dú)立于物理內(nèi)存中代碼和數(shù)據(jù)的最終位置的。

進(jìn)程地址空間

2.2簡化加載

把目標(biāo)文件(可執(zhí)行文件和共享對象文件)中的.text和.data節(jié)加載到一個(gè)新創(chuàng)建的進(jìn)程中,Linux加載器為代碼和數(shù)據(jù)段分配虛擬頁,把他們標(biāo)記為無效的(即未被緩存的),將頁表?xiàng)l目指向目標(biāo)文件中適當(dāng)?shù)奈恢谩H欢?,加載器從不從磁盤復(fù)制任何數(shù)據(jù)到內(nèi)存中,而在每個(gè)頁被初次引用時(shí),或CPU取指令時(shí),或一條正在執(zhí)行的指令引用一個(gè)內(nèi)存位置時(shí),虛擬內(nèi)存系統(tǒng)會(huì)按需自動(dòng)調(diào)入數(shù)據(jù)頁。

2.3簡化共享

一般情況下,每個(gè)進(jìn)程都有自己私有的代碼、數(shù)據(jù)、堆、以及棧區(qū)域,是不和其他進(jìn)程共享的。在這種情況下,操作系統(tǒng)創(chuàng)建頁表,將相應(yīng)的虛擬頁映射到不連續(xù)的物理頁面。

獨(dú)立地址空間為操作系統(tǒng)提供了一個(gè)管理用戶進(jìn)程和操作系統(tǒng)自身之間共享的一致機(jī)制。

在部分情況下,進(jìn)程間還是需要共享代碼和數(shù)據(jù)的,例如每個(gè)C程序都會(huì)調(diào)用C標(biāo)準(zhǔn)庫中的程序(printf)、都需要調(diào)用相同的內(nèi)核代碼。操作系統(tǒng)通過將不同進(jìn)程中適當(dāng)?shù)奶摂M頁面映射到相同的物理頁面,從而安排多個(gè)進(jìn)程共享這部分代碼的一個(gè)副本,而不是在每個(gè)進(jìn)程中都包括單獨(dú)的內(nèi)核和C標(biāo)準(zhǔn)庫的副本。

2.4簡化內(nèi)存分配

當(dāng)運(yùn)行在用戶進(jìn)程的程序要求額外的堆空間時(shí)(如調(diào)用malloc),操作系統(tǒng)分配k個(gè)連續(xù)的虛擬內(nèi)存頁面,并且將它們映射到物理內(nèi)存中任意位置的k個(gè)任意的物理頁面。由于頁表的存在,操作系統(tǒng)沒必要分配k個(gè)連續(xù)的物理頁面,頁面可隨機(jī)地分散在物理內(nèi)存中。

3.虛擬內(nèi)存作為內(nèi)存保護(hù)的工具

操作系統(tǒng)會(huì)控制進(jìn)程對內(nèi)存系統(tǒng)的訪問,例如:

1. 不允許一個(gè)用戶進(jìn)程修改它的只讀代碼段;

2. 不允許用戶進(jìn)程讀或修改任何內(nèi)核中的代碼和數(shù)據(jù)結(jié)構(gòu);

3. 不允許用戶進(jìn)程讀或?qū)懫渌M(jìn)程的私有內(nèi)存;

4. 不允許用戶進(jìn)程修改任何其他進(jìn)程共享的虛擬頁表

而提供獨(dú)立的地址空間是的區(qū)分不同進(jìn)程的私有內(nèi)存變得容易。但是,地址翻譯機(jī)制可以從一種自然的方式擴(kuò)展到提供更好的訪問控制。CPU每次生成一個(gè)地址時(shí),地址翻譯硬件都會(huì)讀一個(gè)PTE。所以通過在PTE上添加額外的許可位來控制對一個(gè)虛擬頁面內(nèi)容的訪問十分簡單。

用虛擬內(nèi)存來提供頁面級(jí)的內(nèi)存保護(hù)

上圖中,在每個(gè)PTE中添加了三個(gè)許可位。SUP位表示進(jìn)程是否必須運(yùn)行在內(nèi)核模式下才能訪問該頁。運(yùn)行在內(nèi)核模式下的進(jìn)程可以訪問任何頁面,但運(yùn)行在用戶模式中的進(jìn)程只允許訪問那些SUP為0的頁面。READWRITE位控制對頁面的讀和寫訪問。例如,如果進(jìn)程i運(yùn)行在用戶模式下,那么它有讀VP0和讀寫VP1的權(quán)限。然而,不允許訪問VP2。

如果一條指令違反了這些許可條件,那么CPU就會(huì)觸發(fā)一個(gè)一般保護(hù)故障,將控制傳遞給一個(gè)內(nèi)核中的異常處理程序。Liunx中一般將這種異常報(bào)告為段錯(cuò)誤(segmentation fault)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 現(xiàn)代操作系統(tǒng)了提供了一種對主存的抽象概念,叫做虛擬內(nèi)存。它為每個(gè)進(jìn)程提供了一個(gè)非常大的,一致的和私有的地址空...
    要上班的斌哥閱讀 16,611評論 2 55
  • CPU Cache 今天的CPU比25年前更復(fù)雜。那時(shí)候,CPU內(nèi)核的頻率與內(nèi)存總線的頻率相當(dāng)。內(nèi)存訪問只比寄存器...
    blueshadow閱讀 3,218評論 0 5
  • 1. 基礎(chǔ)知識(shí) 1.1、 基本概念、 功能 馮諾伊曼體系結(jié)構(gòu)1、計(jì)算機(jī)處理的數(shù)據(jù)和指令一律用二進(jìn)制數(shù)表示2、順序執(zhí)...
    yunpiao閱讀 5,801評論 1 22
  • 操作系統(tǒng)對內(nèi)存的管理 沒有內(nèi)存抽象的年代 在早些的操作系統(tǒng)中,并沒有引入內(nèi)存抽象的概念。程序直接訪問和操作的都是物...
    Mr槑閱讀 16,970評論 3 24
  • 本文轉(zhuǎn)載自 https://juejin.im/post/59f8691b51882534af254317 參考:...
    xingdong閱讀 2,892評論 0 3

友情鏈接更多精彩內(nèi)容