【操作系統】第五章 虛擬存儲器

1. 虛擬存儲器的基本概念


1.1 常規存儲器管理方式的特徵

一次性:作業在運行前一次性地全部裝入內存

駐留性:作業裝入內存後,便一直駐留在內存中,直至作業運行結束。


1.2 局部性原理

程序在執行時將呈現出局部性規律:

在一較短的時間內

程序的執行僅侷限於某個部分;

相應地,所訪問的存儲空間也侷限於某個區域。


程序執行的特點:

多數情況下仍是順序執行

少部分的轉移和過程調用指令會使程序執行由一部分區域轉至另一部分區域(但研究表明調用深度多數情況下不超過5)

許多由少數指令構成的循環結構會多次執行。

對許多數據結構的處理(如數組)往往侷限於很小的範圍內。


所有上述情況都表現出程序執行的局部性:

時間局部性(temporal locality)

被引用過一次的存儲器位置很可能在不遠的將來再被多次引用。

空間局部性(spatial locality)

如果一個存儲器位置被引用了一次,那麼程序很可能在不遠的將來引用附近的一個存儲器位置。


基於局部性原理

程序運行前,不需全部裝入內存(打破一次性)

僅裝入當前要運行的部分頁面或段即可運行,其餘部分暫留在外存上。

缺頁/段的情況:要訪問的頁(段) 尚未調入內存。程序應利用OS所提供的請求調頁(段)功能,將它們調入內存,使程序繼續執行。

調入需要的頁/段時,如果內存已滿,無法再裝入新頁(段),通過置換功能將內存中暫時不用的頁(段)調至外存,騰出足夠的內存空間。(不總駐留)


總之:

爲了用小的內存實現在大的虛空間中程序的運行目的

基於局部性原理

虛擬存儲器管理——由操作系統提供一個比實際內存大的,假想的特大存儲器。


1.3 虛擬存儲器的定義

所謂“虛擬存儲器”,是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。


虛擬存儲管理下

內存邏輯容量由內存容量和外存容量之和所決定

運行速度接近於內存速度

每位的成本卻接近於外存。


1.4 虛擬存儲器的實現

虛擬存儲管理:

允許將一個作業分多次調入內存。


若採用連續分配方式,需申請足夠空間,再分多次裝入,造成內存資源浪費,並不能從邏輯上擴大內存容量

虛擬的實現建立在離散分配存儲管理基礎上

方式:請求分頁/請求分段系統

細節:分頁/段機構、中斷機構、地址變換機構、軟件支持


1.5 虛擬存儲器的特徵

離散分配方式是基礎

多次性:一個作業被分成多次調入內存運行

對換性:允許在作業的運行過程中進行換進、換出。(進程整體對換不算虛擬)

最終體現虛擬性:能夠從邏輯上擴充內存容量,使用戶所看到的內存容量遠大於實際內存容量。




2. 請求分頁存儲管理方式

基本分頁 + “請求調頁”和“頁面置換”功能。

換入和換出基本單位都是長度固定的頁面



2.1 硬件支持

一臺具有一定容量的內/外存的計算機+ 頁表機制+ 缺頁中斷機構+ 地址轉換機構


①頁表基本功能不變:

邏輯地址映射爲物理地址

增加虛擬功能後需記錄的頁表項信息有變化:

(1) 狀態位P :指示該頁是否已調入內存

(2) 訪問字段A :用於記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問。(置換時考量的參數)

(3) 修改位M :該頁在調入內存後是否被修改過。(關係到置換時調出的具體操作)

(4) 外存地址:用於指出該頁在外存上的地址。


②缺頁中斷機構

每當要訪問的頁面不在內存時,便產生一缺頁中斷通知OS,OS則將所缺之頁調入內存。作爲中斷,需經歷幾個步驟:

“保護CPU環境”

“分析中斷原因”

“轉入缺頁中斷處理程序”

“恢復CPU環境”等。


作爲一種特殊中斷,與一般中斷有明顯區別:

(1) 在指令執行期間產生和處理中斷信號。

(2) 一條指令在執行期間,可能產生多次缺頁中斷。


③地址變換機構

分頁系統地址變換機構的基礎上增加

產生和處理缺頁中斷(請求調入)

從內存中換出一頁的功能(置換)



2.2 內存分配

最小物理塊數的確定

少於此數量進程將不能運行

與計算機的硬件結構有關,取決於指令的格式、功能和尋址方式


②物理塊的分配策略

考慮:固定OR可變分配、全局OR局部置換。

組合出三種適合的策略。


固定分配、局部置換

爲每個進程分配一定數目的物理塊,在整個運行期間不再改變(基於進程的類型,或根據程序員、程序管理員的建議)

運行中缺頁時,只能從該進程內存中n個頁面中選出一頁換出,然後再調入一頁。

困難:難以把握爲每個進程分配“適量”物理塊數



可變分配、全局置換

先爲每個進程分配一定數目的物理塊

OS管理一個空閒物理塊隊列,發生缺頁時,系統從隊列中取出一塊分配給該進程,將欲調入的頁裝入(動態增長型,全局空閒空間都可分配使用)

空閒空間不足時,可與其他任何進程頁面置換。“會使其他進程缺頁率提高,影響運行”

最易實現



可變分配、局部置換

爲每個進程分配一定數目的物理塊

缺頁時,只允許換出該進程在內存的頁面,不影響其他進程執行。

根據缺頁率增減進程的物理塊數:若頻繁缺頁中斷,則系統再爲進程分配若干物理快;若缺頁率特別低,則適當減少分配給該進程的物理塊。



③物理塊的分配算法

固定分配策略時,分配物理塊可採用以下幾種算法:

平均分配算法

將所有可供分配的物理塊平均分配給各進程。

缺點:未考慮各進程本身的大小,利用率不均。


按比例分配算法

根據進程的大小按比例分配物理塊。

設系統中共有n個進程

則,每個進程能分到的物理塊數:



考慮優先權的分配算法

實際應用中,要照顧重要、急迫的作業儘快完成,爲它分配較多的內存空間。

所有可用物理塊分兩部分:

一部分按比例分配給各進程;

另一部分根據各進程優先權,適當地爲其增加份額,分配給各進程。



2.3 調頁策略


① 何時調入頁面

預調頁策略

以預測爲基礎,將預計不久後便會被訪問的若干頁面,預先調入內存。

優點:一次調入若干頁,效率較好

缺點:預測不一定準確,預調入的頁面可能根本不被執行到。主要用於進程的首次調入,由程序員指出應該先調入哪些頁。


請求調頁策略

運行中需要的頁面不在內存,便立即提出請求,由OS將其調入內存。

優點:由請求調頁策略所確定調入的頁,一定會被訪問;比較容易實現。

缺點:每次僅調入一頁,需花費較大的系統開銷,增加了磁盤I/O的啓動頻率。


② 從何處調入頁面

在請求分頁系統中的外存分爲:

對換區:連續存放數據,讀寫速度較快

文件區:離散分配方式,I/O速度相對慢


發生缺頁時,系統應從何處將缺頁調入內存,分成三種情況:

系統擁有足夠的對換區空間:

進程運行前所有頁面由文件區拷貝到對換區;

運行需要的頁面全部從對換區調入內存,提高調頁速度。

系統缺少足夠的對換區空間:

不會被修改的部分,在文件區操作(即:直接從文件區調入,換出時不用寫入文件,再調入時仍從文件區調入)

可能被修改的部分,在對換區操作。

UNIX方式:(隨運行數據逐漸從文件區轉到對換區)

未運行的頁面從文件區調入;

曾經運行,但又被換出的頁面放在對換區,下次調入應從對換區調入。

進程請求的共享頁面可能已被其他進程調入,無需再從對換區調入。



③ 頁面調入過程

程序運行前需要裝入內存:上述的②步策略處理何處調入;

開始運行:先預調入一部分頁面;

運行中:需要的頁面不在內存時

向CPU發出一缺頁中斷,“中斷處理程序”開始工作:

首先保留CPU環境

分析中斷原因後,轉入缺頁中斷處理程序。

處理:判斷是否置換、頁表信息更新

恢復現場,重新操作頁面。



3.頁面置換算法

頁面置換算法(page replacement algorithms):選擇換出哪些頁面的算法,其好壞直接影響系統的性能。


應具有較低的缺頁率:

頁面調入次數(缺頁次數)/總的頁面使用次數


3.1 最佳(Optimal)置換算法

換出以後永不再用的,或在最長(未來)時間內不再被訪問的頁面。

優點:保證獲得最低的缺頁率

不足:無法實現,因爲無法預知一進程將來的運行情況

作用:作爲參照標準,評價其他算法。


3.2 先進先出置換算法(FIFO)

先進入的先淘汰,即選擇內存中駐留時間最久的頁面予以淘汰。

優點:實現簡單,把一進程已調入內存的頁面按先後次序組織成一個隊列,並設置一個指針(替換指針),使它總是指向隊首最老的頁面。

不足:與進程實際運行規律不相適應(較早調入的頁往往是經常被訪問的頁,頻繁被對換造成運行性能降低)


3.3 最近最久未使用(LRU)置換算法

無法預測將來的使用情況,只能利用“最近的過去”作爲“最近的將來”的近似,因此,LRU置換算法選擇最近最久未使用(least recently used)的頁面予以淘汰

不足:有時頁面過去和未來的走向之間並無必然的聯繫。

相應的需較多的硬件支持:記錄每個頁面自上次被訪問以來所經歷的時間t,淘汰時選擇頁面t值最大的;以及需要快速地知道哪一頁是最近最久未使用的頁面,用寄存器或棧。


①寄存器記錄時間的原理

一進程有8個頁面,每個頁面需配備一個8位的(移位)寄存器。

移位寄存器表示爲

            R=Rn-1Rn-2Rn-3…R2R1R0

頁面被訪問後的操作:

將該頁對應的寄存器的Rn-1位置爲1

如何記時:

由系統發出定時信號,每隔一定時間將所有寄存器右移1位。

某一時刻,比較各寄存器的值,被用到的標誌1逐漸往低位上積累,若高位上沒有1,就說明最近沒用過。所以最近最久未使用的就是寄存器值最小的那個頁。


②棧記錄時間的原理

某頁面被訪問,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此:棧頂始終是最新被訪問頁面的編號,越久未使用,頁面越被壓在棧底。




練習:某程序在內存中分配三個頁面,初始爲空,頁面走向爲4,3,2,1,4,3,5,4,3,2,1,5。

試分別利用OPT、FIFO及LRU算法計算缺頁次數。


3.4 輪轉算法(clock)�又稱最近未使用算法(NRU, Not Recently Used)

LRU(最近最久未使用算法)近似算法,折衷FIFO

每個頁設一個使用標誌位(use bit),若該頁被訪問則將其置爲1。

設置一個指針,從當前指針位置開始按地址先後檢查各頁,尋找use bit=0的頁面作爲被置換頁。

若指針經過的頁use bit=1,修改use bit=0(暫不凋出,給被用過的頁面駐留的機會 ),指針繼續向下。到所有頁面末尾後再返回隊首檢查。



說明:

增加了一個使用位

當一頁首次加載入內存時,該位爲1,當該頁被訪問時,使用位也置1

當需要進行頁替換時

第一個使用位爲0的幀被替換,指針指向緩衝區的下一幀

循環掃描,遇到使用位爲1的,變成0



3.5 其他置換算法


①最少使用 (LFU, Least Frequently Used)

關鍵在次數記錄上

每頁設置訪問計數器,每當頁面被訪問時,該頁面的訪問計數器加1;缺頁中斷時,淘汰計數值最小的頁面,並將所有計數清零;

計數的實現類似LRU,用移位寄存器,但比較時不是簡單比較寄存器的值,而是比較寄存器每位的和∑Ri。


②頁面緩衝算法PBA(page buffering algorithm)

對FIFO算法的發展,彌補了FIFO可能造成的I/O開銷,又不需要LRU等算法的硬件支持。

仍用FIFO算法選擇被置換頁

但並不將其馬上換入外存。

系統將頁面放入兩個鏈表之一:如果頁面未被修改,就將其歸入到空閒頁面鏈表的末尾;否則將其歸入到已修改頁面鏈表。

需要調入新的物理頁面時,將新頁面內容讀入到空閒頁面鏈表的第一項所指的頁面,然後將第一項刪除(從空閒鏈表摘下)。

空閒頁面和已修改頁面,仍停留在內存中一段時間,如果這些頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作爲進程的內存頁。

當已修改頁面達到一定數目後,再將它們一起調出到外存,然後將它們歸入空閒頁面鏈表,這樣能大大減少I/O操作的次數。





虛擬存儲管理下訪問內存的有效時間




影響缺頁率的主要因素 

(1)分配給作業的主存塊數:

多則缺頁率低,反之則高。

(2)頁面大小:

大則缺頁率低;反之則高。

(3)頁面調度算法:

對缺頁中斷率影響很大,但不可能找到一種最佳算法。

(4)程序編制方法:

以數組運算爲例,如果每一行元素存放在一頁中,則按行處理各元素缺頁中斷率低;反之,按列處理各元素,則缺頁中斷率高。



抖動

系統抖動:

爲了提高處理機利用率,可增加多道程序併發度;

但進程數目增加過多,每個進程分配得到的物理塊太少,在某個臨界點上,會出現剛被淘汰的頁很快又需重新調入;而調入不久又被淘汰出去;出現頻繁缺頁

大部分處理器時間都用在來回的頁面調度上,這種局面稱爲系統抖動或顛簸(thrashing)

抖動的後果:

缺頁率急劇增加

內存有效存取時間加長,

系統吞吐量驟減;系統已基本不能完成什麼任務,而是忙於頁面對換操作,cpu雖然忙,但效率急劇下降。

根本原因:

頁面淘汰算法不合理;分配給進程的物理頁面數(駐留集)太少。

常用防抖動方法:

局部置換策略;

頁面調入內存前檢查各進程工作集,爲缺頁率高的增加有限物理塊;

L缺頁間的平均時間=S置換一個頁面所需時間,可使磁盤和cpu達到最大利用率;

抖動發生時選擇暫停一些進程,調節多道程序度



缺頁率與物理塊數有關聯,基於程序局部性原理,若能預知程序在某段時間要訪問的頁面並全部調入他們,將大大降低缺頁率。

Denning提出工作集概念:

某段時間間隔中,進程實際要訪問的頁面的集合。可以用一個二元函數W(t, )來表示, t是當前的執行時刻, 稱爲工作集窗口(working-set window )。


工作集模型的原理:

操作系統跟蹤每個進程的工作集,併爲進程分配大於其工作集的物理塊。

如果還有空閒物理塊,則可以再調一個進程到內存以增加多道程序數。

如果所有工作集之和增加以至於超過了可用物理塊的總數,那麼操作系統會暫停一個進程,將其頁面調出並且將其物理塊分配給其他進程,防止出現抖動現象。

正確選擇工作集的大小,對存儲器的利用率和系統吞吐量的提嵩,都將產生重要影響。





4.請求分段存儲管理方式

在請求分段系統中,程序運行之前,只需先調入若干個分段(不必調入所有的分段),便可啓動運行。當所訪問的段不在內存中時,可請求OS將所缺的段調入內存。


4.1請求分段中的硬件支持

①段表機制

(1) 存取方式 :用於標識本分段的存取屬性。R,R/W,W

(2) 訪問字段A :用於記錄本段被訪問的頻繁程度。

(3) 修改位M :表示該段在調入內存後是否被修改過。

(4) 存在狀態位P :指示該段是否已調入內存。

(5) 增補位 :特有字段,表示該段運行中是否做過動態增長

(6) 外存地址:用於指出該段在外存上的起始地址(盤塊號)。


②缺段中斷機構

發現運行進程所訪問段尚未調入內存

由缺段中斷機構產生一缺段中斷信號

進入OS,由缺段中斷處理程序將所需的段調入內存。

缺段中斷同樣在一條指令的執行期間產生和處理中斷,一條指令執行可能產生多次缺段中斷。但不會出現一條指令被分割在兩個分段中或一組信息被分割在兩個分段中的情況。


③ 地址變換機構

基於分段系統地址變換機構的基礎

段調入內存

修改段表

再利用段表進行地址變換。

總之:就是增加了缺段中斷的請求及處理等功能。



4.2 分段的共享和保護

分段在邏輯意義上劃分,實現共享和保護都較方便。以下討論具體實現:


①實現共享:共享段表

在內存中配置一張共享段表,每個共享段都佔有一表項,記錄如下內容:

共享計數count:

共享段爲多個進程所需要,當某進程不再需要它而釋放它時,系統並不回收該段所佔內存區,僅當所有共享該段的進程全都不再需要它時,才由系統回收該段所佔內存區。設置count用於記錄有多少個進程需要共享該分段

存取控制字段:一個共享段給不同的進程以不同的存取權限。

段號:對一個共享段,不同的進程可用不同的段號。



② 共享段如何分享與回收

共享段的分配

第一個請求使用該共享段的進程A:系統爲該共享段分配一物理區,再把共享段裝入該區;

將該區的始址填入A的段表相應項;

共享段表中增加一表項,填寫有關數據,count置1;

其他進程B也調用該共享段時,無需再爲該段分配內存,只需在B的段表中增加一表項,填寫該共享段的物理地址;在共享段的段表中,填上調用進程的進程名、存取控制等,再執行count:=count+1操作。

共享段的回收

包括撤消在進程段表中共享段所對應的表項,執行count:=count-1。

如果count爲0,則由系統回收該共享段的物理內存,並取消共享段表中該段所對應的表項。


③ 分段保護

越界檢查

段表寄存器存放了段表長度;段表中存放了每個段的段長。

在進行存儲訪問時,將段號與段表長度比較,段內地址與段長比較。

存取控制檢查

尤其表現在不同進程對共享段的不同使用上。段表每個表項都設置“存取控制”字段,規定該段的訪問方式:只讀,只執行,讀/寫

環保護機構

規定:低編號的環具有高優先權

遵循的原則:一個程序可以訪問駐留在相同環或較低特權環中的數據。一個程序可以調用駐留在相同環或較高特權環中的服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章