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