清华大学《操作系统》(七):虚拟存储、覆盖、交换
接下來幾節(jié)都是對虛擬存儲的講解。虛擬存儲是非連續(xù)存儲管理的擴(kuò)展。通過將內(nèi)存中的數(shù)據(jù)暫存到外存的方式,為進(jìn)程提供更大的內(nèi)存空間。虛擬存儲出現(xiàn)的主要原因是因為程序規(guī)模的增長速度遠(yuǎn)遠(yuǎn)大于存儲器容量的增長速度,導(dǎo)致內(nèi)存空間不夠用。其實針對內(nèi)存空間不夠用的問題有多重解決方案,比如覆蓋、交換、虛擬存儲。它們的概念如下:
- 覆蓋:應(yīng)用程序手動把需要的指令和數(shù)據(jù)加載到內(nèi)存;
- 交換:操作系統(tǒng)自動把暫時不能執(zhí)行的程序保存到外存中;
- 虛擬存儲:在有限的內(nèi)存中,以頁為單位自動裝入更多更大的程序
覆蓋
目標(biāo):在較小的可用內(nèi)存中運行較大的程序。
方法:依據(jù)程序邏輯,將程序劃分為若干功能相對獨立的模塊,不會同時執(zhí)行的模塊共享同一塊內(nèi)存區(qū)域。具體有以下幾點:
- 必要部分(常用功能)的代碼和數(shù)據(jù)常駐內(nèi)存;
- 可選部分(不常用功能)放在其它程序模塊中,只在需要時加載到內(nèi)存;
- 不存在調(diào)用關(guān)系的模塊可以相互覆蓋,共用同一塊內(nèi)存區(qū)域。
具體操作如下:假設(shè)有一個程序總大小190K,調(diào)用關(guān)系如下圖。我們按照上述原則對程序進(jìn)行分組,比如A單獨一組,B與C沒有調(diào)用關(guān)系因此B、C一組,D、E、F沒有調(diào)用關(guān)系分為一組,分配內(nèi)存時按照組內(nèi)最大的模塊分配內(nèi)存,如圖中右側(cè),A劃分20K,B、C這組分配50K,D、E、F這組分配40K,按照需求向內(nèi)存中加載。這樣這個程序可以在內(nèi)存大小為110K的機(jī)器中運行。那么這種分組方式是不是最優(yōu)的呢?答案是否定的,我們可以將大小相近的分到一組,比如A單獨一組20K,B、E、F無調(diào)用關(guān)系50K,C、D無調(diào)用關(guān)系30K,總共需要100K內(nèi)存。因此不同的分組方式對內(nèi)存的需求是不一樣的。想要嚴(yán)格討論哪種方式內(nèi)存需求最小是很復(fù)雜的。
缺點
- 增加編程困難。需要程序員劃分功能模塊,并確定模塊之間的覆蓋關(guān)系,增加了編程的復(fù)雜度;
- 增加執(zhí)行時間。需要將各程序模塊在內(nèi)存模塊中換入換出,實際是用時間換空間。
交換
交換與覆蓋討論的尺度是不太一樣的。覆蓋是一個程序內(nèi),如果無法全部加載到內(nèi)存,而交換是內(nèi)存足夠放一個程序,而無法放多個程序。
目標(biāo):增加正在運行或需要運行的程序的內(nèi)存。
實現(xiàn)方法:
- 可將暫時不能運行的程序放到外存;
- 換入換出的基本單位是進(jìn)程;
- 換出是把一個進(jìn)程的整個地址空間保存到外存;
- 換入是把一個進(jìn)程的整個地址空間從外存加載到內(nèi)存。
問題
- 交換時機(jī):只當(dāng)內(nèi)存空間不足或有不足的可能的時候才進(jìn)行換入換出;
- 交換區(qū)大小:存放所有用戶進(jìn)程的所有內(nèi)存映像的拷貝;
- 程序換入時的重定位:換入時不是放回原處,因此需要程序運行過程中采用動態(tài)地址映射。
覆蓋與交換對比:
- 覆蓋:
- 交換:
交換是可以通過操作系統(tǒng)實現(xiàn)的,而覆蓋是無法在操作系統(tǒng)中實現(xiàn)的,必須有程序員具體實現(xiàn),增大了編程的難度。
虛擬存儲
虛擬存儲是想把一部分內(nèi)存中的內(nèi)容暫時存放到外存中,以提供更大的內(nèi)存空間。例如
虛擬存儲的目標(biāo):
- 只把部分程序放到內(nèi)存中,從而運行比物理內(nèi)存大的程序。并且由操作系統(tǒng)完成,無需程序員的干涉。
- 實現(xiàn)進(jìn)程在內(nèi)存和外存在之間交換,從而獲得更多的空閑內(nèi)存空間。在內(nèi)存與外存之間只交換進(jìn)程的部分內(nèi)容。
局部性原理
具體講虛擬存儲之前先了解一下局部性原理。局部性原理是指程序在執(zhí)行過程中的一個較短時期,所執(zhí)行的指令地址和指令的操作數(shù)地址,分別局限于一定區(qū)域。比如通常指令在代碼段,操作數(shù)在數(shù)據(jù)段。具體體現(xiàn)在以下幾個方面:
- 時間局部性。一條指令的一次執(zhí)行和下次執(zhí)行,一個數(shù)據(jù)的一次訪問與下次訪問都集中在一個較短時期內(nèi);
- 空間局部性。當(dāng)前指令和鄰近的幾條指令,當(dāng)前訪問的數(shù)據(jù)和鄰近的幾條數(shù)據(jù)都集中在一個較小的區(qū)域內(nèi);
- 分支局部性。一條跳轉(zhuǎn)指令的兩次執(zhí)行,很可能跳轉(zhuǎn)到相同的內(nèi)存位置。
由于局部性原理的存在,從理論上講,虛擬存儲技術(shù)是能夠?qū)崿F(xiàn)的,可以取得滿意的效果。
虛擬存儲基本概念:
虛擬存儲的基本特征:
虛擬存儲的支撐技術(shù):
- 硬件支持。頁式或段式存儲中的地址轉(zhuǎn)換機(jī)制。除之前非連續(xù)內(nèi)存管理中所講的地址轉(zhuǎn)換,還要增加判斷所需要的內(nèi)容不再內(nèi)存中。
- 操作系統(tǒng)支持。管理內(nèi)存和外存間頁面或段的換入和換出。
虛擬頁式存儲:
在頁式存儲管理的基礎(chǔ)上,增加請求調(diào)頁和頁面置換。具體思路是當(dāng)用戶程序要裝載到內(nèi)存運行時,只裝入部分頁面就啟動程序運行。進(jìn)程在運行中發(fā)現(xiàn)有需要的代碼或數(shù)據(jù)不在內(nèi)存時,則向系統(tǒng)發(fā)出缺頁異常請求。操作系統(tǒng)在處理缺頁異常時,將外存中相應(yīng)的頁面調(diào)入內(nèi)存,使得進(jìn)程能夠繼續(xù)運行。如下圖所示,在頁表中加入標(biāo)志位,當(dāng)發(fā)現(xiàn)缺頁時觸發(fā)缺頁異常,操作系統(tǒng)接管,找到相應(yīng)頁面置入內(nèi)存,并將標(biāo)志位修改為有效。
虛擬頁式管理中,頁表項結(jié)構(gòu)有相應(yīng)調(diào)整,如下圖:增加了幾個標(biāo)志位。其中駐留位用來表示是否在內(nèi)存中;修改位表示在內(nèi)存中的該頁是否被修改過,因為如果沒有修改過而外存中又有這一頁面時不需要置換,直接作廢該頁表項即可,如果被修改過則需要重新置換;訪問位表示該頁是否被訪問過(讀或?qū)?#xff09;,用于置換算法,用于近似統(tǒng)計是否經(jīng)常訪問;保護(hù)位表示該頁的允許訪問方式,如可讀可寫。
示例:
下面是X86 32位系統(tǒng)以4K為頁幀大小時的頁表項結(jié)構(gòu):幀號項占20位,標(biāo)志位中除了前面提到的駐留位、可寫標(biāo)志、訪問位、修改位,還有幾個沒提到過的。一個是用戶態(tài)標(biāo)志,表示用戶態(tài)是否可以訪問;保留位,用于擴(kuò)展,比如現(xiàn)在很多32位系統(tǒng)不僅支持4G內(nèi)存;CD位,緩存是否有效,是否允許啟用高速緩存;WT是否寫通。
缺頁異常:
缺頁異常即發(fā)現(xiàn)需要的內(nèi)存頁不在內(nèi)存中。缺頁異常處理流程如下圖:
執(zhí)行命令時CPU給出需要的邏輯地址,查找頁表;發(fā)現(xiàn)缺頁,產(chǎn)生缺頁異常;操作系統(tǒng)啟用缺頁異常例程,查找頁面在外存中的位置;從物理內(nèi)存中找空閑頁幀并將頁面換入空閑處;將頁表項修改為有效;重新執(zhí)行導(dǎo)致異常的指令。
可以看到這是最順利的情況,如果換入時發(fā)現(xiàn)沒有空閑頁幀的話則需要額外幾步:根據(jù)頁面置換算法選擇要被換出的頁幀;判斷該頁幀是否被修改過,如果被修改過則寫回外存,否則直接作廢;將其對應(yīng)的頁表項改為無效;然后將需要的頁幀換入空出來的區(qū)域,后續(xù)與最開始的流程一致。
虛擬頁式存儲中的外存是如何管理的呢?首先是在何處保存未被映射的頁?因為必須能夠方便地找到在外存中的頁面內(nèi)容,因此我們需要一個交換空間,有兩種方式實現(xiàn):磁盤或文件。Linux就是直接有交換分區(qū)。或者文件采用特殊格式存儲未被映射的頁面。
虛擬頁式存儲中的外存選擇也是個問題。代碼段本身就是存儲在可執(zhí)行文件中的,因此代碼段是直接指向你的可執(zhí)行文件;動態(tài)加載的共享庫程序段也直接指向相應(yīng)的文件;其他段放在對換區(qū)。
虛擬頁式存儲管理的性能如何評價呢?
我們定義了一個有效存儲訪問時間(effective memory access time)EAT。
舉個例子:可以看到想要效率較高,需要缺頁率p極小。
總結(jié)
以上是生活随笔為你收集整理的清华大学《操作系统》(七):虚拟存储、覆盖、交换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python网络爬虫从入门到精通吕云翔p
- 下一篇: 为什么国内的游戏公司吃相越来越难看了?