所謂虛�存儲(chǔ)�(Virtual Memory),就是采用一定的方法將一定的外存容量模擬��(nèi)�,同�(shí)�(duì)程序�(jìn)出內(nèi)存的方式�(jìn)行管�,從而得到一�(gè)比實(shí)際內(nèi)存容量大得多的內(nèi)存空�,使得程序的�(yùn)行不受內(nèi)存大小的限制�虛擬存儲(chǔ)區(qū)的容量與物理主存大小�(wú)�(guān),而受限于�(jì)算機(jī)的地址�(jié)�(gòu)和可用磁盤容��
虛擬存儲(chǔ)器是由硬件和操作系統(tǒng)自動(dòng)�(shí)�(xiàn)存儲(chǔ)信息�(diào)度和管理�。它的工作過(guò)程包�6�(gè)步驟�
?、僦醒胩幚砥髟L問主存的邏輯地址分解成組�(hào)a和組�(nèi)地址b,并�(duì)組號(hào)a�(jìn)行地址變換,即將邏輯組�(hào)a作為索引,查地址變換�,以確定該組信息是否存放在主存內(nèi)�
?、谌缭摻M�(hào)已在主存�(nèi),則�(zhuǎn)而執(zhí)行④;如果該組�(hào)不在主存�(nèi),則檢查主存中是否有空閑區(qū),如果沒�,便將某�(gè)暫時(shí)不用的組�(diào)出送往輔存,以便將這組信息�(diào)入主存�
?、蹚妮o存讀出所要的�,并送到主存空閑區(qū),然后將那�(gè)空閑的物理組�(hào)a和邏輯組�(hào)a登錄在地址變換表中�
?、軓牡刂纷儞Q表讀出與邏輯組號(hào)a�(duì)�(yīng)的物理組�(hào)a�
?、輳奈锢斫M�(hào)a和組�(nèi)字節(jié)地址b得到物理地址�
⑥根�(jù)物理地址從主存中存取必要的信��
�(diào)度方式有分頁(yè)式、段�、段�(yè)�3種� 1、頁(yè)式調(diào)� �(yè)式調(diào)度是將邏輯和物理地址空間都分成固定大小的�(yè)。主存按�(yè)順序編號(hào),而每�(gè)�(dú)立編址的程序空間有自己的頁(yè)�(hào)順序,通過(guò)�(diào)度輔存中程序的各�(yè)可以離散裝入主存中不同的�(yè)面位置,并可�(jù)表一一�(duì)�(yīng)檢索。頁(yè)式調(diào)度的�(yōu)�(diǎn)是頁(yè)�(nèi)零頭小,�(yè)表對(duì)程序員來(lái)�(shuō)是透明�,地址變換快,�(diào)入操作簡(jiǎn)�;缺�(diǎn)是各�(yè)不是程序的獨(dú)立模塊,不便于實(shí)�(xiàn)程序和數(shù)�(jù)的保�(hù)� 2、段式調(diào)� 段式�(diào)度是按程序的邏輯�(jié)�(gòu)劃分地址空間,段的長(zhǎng)度是隨意�,并且允許伸�(zhǎng),它的優(yōu)�(diǎn)是消除了�(nèi)存零頭,易于�(shí)�(xiàn)存儲(chǔ)保護(hù),便于程序動(dòng)�(tài)裝配;缺�(diǎn)是調(diào)入操作復(fù)雜� 3、段�(yè)式調(diào)� 將這兩種方法結(jié)合起�(lái)便構(gòu)成段�(yè)式調(diào)度。在段頁(yè)式調(diào)度中把物理空間分成頁(yè),程序按模塊分段,每�(gè)段再分成與物理空間頁(yè)同樣小的�(yè)�。段�(yè)式調(diào)度綜合了段式和頁(yè)式的�(yōu)�(diǎn)。其缺點(diǎn)是增加了硬件成本,軟件也較復(fù)�。大型通用�(jì)算機(jī)系統(tǒng)多數(shù)采用段頁(yè)式調(diào)度�
虛擬存儲(chǔ)器和主存Cache 存儲(chǔ)器是兩�(gè)不同存儲(chǔ)層次的存�(chǔ)體系。在概念上兩者有不少相同之處:但由主� - 輔存組成的虛擬存�(chǔ)器和主存Cache 存儲(chǔ)器亦有很多不同之處:
●Cache 存儲(chǔ)器采用與CPU速度匹配的快速存�(chǔ)元件彌補(bǔ)了主存和CPU之間的速度差距,而虛擬存�(chǔ)器雖然限度地減少了慢速輔存對(duì)CPU的影�,但它的主要功能是用�(lái)彌補(bǔ)主存和輔存之間的容量差距,具有提供大容量和程序編址方便的優(yōu)�(diǎn)�
●兩�(gè)存儲(chǔ)體系均以信息塊作為存�(chǔ)層次之間基本信息的傳送單�,Cache存儲(chǔ)器每次傳送的信息塊是定長(zhǎng)�,只有幾十字節(jié),而虛擬存�(chǔ)器信息塊劃分方案很多,有�(yè)、段等等,長(zhǎng)度均在幾百~幾百K 字節(jié)左右�
●CPU訪問快速Cache存儲(chǔ)器的速度比訪問慢速主存快5 ~ 10�。虛擬存�(chǔ)器中主存的速度要比輔存縮短100 ~ 1000 倍以��
●主存Cache 存儲(chǔ)體系中CPU與Cache和主存都建立了直接訪問的通道。一旦不命中�(shí),CPU 就直接訪問主存并同時(shí)向Cache�(diào)度信息塊,從而減少了CPU等待的時(shí)�。而輔助存�(chǔ)器與CPU之間沒有直接通路,一旦在主存不命中時(shí),只能從輔存�(diào)塊到主存。因?yàn)檩o存的速度相對(duì)CPU的差距太�,調(diào)度需要毫秒級(jí)�(shí)間,因此,CPU一般改換執(zhí)行另一�(gè)程序,等到調(diào)度完成后才返回原程序繼續(xù)工作�
●Cache 存儲(chǔ)器存取信息的�(guò)程、地址變換和替換策略全部用硬件�(shí)�(xiàn),對(duì)程序員均是透明�。而主�- 輔存層次的虛擬存�(chǔ)器基本上是由操作系統(tǒng)的存�(chǔ)管理軟件并輔助一些硬件來(lái)�(jìn)行信息塊的劃分和主存 - 輔存之間的調(diào)�,所以對(duì)�(shè)�(jì)存儲(chǔ)管理軟件的系�(tǒng)程序員來(lái)�(shuō),它是不透明�,而對(duì)廣大用戶,因?yàn)樘摂M存儲(chǔ)路提供了龐大的邏輯空間可以任意使用,所以對(duì)�(yīng)用程序員是透明��
虛擬存儲(chǔ)器地址變換基本上有3種形虛擬存儲(chǔ)器工作過(guò)程式:全�(lián)想變�、直接變換和組聯(lián)想變�。任何邏輯空間頁(yè)面能夠變換到物理空間任何�(yè)面位置的方式稱為全聯(lián)想變�。每�(gè)邏輯空間�(yè)面只能變換到物理空間一�(gè)特定�(yè)面的方式稱為直接變換。組�(lián)想變換是指各組之間是直接變換,而組�(nèi)各頁(yè)間則是全�(lián)想變�。替換規(guī)則用�(lái)確定替換主存中哪一部分,以便騰空部分主�,存放來(lái)自輔存要�(diào)入的那部分內(nèi)容。常見的替換算法�4��
?、匐S�(jī)算法:用軟件或硬件隨�(jī)�(shù)�(chǎn)生器確定替換的頁(yè)��
?、谙冗M(jìn)先出:先�(diào)入主存的�(yè)面先替換�
③近期最少使用算法:替換最�(zhǎng)�(shí)間不用的�(yè)��
?、芩惴ǎ禾鎿Q最�(zhǎng)�(shí)間以后才使用的頁(yè)�。這是理想化的算法,只能作為衡量其他各種算法優(yōu)劣的�(biāo)�(zhǔn)�
虛擬存儲(chǔ)器的效率是系�(tǒng)性能�(píng)�(jià)的重要內(nèi)�,它與主存容�、頁(yè)面大�、命中率,程序局部性和替換算法等因素有�(guān)�
一、頁(yè)式虛擬存�(chǔ)�
在頁(yè)式虛擬存�(chǔ)系統(tǒng)中,將程序按�(tǒng)一的大小劃分成多�(gè)�(yè),同�(shí)也將虛擬存儲(chǔ)器劃分為同樣大小的頁(yè),其中虛擬空間的�(yè)稱為虛頁(yè)(邏輯頁(yè)�,而主存空間的�(yè)稱為�(shí)�(yè)(物理頁(yè)),并對(duì)這些�(yè)按地址從低到高的順序編�(hào)�
在編程時(shí),程序的虛地址由高位字段的虛頁(yè)�(hào)和低位字段的�(yè)�(nèi)地址兩部分組成,虛頁(yè)�(hào)�(biāo)�(shí)�(yè)。虛地址到實(shí)地址之間的變換是由頁(yè)表來(lái)�(shí)�(xiàn)的。頁(yè)表是一張存放在主存中的虛頁(yè)�(hào)和實(shí)�(yè)�(hào)的對(duì)照表,記錄著程序的虛�(yè)�(diào)入主存時(shí)被安排在主存中的位置。若�(jì)算機(jī)采用多道程序工作方式,則可為每�(gè)用戶作業(yè)建立一�(gè)�(yè)�,硬件中�(shè)置一�(gè)�(yè)表基址寄存�,存放當(dāng)前所�(yùn)行程序的�(yè)表的起始地址�
�(yè)表中的每一行記錄了與某�(gè)虛頁(yè)�(duì)�(yīng)的若干信息,包括虛頁(yè)�(hào)、裝入位和實(shí)�(yè)�(hào)等。頁(yè)表基址寄存器和虛頁(yè)�(hào)拼接成頁(yè)表索引地址。根�(jù)這�(gè)索引地址可讀到一�(gè)�(yè)表信息字,然后檢�(cè)�(yè)表信息字中裝入位的狀�(tài)。若裝入位為1,表示該�(yè)面已在主存中,將�(duì)�(yīng)的實(shí)�(yè)�(hào)與虛地址中的�(yè)�(nèi)地址相拼接就得到了完整的�(shí)地址;若裝入位為0,表示該�(yè)面不在主存中,于是要啟動(dòng)I/O系統(tǒng),把該頁(yè)從輔存中�(diào)入主存后再供CPU使用,若主存已滿,還需要使用替換算法替換頁(yè)。如圖所示給出了�(yè)式虛擬存�(chǔ)器的�-�(shí)地址的變換過(guò)程�
�(yè)式虛擬存�(chǔ)器雖然能�(shí)�(xiàn)虛擬存儲(chǔ),但它還存在一些不��
�1)由于采用定�(zhǎng)的頁(yè),雖然建立頁(yè)表方�,頁(yè)的調(diào)入也容易�(shí)�(xiàn)。但由于程序不可能正好是�(yè)面的整倍數(shù),那么一�(yè)的零頭將�(wú)法利用而造成空間浪費(fèi)�
?�?)由于頁(yè)不是邏輯上獨(dú)立的�(shí)體,這給程序的處�、保�(hù)和共享等帶來(lái)了麻��
�、段式虛擬存�(chǔ)�
在段式虛擬存�(chǔ)器系�(tǒng)�,將程序按其邏輯�(jié)�(gòu)劃分為段,各�(gè)段的�(zhǎng)度因程序而異。段式虛擬存�(chǔ)器借助于段表來(lái)�(shí)�(xiàn)虛地址與實(shí)地址的轉(zhuǎn)�。段表中每一行記錄了某�(gè)段對(duì)�(yīng)的若干信息,包括段號(hào)、裝入位、段起點(diǎn)和段�(zhǎng)�。裝入位�1,表示該段已�(diào)入主�;裝入位�0,則表示該段不在主存�。段表其�(shí)本身也是一�(gè)段,可以存放在輔存中,但一般存放在主存��
在段式虛擬存�(chǔ)器系�(tǒng)�,虛地址由段�(hào)和段�(nèi)地址兩部分組成,如圖3-18所示給出了段式虛擬存儲(chǔ)器的�-�(shí)地址的變換過(guò)��
由于段式虛擬存儲(chǔ)器的段具有邏輯獨(dú)立性,因此它易于程序的處理、保�(hù)和共享等操作,但�,因?yàn)槎蔚拈L(zhǎng)度參差不�,給主存空間分配帶來(lái)了麻煩,同時(shí)很可能也�(huì)帶來(lái)一定的空間浪費(fèi)�
�、段�(yè)式虛擬存�(chǔ)�
段頁(yè)式虛擬存�(chǔ)器是�(duì)段式、頁(yè)式虛擬存�(chǔ)器的綜合,它先將程序按其邏輯�(jié)�(gòu)分段,再將每段劃分為若干大小相等的頁(yè),同�(shí)將主存空間劃分為同樣大小的塊�
�?yàn)槎雾?yè)式存�(chǔ)管理�(duì)邏輯地址�(jìn)行了兩次劃分,次將邏輯地址劃分為若干段,第二次將每�(gè)段劃分為若干�(yè)。因�,要�(duì)�(nèi)存正常尋址,不僅要知道將要訪問的地址屬于哪�(gè)�,也要知道該地址屬于該段的哪�(gè)�(yè)。邏輯頁(yè)與物理塊一一�(duì)�(yīng),所以需要頁(yè)表來(lái)記錄各頁(yè)�(duì)�(yīng)的塊�(hào),且�?yàn)槊總�(gè)段都分成了很多頁(yè),所以每�(gè)段都需要一�(gè)�(yè)表。同�(shí),作�(yè)分成了很多段,為了統(tǒng)一管理,系�(tǒng)需要知道每�(gè)段的分頁(yè)情況,所以又要設(shè)置一�(gè)段表�(lái)記錄每�(gè)段所�(duì)�(yīng)的頁(yè)表�
作業(yè)將要�(zhí)行其中的某�(gè)�(yǔ)句時(shí),根�(jù)其地址�(jì)算出段號(hào)、頁(yè)�(hào)和頁(yè)�(nèi)地址。首先根�(jù)段號(hào)查找段表,得到該段的�(yè)表的起始地址,然后查找頁(yè)�,得到該�(yè)�(duì)�(yīng)的塊�(hào),根�(jù)塊的大小和頁(yè)�(nèi)地址�(jì)算出該語(yǔ)句的�(nèi)存地址�