介紹
虛擬內(nèi)存是現(xiàn)代所有的操作系統(tǒng)支持的一個(gè)核心功能惨好。雖然內(nèi)存的容量增長快速,但
是軟件的大小增長更快。這一發(fā)展的最終結(jié)果就是需要運(yùn)行的程序會有可能大到內(nèi)存
無法容納忽舟,而且必然需要系統(tǒng)能夠支持多個(gè)程序的同時(shí)運(yùn)行双妨,即使內(nèi)存可以滿足其中
單一程序的需要,總體來看可能仍然會超出內(nèi)存的大小叮阅。早期出現(xiàn)了覆蓋技術(shù)刁品,思想
是把程序分割成許多片段,每個(gè)片段就是一個(gè)覆蓋序列.在程序開始執(zhí)行時(shí),將覆蓋管理
模塊載入內(nèi)存,該覆蓋管理模塊立即裝入并運(yùn)行序列0.執(zhí)行完,序列0就通知覆蓋管理模
塊載入序列1,如果有多余的空間就占用序列0的上方位置,沒有則占用序列0.覆蓋塊存
放在磁盤中,在需要時(shí),由操作系統(tǒng)換入換出.這樣看起來好像沒有太大的問題,因?yàn)槭?br> 由操作系統(tǒng)來進(jìn)行換入換出.但是應(yīng)用程序需要被分割成多個(gè)片段.把一個(gè)大的程序分
割成小的浩姥、模塊化的片段是非常耗時(shí)和枯燥的,并且容易出錯(cuò).而且這個(gè)事要交給程序
員去做,那估計(jì)要崩潰了.沒過多久聰明的人類就找到了解決版本,提出了虛擬內(nèi)存的
概念.虛擬內(nèi)存的基本思想是:每個(gè)程序都擁有自己的地址空間,這個(gè)空間被分成多個(gè)塊,
每個(gè)塊叫做一個(gè)頁或一個(gè)頁面.每一頁有連續(xù)的地址范圍.這些頁被映射到物理內(nèi)存,
但并不是所有的頁必須在內(nèi)存中才能運(yùn)行程序.當(dāng)程序引用到一部分在物理內(nèi)存中
的地址空間時(shí),由硬件立刻執(zhí)行必要的映射.當(dāng)程序引用到一部分不在物理內(nèi)存中的
地址空間時(shí),再由操作系統(tǒng)負(fù)責(zé)將缺失的部分裝入物理內(nèi)存并重新執(zhí)行失敗的命令,
這個(gè)過程叫缺頁中斷處理處理. 虛擬內(nèi)存很適合在多道程序設(shè)計(jì)系統(tǒng)中使用,許多
程序的片段同時(shí)保存在內(nèi)存中. 當(dāng)一個(gè)程序等待它的一部分讀入內(nèi)存時(shí),可以把CPU
交給另一個(gè)程序使用. 這里解釋一下什么是多道程序設(shè)計(jì)系統(tǒng),所謂的多道程序設(shè)
計(jì)系統(tǒng)指的是允許多個(gè)程序同時(shí)進(jìn)入一個(gè)計(jì)算機(jī)系統(tǒng)的主存儲器(即內(nèi)存)并啟動進(jìn)
行計(jì)算的方法.也就是說,計(jì)算機(jī)內(nèi)存中可以同時(shí)存放多個(gè)(兩個(gè)或以上相互獨(dú)立的)
正在運(yùn)行的程序,它們都處于開始和結(jié)束之間.從宏觀上看是并行的,多道程序都處
于運(yùn)行中,并且都沒有運(yùn)行結(jié)束;從微觀上看是串行的,各道程序輪流使用CPU,交替
執(zhí)行.引入多道程序設(shè)計(jì)技術(shù)的根本目的是為了提高CPU的利用率,充分發(fā)揮計(jì)算機(jī)
系統(tǒng)部件的并行性,現(xiàn)代計(jì)算機(jī)系統(tǒng)都采用了多道程序設(shè)計(jì)技術(shù).-
程序在訪問一個(gè)內(nèi)存地址指向的內(nèi)存時(shí),CPU不是直接把這個(gè)地址送到內(nèi)存總線
上,而是被送到一個(gè)叫內(nèi)存管理單元的硬件上(業(yè)界也叫MMU,是Memory Management
Unit的簡稱),然后由這個(gè)硬件把這個(gè)內(nèi)存地址映射到實(shí)際的物理內(nèi)存地址上.程序
操作的這個(gè)地址稱為虛擬內(nèi)存地址.MMU作為CPU芯片的一部分,其實(shí)是單獨(dú)的一個(gè)
芯片.MMU把虛擬內(nèi)存地址映射成物理內(nèi)存地址再送到總線的過程如下圖:
分頁技術(shù)
-
上面提到了虛擬內(nèi)存地址,實(shí)際上程序所訪問的這些內(nèi)存地址,構(gòu)成了一個(gè)虛擬
地址空間,正如上面提到的,虛擬地址空間按照固定的大小被劃分成若干單元,每
個(gè)單元叫做一個(gè)頁或者一個(gè)頁面.同時(shí)實(shí)際的物理內(nèi)存也被劃分成若干單元,但是
物理內(nèi)存對應(yīng)的這個(gè)單元被業(yè)界稱作Page Frame(頁幀或頁框).虛擬內(nèi)存的頁面
和物理內(nèi)存的頁框通常是一樣大的,比如都是4KB或者2MB,實(shí)際的頁面大小可能從
512 byte到1GB.如下圖,按每頁4KB劃分一個(gè)32KB的物理內(nèi)存空間和一個(gè)64KB的虛
擬地址空間,可得到8個(gè)頁框和16個(gè)虛擬頁面.內(nèi)存和磁盤之間的交換總是以整個(gè)
頁面為單元進(jìn)行的.
結(jié)合這兩個(gè)圖,下面簡單的解釋一下:
當(dāng)程序試圖訪問地址0時(shí),如執(zhí)行下面的指令:
MOV REG, 0
這句偽代碼的意思是把地址0的數(shù)據(jù)送入寄存器中,REG是register的簡稱,
表示寄存器.但并不是真實(shí)的寄存器的名字,這里是偽代碼.真實(shí)的寄存器如
AX,BX,CX,SS,SP等.
將虛擬地址0送到MMU,MMU看到虛擬地址0落在(0~4095)這個(gè)頁面上,而這個(gè)頁面
被映射到2(8K~12K)這個(gè)頁框上,所以MMU把地址變成8192,并把地址8192送到總
線上.內(nèi)存對MMU一無所知.它只看到一個(gè)對地址8192的讀或?qū)懻埱蟛?zhí)行它.
同理:
MOV REG, 8192
被轉(zhuǎn)換成
MOV REG, 24576
頁面8192被映射到第6個(gè)頁框上即 1024 x 24 = 24576
上面的圖中因?yàn)橹挥?個(gè)物理頁框的內(nèi)存,所以只有8個(gè)頁面被映射到了物理內(nèi)存
,正如圖上有頁框號的頁面,其他的頁面上都是叉號,表示沒有被映射到物理內(nèi)存
.在實(shí)際的硬件中,是用一個(gè)標(biāo)志位("在/不在")來記錄頁面是否被映射到物理內(nèi)
存.如0表示當(dāng)前頁沒有被映射,1表示被映射.
再如,當(dāng)程序訪問了一個(gè)沒有被映射的頁面:
MOV REG, 24576
MMU注意到該頁面沒有被映射,于是CPU通知操作系統(tǒng),出現(xiàn)了上面提到的缺頁錯(cuò)
誤或缺頁異常.操作系統(tǒng)找到一個(gè)很少使用的頁框,且把它的內(nèi)容寫入磁盤.然
后把需要訪問的這個(gè)頁面的內(nèi)容讀到剛才的頁框里,修改一下映射關(guān)系,然后重
新執(zhí)行剛才的異常指令.這個(gè)過程就叫缺頁中斷處理.