虛擬內(nèi)存技術(shù)的來(lái)龍去脈
1、虛擬內(nèi)存簡(jiǎn)介
每個(gè)現(xiàn)代計(jì)算機(jī)系統(tǒng)都配有高速可隨機(jī)訪(fǎng)問(wèn)存儲(chǔ)器,稱(chēng)為主存儲(chǔ)器、物理內(nèi)存或者直接稱(chēng)為內(nèi)存。內(nèi)存是用于存放代碼和數(shù)據(jù)的硬件,它是處理器能直接尋址的存儲(chǔ)空間,內(nèi)存由半導(dǎo)體器件制成,特點(diǎn)是存取速率快。
程序被執(zhí)行前需要先將程序放到內(nèi)存中才能被CPU處理,我們平常使用的程序,如:操作系統(tǒng)、辦公軟件、游戲軟件等,通常是安裝在硬盤(pán)等外存上,軟件需要運(yùn)行時(shí),必須把它們調(diào)入內(nèi)存中運(yùn)行,才能真正被執(zhí)行。
內(nèi)存的承載實(shí)體通常是隨機(jī)存取存儲(chǔ)器(RAM),CPU可以直接與RAM交換數(shù)據(jù)。RAM在工作狀態(tài)下,可以隨時(shí)從任何一個(gè)指定的地址寫(xiě)入(存入)或讀出(取出)信息。
高效的內(nèi)存管理系統(tǒng)是操作系統(tǒng)的重要功能之一,現(xiàn)代操作系統(tǒng)提供了一種內(nèi)存管理技術(shù):虛擬內(nèi)存。虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)最重要的概念之一,它幾乎涉及計(jì)算機(jī)系統(tǒng)的所有層面,在硬件層面,編譯器層面,文件層面,進(jìn)程層面扮演重要角色。
虛擬內(nèi)存是操作系統(tǒng)配合硬件實(shí)現(xiàn),它是隱藏自動(dòng)地工作著,不需要程序員進(jìn)行任何干涉。虛擬內(nèi)存給予應(yīng)用程序強(qiáng)大的能力,應(yīng)用程序可以創(chuàng)建和銷(xiāo)毀內(nèi)存片,應(yīng)用程序可以將內(nèi)存片映射到磁盤(pán)文件中,應(yīng)用程序可以與其它進(jìn)程共享內(nèi)存。
2、物理尋址和虛擬尋址
(1)物理尋址
計(jì)算機(jī)系統(tǒng)的內(nèi)存被組織成一個(gè)N個(gè)連續(xù)字節(jié)單元組成的數(shù)組,每個(gè)字節(jié)有且僅有一個(gè)唯一的物理地址(PA)。第一個(gè)字節(jié)的物理地址為0,接下來(lái)的一個(gè)字節(jié)的物理地址為1,再下一個(gè)字節(jié)的物理地址為2,依此類(lèi)推。CPU訪(fǎng)問(wèn)內(nèi)存最自然的方式時(shí)使用物理地址,這種訪(fǎng)問(wèn)方式稱(chēng)為物理尋址。
早期的PC使用物理尋址,目前數(shù)字信號(hào)處理器,嵌入式微控制器(單片機(jī))任然繼續(xù)使用這種尋址方式。下圖展示了一個(gè)物理尋址的示例:
上圖示例了一條加載指令,它讀取物理地址4處開(kāi)始的4字節(jié)。當(dāng)處理器執(zhí)行這條加載指令時(shí),處理器會(huì)生成一個(gè)物理地址4,內(nèi)存總線(xiàn)將物理地址4傳遞到內(nèi)存的地址端口,內(nèi)存取出物理地址4處的連續(xù)4個(gè)字節(jié)數(shù)據(jù)輸出到內(nèi)存數(shù)據(jù)總線(xiàn)上,傳遞給處理器,處理器會(huì)將這4字節(jié)數(shù)據(jù)存放在寄存器中。
(2)虛擬尋址
物理尋址最直接,效率高,但是這種尋址方式明顯缺點(diǎn):不支持運(yùn)行比物理內(nèi)容量大的應(yīng)用程序;不支持編寫(xiě)與機(jī)器無(wú)關(guān)的代碼,代碼需要和物理內(nèi)存配置有對(duì)應(yīng)關(guān)系?,F(xiàn)代計(jì)算機(jī)系統(tǒng)使用的是一種稱(chēng)為虛擬尋址的尋址方式。
虛擬尋址的尋址過(guò)程是:CPU通常生成一個(gè)虛擬地址(VA)來(lái)訪(fǎng)問(wèn)主存,這個(gè)虛擬地址被加載到內(nèi)存之前,需要先轉(zhuǎn)換成物理地址(PA),最終CPU間接的訪(fǎng)問(wèn)了內(nèi)存的這個(gè)物理地址(PA)。將虛擬地址轉(zhuǎn)換成物理地址的過(guò)程叫做地址翻譯。CPU芯片內(nèi)部有一個(gè)叫做內(nèi)存管理單元(MMU)的專(zhuān)用硬件,內(nèi)存管理單元利用查詢(xún)表來(lái)動(dòng)態(tài)完成地址翻譯。
下圖展示了一個(gè)物理尋址的示例:
上圖示例了一條加載指令,它讀取虛擬地址88處開(kāi)始的4個(gè)字節(jié)。當(dāng)處理器執(zhí)行這條加載指令時(shí),處理器會(huì)生成一個(gè)虛擬地址88給MMU,MMU查表得到虛擬地址88對(duì)應(yīng)的物理地址4,內(nèi)存總線(xiàn)將物理地址4傳遞到內(nèi)存的地址端口,內(nèi)存取出物理地址4處的連續(xù)4個(gè)字節(jié)數(shù)據(jù)輸出到內(nèi)存數(shù)據(jù)總線(xiàn)上,傳遞給處理器,處理器會(huì)將這4字節(jié)數(shù)據(jù)存放在寄存器中。
3、內(nèi)存管理技術(shù)發(fā)展
(1)人工操作
最早期的計(jì)算機(jī)并沒(méi)有操作系統(tǒng),而是采用人工操作方式處理任務(wù)。程序員將用機(jī)器語(yǔ)言編寫(xiě)好的程序和數(shù)據(jù)。通過(guò)穿孔的方式保存在紙帶上,然后將穿孔紙帶裝入到機(jī)器的輸入機(jī),隨后通過(guò)控制臺(tái)開(kāi)關(guān)啟動(dòng)程序。計(jì)算器完成計(jì)算后,通過(guò)打印機(jī)輸出計(jì)算結(jié)果。操作員取走結(jié)果并卸下紙帶后,才能開(kāi)始操作下一個(gè)程序(紙袋)。
紙袋識(shí)別原理:采集器是一組探針和一組對(duì)應(yīng)的探針座, 紙帶經(jīng)過(guò)探針組,有孔的地方探針會(huì)接觸導(dǎo)通,而沒(méi)孔的地方則不會(huì)導(dǎo)通,勻速拖動(dòng)紙帶這樣計(jì)算機(jī)就能夠識(shí)別紙帶編碼,進(jìn)而進(jìn)行計(jì)算。
?探針有兩種類(lèi)型:信號(hào)探針和同步探針。信號(hào)探針讀取的是程序代碼和數(shù)據(jù),同步探針就是產(chǎn)生同步信號(hào),同步信號(hào)的作用就和現(xiàn)代計(jì)算機(jī)中時(shí)鐘信號(hào),每一個(gè)同步信號(hào)都會(huì)觸發(fā)計(jì)算機(jī)執(zhí)行一條指令。
人工操作方式的缺點(diǎn)非常明顯:
1、計(jì)算機(jī)的高速與手工操作的低速之間矛盾巨大,人機(jī)速度極不協(xié)調(diào),資源浪費(fèi)嚴(yán)重。
2、一個(gè)程序獨(dú)占全機(jī),導(dǎo)致資源的利用率低。
特點(diǎn):最早期的電子計(jì)算機(jī)并沒(méi)有操作系統(tǒng),沒(méi)有內(nèi)存,也沒(méi)有內(nèi)存管理,人工操作。
(2)單道批處理機(jī)制
20世紀(jì)50年代后期,為了克服手工操作的慢速度和計(jì)算機(jī)的高速度之間的矛盾,出現(xiàn)了單道批處理系統(tǒng),即在計(jì)算機(jī)上加載一個(gè)系統(tǒng)軟件,在系統(tǒng)軟件的控制下計(jì)算機(jī)能夠自動(dòng)地、成批地處理一個(gè)或多個(gè)用戶(hù)的作業(yè)。
單道批處理系統(tǒng)的目的是減少作業(yè)間轉(zhuǎn)換時(shí)的人工操作,從而減少CPU的等待時(shí)間。批處理就是將作業(yè)按照它們的性質(zhì)分組(或分批),然后再一個(gè)接一個(gè)地提交給計(jì)算機(jī)系統(tǒng),由計(jì)算機(jī)自動(dòng)完成后再輸出結(jié)果,從而減少作業(yè)建立和結(jié)束過(guò)程中的時(shí)間浪費(fèi)。這種工作模式就像是工廠里面的流水線(xiàn)一樣。
?單道批處理系統(tǒng)的特征是內(nèi)存中只允許存放一個(gè)作業(yè),即當(dāng)前正在運(yùn)行的作業(yè)才能駐留內(nèi)存,作業(yè)的執(zhí)行順序是先進(jìn)先出,即按順序執(zhí)行。這種模型下用戶(hù)進(jìn)程總是加載到同一個(gè)固定內(nèi)存地址上運(yùn)行,用戶(hù)進(jìn)程使用的地址就是物理地址。
這種系統(tǒng)有兩個(gè)致命的缺點(diǎn):1、系統(tǒng)只能運(yùn)行比物理內(nèi)存容量小的應(yīng)用程序,不支持運(yùn)行比物理內(nèi)存容量大的應(yīng)用程序。
2、系統(tǒng)只能運(yùn)行一個(gè)應(yīng)用程序,不支持運(yùn)行多個(gè)應(yīng)用程序。
接下來(lái)的計(jì)算機(jī)歷史,就是計(jì)算機(jī)先驅(qū)們一步一步克服這兩個(gè)問(wèn)題的歷史。本節(jié)我們來(lái)看看計(jì)算機(jī)先驅(qū)們是怎樣征服這兩個(gè)BOOS的。
(3)多道批處理機(jī)制
由于在單道批處理系統(tǒng)中,一個(gè)作業(yè)單獨(dú)進(jìn)入內(nèi)存并獨(dú)占系統(tǒng)資源,直到運(yùn)行結(jié)束后下一個(gè)作業(yè)才能進(jìn)入內(nèi)存,當(dāng)作業(yè)進(jìn)行I/O操作時(shí),CPU只能處于等待狀態(tài),因此CPU利用率較低。
直到20世紀(jì)60年代中期,多道程序設(shè)計(jì)技術(shù)出現(xiàn),正式進(jìn)入多道批處理系統(tǒng)階段。 1964年,IBM生產(chǎn)了第一臺(tái)小規(guī)模集成電路計(jì)算機(jī)IBM 360,為該機(jī)開(kāi)發(fā)的OS/360 操作系統(tǒng)是第一個(gè)能夠運(yùn)行多道程序的批處理系統(tǒng)。
多道程序設(shè)計(jì)技術(shù)可同時(shí)把多個(gè)程序放入內(nèi)存,并允許它們交替在CPU中運(yùn)行,共享系統(tǒng)中的各種硬、軟件資源。當(dāng)一道程序因I/O(輸入/輸出)請(qǐng)求而暫停運(yùn)行時(shí),CPU便立即轉(zhuǎn)去運(yùn)行另一道程序。多道批處理不是多個(gè)程序同時(shí)運(yùn)行,而是多個(gè)程序在內(nèi)存中準(zhǔn)備運(yùn)行,只有當(dāng)正在運(yùn)行的的那道程序因?yàn)槟撤N原因(比如,等待輸出或輸出數(shù)據(jù))而暫時(shí)無(wú)法繼續(xù)運(yùn)行的時(shí)候,系統(tǒng)將自動(dòng)地啟動(dòng)另一道程序運(yùn)行。
即在內(nèi)存中可同時(shí)存在若干道作業(yè),作業(yè)執(zhí)行的次序與進(jìn)入內(nèi)存的次序無(wú)嚴(yán)格的對(duì)應(yīng)關(guān)系,因?yàn)檫@些作業(yè)是通過(guò)一定的作業(yè)調(diào)度算法來(lái)使用CPU的。一個(gè)作業(yè)在等待I/O處理時(shí),CPU調(diào)度另外一個(gè)作業(yè)運(yùn)行,因此CPU的利用率顯著地提高了。
由于多道程序能交替使用CPU,提高了CPU及其他系統(tǒng)資源的利用率,同時(shí)也提高了系統(tǒng)的效率。多道批處理系統(tǒng)的缺點(diǎn)是延長(zhǎng)了作業(yè)的周轉(zhuǎn)時(shí)間,用戶(hù)不能進(jìn)行直接干預(yù),缺少交互性,不利于程序的開(kāi)發(fā)與調(diào)試。
多道批處理系統(tǒng)的優(yōu)點(diǎn)也很明顯:系統(tǒng)內(nèi)可同時(shí)容納多個(gè)作業(yè)。這些作業(yè)放在外存中,組成一個(gè)后備隊(duì)列,系統(tǒng)按一定的調(diào)度原則每次從后備作業(yè)隊(duì)列中選取一個(gè)或多個(gè)作業(yè)進(jìn)入內(nèi)存運(yùn)行,運(yùn)行作業(yè)結(jié)束、退出運(yùn)行和后備作業(yè)進(jìn)入運(yùn)行均由系統(tǒng)自動(dòng)實(shí)現(xiàn),從而在系統(tǒng)中形成一個(gè)自動(dòng)轉(zhuǎn)接的、連續(xù)的作業(yè)流。
多道批處理系統(tǒng)的缺點(diǎn)也很明顯:在系統(tǒng)運(yùn)行過(guò)程中,不允許用戶(hù)與其作業(yè)發(fā)生交互作用,即作業(yè)一旦進(jìn)入系統(tǒng),用戶(hù)就不能直接干預(yù)其作業(yè)的運(yùn)行。
(4)覆蓋機(jī)制
多道批處理系統(tǒng)解決了運(yùn)行多個(gè)應(yīng)用程序的問(wèn)題,但是系統(tǒng)仍然不支持運(yùn)行比物理內(nèi)容量大的應(yīng)用程序,這種限制產(chǎn)生了一種覆蓋機(jī)制。覆蓋機(jī)制通過(guò)覆蓋應(yīng)用程序不再需要的地址空間,來(lái)達(dá)到重用內(nèi)存的目的。例如,一旦系統(tǒng)加載完成并開(kāi)始運(yùn)行,系統(tǒng)初始化的代碼內(nèi)存就可以回收給程序使用,這種軟件覆蓋機(jī)制需要應(yīng)用程序開(kāi)發(fā)人員做額外的編程操作。覆蓋技術(shù)釋放了無(wú)用代碼空間,讓可用的內(nèi)存空間變大。
覆蓋技術(shù)通俗的講就是將程序分為多個(gè)段,經(jīng)常會(huì)被執(zhí)行的段就放在固定區(qū),調(diào)入后除非運(yùn)行結(jié)束,否則是不會(huì)被調(diào)出的。而不常用則放在覆蓋區(qū),只有要用到的時(shí)候才能載入內(nèi)存,否則就會(huì)被調(diào)出被其它程序覆蓋。
如下圖所示,假如我們有一個(gè)程序A,8k的main經(jīng)常會(huì)被執(zhí)行,那么內(nèi)存就會(huì)為其分配一個(gè)8k的固定區(qū)。而對(duì)于B、C這兩個(gè)指揮被A段偶爾調(diào)用的地方,內(nèi)存就會(huì)取這兩個(gè)段的最大值也就是10k的空間作為這兩段的覆蓋區(qū)。DEF同理??梢钥闯龈采w技術(shù)僅用30k的內(nèi)存空間,解決了52k的程序加載到內(nèi)存的問(wèn)題。
(5)交換機(jī)制
內(nèi)存同時(shí)容納少數(shù)幾個(gè)進(jìn)程,每個(gè)進(jìn)程被加載到一個(gè)連續(xù)的物理內(nèi)存中,系統(tǒng)為內(nèi)存中的這些進(jìn)程提供分時(shí)服務(wù)。如果要運(yùn)行其它進(jìn)程,系統(tǒng)就需要選擇內(nèi)存中的一個(gè)進(jìn)程交換出去,系統(tǒng)會(huì)把選中的進(jìn)程復(fù)制到磁盤(pán)上的特定交換分區(qū)中。然后將需要運(yùn)行的其它程序加載到內(nèi)存中運(yùn)行。
交換一個(gè)進(jìn)程時(shí),操作系統(tǒng)會(huì)保證交換的內(nèi)存大小,保存進(jìn)程時(shí),不僅僅是保存進(jìn)程的數(shù)據(jù),同時(shí)還會(huì)保存處理器的運(yùn)行狀態(tài),當(dāng)被保存進(jìn)程得到恢復(fù)時(shí),進(jìn)程將會(huì)從被暫停的位置繼續(xù)執(zhí)行。
交換機(jī)制,使得物理內(nèi)存容量“變大”,系統(tǒng)可使用的內(nèi)存就可以遠(yuǎn)遠(yuǎn)大于物理內(nèi)存的容量。
內(nèi)存變得更大更強(qiáng)。
(6)按需分頁(yè)機(jī)制
按需分頁(yè)機(jī)制需要由操作系統(tǒng)和分頁(yè)硬件共同完成。在按需分頁(yè)系統(tǒng)里,物理內(nèi)存和進(jìn)程的地址空間都被劃分成固定大小的頁(yè),數(shù)據(jù)以頁(yè)為單位加載和釋放出內(nèi)存。物理內(nèi)存中的頁(yè)通常稱(chēng)為頁(yè)框或者物理頁(yè)。
在任意時(shí)刻內(nèi)存中可以活動(dòng)多個(gè)進(jìn)程,但是每個(gè)進(jìn)程可能只有部分頁(yè)在物理內(nèi)存中,進(jìn)程的地址是虛擬的,虛擬的地址包含頁(yè)號(hào)和頁(yè)內(nèi)偏移。在操作系統(tǒng)和硬件的配合下,程序的虛擬地址被轉(zhuǎn)換成物理地址,并訪(fǎng)問(wèn)對(duì)應(yīng)的物理內(nèi)存。在按需分頁(yè)機(jī)制中,所有頁(yè)都是在需要的時(shí)候才加載到內(nèi)存中。
(7)虛擬內(nèi)存機(jī)制
內(nèi)存虛擬技術(shù)并非單一的新技術(shù),而是結(jié)合多種技術(shù)形成的技術(shù)。內(nèi)存虛擬使用的虛擬地址技術(shù),分頁(yè)機(jī)制,交換機(jī)制。
虛擬內(nèi)存機(jī)制是一種綜合的內(nèi)存管理技術(shù)。
4、虛擬內(nèi)存解決問(wèn)題
虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)最重要的部分之一,虛擬內(nèi)存可以實(shí)現(xiàn)以下功能:
1、運(yùn)行比物理內(nèi)存容量大的程序。如64位計(jì)算機(jī)系統(tǒng)有256T的虛擬內(nèi)存,理論上可以運(yùn)行約256T大小的程序,而當(dāng)今主流的64位計(jì)算機(jī)的物理內(nèi)存大小約4G。因此使用虛擬內(nèi)存理想情況下可以運(yùn)行任意大小的程序。
2、程序運(yùn)行時(shí)只需要加載部分。因?yàn)樘摂M內(nèi)存使用了分頁(yè)機(jī)制,程序被分割成了多段,降低了程序啟動(dòng)時(shí)間,降低了物理內(nèi)存使用率。
3、支持多個(gè)程序同時(shí)在內(nèi)存中運(yùn)行。每個(gè)程序只有部分段在物理內(nèi)存中,使得物理內(nèi)存能同時(shí)容納多個(gè)程序。
4、支持代碼與機(jī)器無(wú)關(guān),代碼和物理內(nèi)存不需要有對(duì)應(yīng)關(guān)系。
5、支持重定位的程序,重定位程序可以存儲(chǔ)在內(nèi)存中的任何位置,并且位置可以在執(zhí)行時(shí)改變。
6、支持內(nèi)存共享。
7、不需要應(yīng)用程序的程序員直接參與物理內(nèi)存的分配和管理
5、虛擬內(nèi)存模型
虛擬內(nèi)存是硬件異常,硬件地址翻譯器,主存,磁盤(pán),內(nèi)核軟件共同協(xié)作實(shí)現(xiàn)。