操作系统:虚拟内存的定义及实现方式
傳統(tǒng)存儲(chǔ)管理方式的特征
各種內(nèi)存管理策略都是為了同時(shí)將多個(gè)進(jìn)程保存在內(nèi)存中以便允許多道程序設(shè)計(jì)。
傳統(tǒng)的內(nèi)存管理策略它們都具有以下兩個(gè)共同的特征:
1) 一次性
作業(yè)必須一次性全部裝入內(nèi)存后,方能開始運(yùn)行。這會(huì)導(dǎo)致兩種情況發(fā)生:
·????????當(dāng)作業(yè)很大,不能全部被裝入內(nèi)存時(shí),將使該作業(yè)無法運(yùn)行;
·????????當(dāng)大量作業(yè)要求運(yùn)行時(shí),由于內(nèi)存不足以容納所有作業(yè),只能使少數(shù)作業(yè)先運(yùn)行,導(dǎo)致多道程序度的下降。
2) 駐留性
作業(yè)被裝入內(nèi)存后,就一直駐留在內(nèi)存中,其任何部分都不會(huì)被換出,直至作業(yè)運(yùn)行結(jié)束。運(yùn)行中的進(jìn)程,會(huì)因等待I/O而被阻塞,可能處于長(zhǎng)期等待狀態(tài)。
由以上分析可知,許多在程序運(yùn)行中不用或暫時(shí)不用的程序(數(shù)據(jù))占據(jù)了大量的內(nèi)存空間,而一些需要運(yùn)行的作業(yè)又無法裝入運(yùn)行,顯然浪費(fèi)了寶貴的內(nèi)存資源。
局部性原理
高速緩存技術(shù)依賴的設(shè)計(jì)原理就是程序局部性原理
要真正理解虛擬內(nèi)存技術(shù)的思想,首先必須了解計(jì)算機(jī)中著名的局部性原理。著名的 Bill Joy (SUN公司CEO)說過:”在研究所的時(shí)候,我經(jīng)常開玩笑地說高速緩存是計(jì)算機(jī)科學(xué)中唯一重要的思想。事實(shí)上,髙速緩存技術(shù)確實(shí)極大地影響了計(jì)算機(jī)系統(tǒng)的設(shè)計(jì)?!翱毂?、頁(yè)高速緩存以及虛擬內(nèi)存技術(shù)從廣義上講,都是屬于高速緩存技術(shù)。這個(gè)技術(shù)所依賴的原理就是局部性原理。局部性原理既適用于程序結(jié)構(gòu),也適用于數(shù)據(jù)結(jié)構(gòu)(更遠(yuǎn)地講,Dijkstra 著名的關(guān)于“goto語句有害”的論文也是出于對(duì)程序局部性原理的深刻認(rèn)識(shí)和理解)。
局部性原理表現(xiàn)在以下兩個(gè)方面:
·????????時(shí)間局部性:如果程序中的某條指令一旦執(zhí)行,不久以后該指令可能再次執(zhí)行;如果某數(shù)據(jù)被訪問過,不久以后該數(shù)據(jù)可能再次被訪問。產(chǎn)生時(shí)間局部性的典型原因,是由于在程序中存在著大量的循環(huán)操作。
·????????空間局部性:一旦程序訪問了某個(gè)存儲(chǔ)單元,在不久之后,其附近的存儲(chǔ)單元也將被訪問,即程序在一段時(shí)間內(nèi)所訪問的地址,可能集中在一定的范圍之內(nèi),這是因?yàn)橹噶钔ǔJ琼樞虼娣?、順序?zhí)行的,數(shù)據(jù)也一般是以向量、數(shù)組、表等形式簇聚存儲(chǔ)的。
時(shí)間局部性是通過將近來使用的指令和數(shù)據(jù)保存到高速緩存存儲(chǔ)器中,并使用高速緩存的層次結(jié)構(gòu)實(shí)現(xiàn)。空間局部性通常是使用較大的高速緩存,并將預(yù)取機(jī)制集成到高速緩存控制邏輯中實(shí)現(xiàn)。虛擬內(nèi)存技術(shù)實(shí)際上就是建立了 “內(nèi)存一外存”的兩級(jí)存儲(chǔ)器的結(jié)構(gòu),利用局部性原理實(shí)現(xiàn)髙速緩存。???
?
虛擬存儲(chǔ)器的定義和特征
基于局部性原理,在程序裝入時(shí),可以將程序的一部分裝入內(nèi)存,而將其余部分留在外存,就可以啟動(dòng)程序執(zhí)行。在程序執(zhí)行過程中,當(dāng)所訪問的信息不在內(nèi)存時(shí),由操作系統(tǒng)將所需要的部分調(diào)入內(nèi)存,然后繼續(xù)執(zhí)行程序。
另一方面,操作系統(tǒng)將內(nèi)存中暫時(shí)不使用的內(nèi)容換出到外存上,從而騰出空間存放將要調(diào)入內(nèi)存的信息。這樣,系統(tǒng)好像為用戶提供了一個(gè)比實(shí)際內(nèi)存大得多的存儲(chǔ)器,稱為虛擬存儲(chǔ)器。
之所以將其稱為虛擬存儲(chǔ)器,是因?yàn)?span style="color:#f33b45;">這種存儲(chǔ)器實(shí)際上并不存在,只是由于(對(duì)用戶完全透明),給用戶的感覺是好像存在一個(gè)比實(shí)際物理內(nèi)存大得多的存儲(chǔ)器。虛擬存儲(chǔ)器的大小由計(jì)算機(jī)的地址結(jié)構(gòu)決定,并非是內(nèi)存和外存的簡(jiǎn)單相加。虛擬存儲(chǔ)器有以下三個(gè)主要特征:
·????????多次性,是指無需在作業(yè)運(yùn)行時(shí)一次性地全部裝入內(nèi)存,而是允許被分成多次調(diào)入內(nèi)存運(yùn)行。
·????????對(duì)換性,是指無需在作業(yè)運(yùn)行時(shí)一直常駐內(nèi)存,而是允許在作業(yè)的運(yùn)行過程中,進(jìn)行換進(jìn)和換出。
·????????虛擬性,是指從邏輯上擴(kuò)充內(nèi)存的容量,使用戶所看到的內(nèi)存容量,遠(yuǎn)大于實(shí)際的內(nèi)存容量。
虛擬內(nèi)存技術(shù)的實(shí)現(xiàn)
虛擬內(nèi)存中,允許將一個(gè)作業(yè)分多次調(diào)入內(nèi)存。釆用連續(xù)分配方式時(shí),會(huì)使相當(dāng)一部分內(nèi)存空間都處于暫時(shí)或“永久”的空閑狀態(tài),造成內(nèi)存資源的嚴(yán)重浪費(fèi),而且也無法從邏輯上擴(kuò)大內(nèi)存容量。因此,虛擬內(nèi)存的實(shí)現(xiàn)需要建立在離散分配的內(nèi)存管理方式的基礎(chǔ)上。虛擬內(nèi)存的實(shí)現(xiàn)有以下三種方式:
·????????請(qǐng)求分頁(yè)存儲(chǔ)管理。
·????????請(qǐng)求分段存儲(chǔ)管理。
·????????請(qǐng)求段頁(yè)式存儲(chǔ)管理。
不管哪種方式,都需要有一定的硬件支持。一般需要的支持有以下幾個(gè)方面:
·????????一定容量的內(nèi)存和外存。
·????????頁(yè)表機(jī)制(或段表機(jī)制),作為主要的數(shù)據(jù)結(jié)構(gòu)。
·????????中斷機(jī)構(gòu),當(dāng)用戶程序要訪問的部分尚未調(diào)入內(nèi)存,則產(chǎn)生中斷。
·????????地址變換機(jī)構(gòu),邏輯地址到物理地址的變換。
3.6 請(qǐng)求分頁(yè)管理方式實(shí)現(xiàn)虛擬內(nèi)存
請(qǐng)求分頁(yè)系統(tǒng)建立在基本分頁(yè)系統(tǒng)基礎(chǔ)之上,為了支持虛擬存儲(chǔ)器功能而增加了請(qǐng)求調(diào)頁(yè)功能和頁(yè)面置換功能。請(qǐng)求分頁(yè)是目前最常用的一種實(shí)現(xiàn)虛擬存儲(chǔ)器的方法。
在請(qǐng)求分頁(yè)系統(tǒng)中,只要求將當(dāng)前需要的一部分頁(yè)面裝入內(nèi)存,便可以啟動(dòng)作業(yè)運(yùn)行。在作業(yè)執(zhí)行過程中,當(dāng)所要訪問的頁(yè)面不在內(nèi)存時(shí),再通過調(diào)頁(yè)功能將其調(diào)入,同時(shí)還可以通過置換功能將暫時(shí)不用的頁(yè)面換出到外存上,以便騰出內(nèi)存空間。
為了實(shí)現(xiàn)請(qǐng)求分頁(yè),系統(tǒng)必須提供一定的硬件支持。除了需要一定容量的內(nèi)存及外存的計(jì)算機(jī)系統(tǒng),還需要有頁(yè)表機(jī)制、缺頁(yè)中斷機(jī)構(gòu)和地址變換機(jī)構(gòu)。
頁(yè)表機(jī)制
請(qǐng)求分頁(yè)系統(tǒng)的頁(yè)表機(jī)制不同于基本分頁(yè)系統(tǒng),請(qǐng)求分頁(yè)系統(tǒng)在一個(gè)作業(yè)運(yùn)行之前不要求全部一次性調(diào)入內(nèi)存,因此在作業(yè)的運(yùn)行過程中,必然會(huì)出現(xiàn)要訪問的頁(yè)面不在內(nèi)存的情況,如何發(fā)現(xiàn)和處理這種情況是請(qǐng)求分頁(yè)系統(tǒng)必須解決的兩個(gè)基本問題。為此,在請(qǐng)求頁(yè)表項(xiàng)中增加了四個(gè)字段,如圖3-24所示。
圖3-24??請(qǐng)求分頁(yè)系統(tǒng)中的頁(yè)表項(xiàng)
增加的四個(gè)字段說明如下:
·????????狀態(tài)位P:用于指示該頁(yè)是否已調(diào)入內(nèi)存,供程序訪問時(shí)參考。
·????????訪問字段A:用于記錄本頁(yè)在一段時(shí)間內(nèi)被訪問的次數(shù),或記錄本頁(yè)最近己有多長(zhǎng)時(shí)間未被訪問,供置換算法換出頁(yè)面時(shí)參考。
·????????修改位M:標(biāo)識(shí)該頁(yè)在調(diào)入內(nèi)存后是否被修改過。
·????????外存地址:用于指出該頁(yè)在外存上的地址,通常是物理塊號(hào),供調(diào)入該頁(yè)時(shí)參考。
缺頁(yè)中斷機(jī)構(gòu)
在請(qǐng)求分頁(yè)系統(tǒng)中,每當(dāng)所要訪問的頁(yè)面不在內(nèi)存時(shí),便產(chǎn)生一個(gè)缺頁(yè)中斷,請(qǐng)求操作系統(tǒng)將所缺的頁(yè)調(diào)入內(nèi)存。此時(shí)應(yīng)將缺頁(yè)的進(jìn)程阻塞(調(diào)頁(yè)完成喚醒),如果內(nèi)存中有空閑塊,則分配一個(gè)塊,將要調(diào)入的頁(yè)裝入該塊,并修改頁(yè)表中相應(yīng)頁(yè)表項(xiàng),若此時(shí)內(nèi)存中沒有空閑塊,則要淘汰某頁(yè)(若被淘汰頁(yè)在內(nèi)存期間被修改過,則要將其寫回外存)。
請(qǐng)求頁(yè)面的時(shí)候,若內(nèi)存中有空閑的塊未使用,則直接將調(diào)入的頁(yè)放入這個(gè)塊使用,并修改頁(yè)表中的頁(yè)表項(xiàng);若內(nèi)存中沒有空閑塊,則要采取頁(yè)面置換算法淘汰一個(gè)頁(yè)面。
缺頁(yè)中斷作為中斷同樣要經(jīng)歷,諸如保護(hù)CPU環(huán)境、分析中斷原因、轉(zhuǎn)入缺頁(yè)中斷處理程序、恢復(fù)CPU環(huán)境等幾個(gè)步驟。但與一般的中斷相比,它有以下兩個(gè)明顯的區(qū)別:
·????????在指令執(zhí)行期間產(chǎn)生和處理中斷信號(hào),而非一條指令執(zhí)行完后,屬于內(nèi)部中斷。
·????????一條指令在執(zhí)行期間,可能產(chǎn)生多次缺頁(yè)中斷。
地址變換機(jī)構(gòu)
請(qǐng)求分頁(yè)系統(tǒng)中的地址變換機(jī)構(gòu),是在分頁(yè)系統(tǒng)地址變換機(jī)構(gòu)的基礎(chǔ)上,為實(shí)現(xiàn)虛擬內(nèi)存,又增加了某些功能而形成的。
圖3-25請(qǐng)求分頁(yè)中的地址變換過程
如圖3-25所示,在進(jìn)行地址變換時(shí),先檢索快表:
·????????若找到要訪問的頁(yè),便修改頁(yè)表項(xiàng)中的訪問位(寫指令則還須重置修改位),然后利用頁(yè)表項(xiàng)中給出的物理塊號(hào)和頁(yè)內(nèi)地址形成物理地址。
·????????若未找到該頁(yè)的頁(yè)表項(xiàng),應(yīng)到內(nèi)存中去查找頁(yè)表,再對(duì)比頁(yè)表項(xiàng)中的狀態(tài)位P,看該頁(yè)是否已調(diào)入內(nèi)存,未調(diào)入則產(chǎn)生缺頁(yè)中斷,請(qǐng)求從外存把該頁(yè)調(diào)入內(nèi)存。
?
3.8頁(yè)面分配策略:駐留集大小、調(diào)入頁(yè)面的時(shí)機(jī)以及從何處調(diào)入頁(yè)面
駐留集大小
對(duì)于分頁(yè)式的虛擬內(nèi)存,在準(zhǔn)備執(zhí)行時(shí),不需要也不可能把一個(gè)進(jìn)程的所有頁(yè)都讀取到主存,因此,操作系統(tǒng)必須決定讀取多少頁(yè)。也就是說,給特定的進(jìn)程分配多大的主存空間,這需要考慮以下幾點(diǎn):
1.???????分配給一個(gè)進(jìn)程的存儲(chǔ)量越小,在任何時(shí)候駐留在主存中的進(jìn)程數(shù)就越多,從而可以提高處理機(jī)的時(shí)間利用效率。
2.???????如果一個(gè)進(jìn)程在主存中的頁(yè)數(shù)過少,盡管有局部性原理,頁(yè)錯(cuò)誤率仍然會(huì)相對(duì)較高。
3.? ? ? ?如果頁(yè)數(shù)過多,由于局部性原理,給特定的進(jìn)程分配更多的主存空間對(duì)該進(jìn)程的錯(cuò)誤率沒有明顯的影響。
基于這些因素,現(xiàn)代操作系統(tǒng)通常釆用三種策略:
1.??????固定分配局部置換。它為每個(gè)進(jìn)程分配一定數(shù)目的物理塊,在整個(gè)運(yùn)行期間都不改變。若進(jìn)程在運(yùn)行中發(fā)生缺頁(yè),則只能從該進(jìn)程在內(nèi)存中的頁(yè)面中選出一頁(yè)換出,然后再調(diào)入需要的頁(yè)面。實(shí)現(xiàn)這種策略難以確定為每個(gè)進(jìn)程應(yīng)分配的物理塊數(shù)目:太少會(huì)頻繁出現(xiàn)缺頁(yè)中斷,太多又會(huì)使CPU和其他資源利用率下降。
2.??????可變分配全局置換。這是最易于實(shí)現(xiàn)的物理塊分配和置換策略,為系統(tǒng)中的每個(gè)進(jìn)程分配一定數(shù)目的物理塊,操作系統(tǒng)自身也保持一個(gè)空閑物理塊隊(duì)列。當(dāng)某進(jìn)程發(fā)生缺頁(yè)時(shí),系統(tǒng)從空閑物理塊隊(duì)列中取出一個(gè)物理塊分配給該進(jìn)程,并將欲調(diào)入的頁(yè)裝入其中。
3.??????可變分配局部置換。它為每個(gè)進(jìn)程分配一定數(shù)目的物理塊,當(dāng)某進(jìn)程發(fā)生缺頁(yè)時(shí),只允許從該進(jìn)程在內(nèi)存的頁(yè)面中選出一頁(yè)換出,這樣就不會(huì)影響其他進(jìn)程的運(yùn)行。如果進(jìn)程在運(yùn)行中頻繁地缺頁(yè),系統(tǒng)再為該進(jìn)程分配若干物理塊,直至該進(jìn)程缺頁(yè)率趨于適當(dāng)程度; 反之,若進(jìn)程在運(yùn)行中缺頁(yè)率特別低,則可適當(dāng)減少分配給該進(jìn)程的物理塊。
調(diào)入頁(yè)面的時(shí)機(jī)
程序初始化啟動(dòng)的時(shí)候,預(yù)調(diào)頁(yè)策略
為確定系統(tǒng)將進(jìn)程運(yùn)行時(shí)所缺的頁(yè)面調(diào)入內(nèi)存的時(shí)機(jī),可釆取以下兩種調(diào)頁(yè)策略:
1.??????預(yù)調(diào)頁(yè)策略。根據(jù)局部性原理,一次調(diào)入若干個(gè)相鄰的頁(yè)可能會(huì)比一次調(diào)入一頁(yè)更高效。但如果調(diào)入的一批頁(yè)面中大多數(shù)都未被訪問,則又是低效的。所以就需要釆用以預(yù)測(cè)為基礎(chǔ)的預(yù)調(diào)頁(yè)策略,將預(yù)計(jì)在不久之后便會(huì)被訪問的頁(yè)面預(yù)先調(diào)入內(nèi)存。但目前預(yù)調(diào)頁(yè)的成功率僅約50%。故這種策略主要用于進(jìn)程的首次調(diào)入時(shí),由程序員指出應(yīng)該先調(diào)入哪些頁(yè)。
2.??????請(qǐng)求調(diào)頁(yè)策略。進(jìn)程在運(yùn)行中需要訪問的頁(yè)面不在內(nèi)存而提出請(qǐng)求,由系統(tǒng)將所需頁(yè)面調(diào)入內(nèi)存。由這種策略調(diào)入的頁(yè)一定會(huì)被訪問,且這種策略比較易于實(shí)現(xiàn),故在目前的虛擬存儲(chǔ)器中大多釆用此策略。它的缺點(diǎn)在于每次只調(diào)入一頁(yè),調(diào)入調(diào)出頁(yè)面數(shù)多時(shí)會(huì)花費(fèi)過多的I/O開銷。
從何處調(diào)入頁(yè)面
請(qǐng)求分頁(yè)系統(tǒng)中的外存分為兩部分:用于存放文件的文件區(qū)和用于存放對(duì)換頁(yè)面的對(duì)換區(qū)。對(duì)換區(qū)通常是釆用連續(xù)分配方式,而文件區(qū)釆用離散分配方式,故對(duì)換區(qū)的磁盤I/O速度比文件區(qū)的更快。這樣從何處調(diào)入頁(yè)面有三種情況:
1.??????系統(tǒng)擁有足夠的對(duì)換區(qū)空間:可以全部從對(duì)換區(qū)調(diào)入所需頁(yè)面,以提髙調(diào)頁(yè)速度。為此,在進(jìn)程運(yùn)行前,需將與該進(jìn)程有關(guān)的文件從文件區(qū)復(fù)制到對(duì)換區(qū)。
2.??????系統(tǒng)缺少足夠的對(duì)換區(qū)空間:凡不會(huì)被修改的文件都直接從文件區(qū)調(diào)入;而當(dāng)換出這些頁(yè)面時(shí),由于它們未被修改而不必再將它們換出。但對(duì)于那些可能被修改的部分,在將它們換出時(shí)須調(diào)到對(duì)換區(qū),以后需要時(shí)再?gòu)膶?duì)換區(qū)調(diào)入。
3.??????UNIX方式:與進(jìn)程有關(guān)的文件都放在文件區(qū),故未運(yùn)行過的頁(yè)面,都應(yīng)從文件區(qū)調(diào)入。曾經(jīng)運(yùn)行過但又被換出的頁(yè)面,由于是被放在對(duì)換區(qū),因此下次調(diào)入時(shí)應(yīng)從對(duì)換區(qū)調(diào)入。進(jìn)程請(qǐng)求的共享頁(yè)面若被其他進(jìn)程調(diào)入內(nèi)存,則無需再?gòu)膶?duì)換區(qū)調(diào)入。
3.9頁(yè)面抖動(dòng)(顛簸)和工作集(駐留集)
頁(yè)面抖動(dòng)(顛簸)
在頁(yè)面置換過程中的一種最糟糕的情形是,剛剛換出的頁(yè)面馬上又要換入主存,剛剛換入的頁(yè)面馬上就要換出主存,換句話說就是進(jìn)程需要頻繁的進(jìn)行缺頁(yè)中斷。這種頻繁的頁(yè)面調(diào)度行為稱為抖動(dòng),或顛簸。如果一個(gè)進(jìn)程在換頁(yè)上用的時(shí)間多于執(zhí)行時(shí)間,那么這個(gè)進(jìn)程就在顛簸。
頻繁的發(fā)生缺頁(yè)中斷(抖動(dòng)),其主要原因是某個(gè)進(jìn)程頻繁訪問的頁(yè)面數(shù)目高于可用的物理頁(yè)幀數(shù)目。虛擬內(nèi)存技術(shù)可以在內(nèi)存中保留更多的進(jìn)程以提髙系統(tǒng)效率。在穩(wěn)定狀態(tài),幾乎主存的所有空間都被進(jìn)程塊占據(jù),處理機(jī)和操作系統(tǒng)可以直接訪問到盡可能多的進(jìn)程。但如果管理不當(dāng),處理機(jī)的大部分時(shí)間都將用于交換塊,即請(qǐng)求調(diào)入頁(yè)面的操作,而不是執(zhí)行進(jìn)程的指令,這就會(huì)大大降低系統(tǒng)效率。
工作集(駐留集)
工作集(或駐留集)是指在某段時(shí)間間隔內(nèi),進(jìn)程要訪問的頁(yè)面集合。經(jīng)常被使用的頁(yè)面需要在工作集中,而長(zhǎng)期不被使用的頁(yè)面要從工作集中被丟棄。為了防止系統(tǒng)出現(xiàn)抖動(dòng)現(xiàn)象,需要選擇合適的工作集大小。
工作集模型的原理是:讓操作系統(tǒng)跟蹤每個(gè)進(jìn)程的工作集,并為進(jìn)程分配大于其工作集的物理塊。如果還有空閑物理塊,則可以再調(diào)一個(gè)進(jìn)程到內(nèi)存以增加多道程序數(shù)。如果所有工作集之和增加以至于超過了可用物理塊的總數(shù),那么操作系統(tǒng)會(huì)暫停一個(gè)進(jìn)程,將其頁(yè)面調(diào)出并且將其物理塊分配給其他進(jìn)程,防止出現(xiàn)抖動(dòng)現(xiàn)象。
正確選擇工作集的大小,對(duì)存儲(chǔ)器的利用率和系統(tǒng)吞吐量的提嵩,都將產(chǎn)生重要影響。
3.10內(nèi)存管理知識(shí)點(diǎn)總結(jié)
分頁(yè)管理方式和分段管理方式在很多地方相似,比如內(nèi)存中都是不連續(xù)的、都有地址變 換機(jī)構(gòu)來進(jìn)行地址映射等。但兩者也存在著許多區(qū)別,表3-20列出了分頁(yè)管理方式和分段管理方式在各個(gè)方面的對(duì)比。
表3-20 分頁(yè)管理方式和分段管理方式的比較
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的操作系统:虚拟内存的定义及实现方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统:几种页面置换算法
- 下一篇: 操作系统:生产者与消费者问题