5.2與5.3是重點
5.1 虛擬存儲器概述
前面介紹的各種存儲器管理方式,要求將一個作業全部裝
入內存後方能運行。於是出現了兩種情況:
◼ 有的作業很大,所要求的內存空間超過內存總容量,作業不能
被全部裝入內存,致使該作業無法運行。
◼ 有大量作業要求運行,但內存容量不足以容納所有作業,只能
將少數作業裝入內存使其運行,其他大量作業留在外存上等待。
解決方法:
➢ 從物理上增加內存容量
➢ 從邏輯上擴充內存容量
# 5.1.1 常規存儲器管理方式的特徵和局部性原理
# 1. 常規存儲器管理方式的特徵
◼ 一次性:作業在運行前一次性地全部裝入內存
◼ 駐留性:作業裝入內存後,便一直駐留在內存中,
直至作業運行結束。
問題:一次性及駐留性在程序運行時是否是必須的?
# 2. 程序運行的局部性原理
1968年,Denning.P提出:程序在執行時將呈現出局部性
規律,即在一較短的時間內,程序的執行僅侷限於某個部分;
相應地,它所訪問的存儲空間也侷限於某個區域。
◼ 程序執行時,除了少部分的轉移和過程調用指令外,在大多數
情況下仍是順序執行的。
◼ 過程調用將會使程序的執行軌跡由一部分區域轉至另一部分區
域,但研究表明,過程調用的深度在大多數情況下不超過5。
◼ 程序中存在許多循環結構,由少數指令構成,但會多次執行。
◼ 程序中對許多數據結構的處理,往往都侷限於很小的範圍內。
局部性的表現:
- 時間局部性
- 空間局部性
# 5.1.2 虛擬存儲器的定義和特徵
# 虛擬存儲器的定義(複雜):
基於局部性原理,應用程序在運行前,沒有必要全部裝入內存,僅將當前要運行的部分頁面或段先裝入內存即可運行,其餘部分暫留在外存上。
程序運行時,如果要訪問的頁(段)已調入內存,便可繼續執行;如果尚未調入內存(稱爲缺頁或缺段),此時程序應利用OS所提供的請求調頁(段)功能,將它們調入內存,使程序繼續執行。如果內存已滿,無法再裝入新的頁(段),還必須利用頁(段)的置換功能,將內存中暫時不用的頁(段)調至外存,騰出足夠的內存空間後,再將要訪問的頁(段)調入內存,使程序繼續執行。
# 虛擬存儲器的定義(簡潔):
是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。其邏輯容量由內存容量和外存容量之和所決定,運行速度接近於內存速度,而每位的成本卻接近於外存。
# 特點;
- 多次性:一個作業被分成多次調入內存運行
- 對換性:允許在作業的運行過程中進行換進、換出。
- 虛擬性:能夠從邏輯上擴充內存容量,使用戶所看到的內存容量遠大於實際內存容量。
虛擬性以多次性和對換性爲基礎;
多次性和對換性又必須建立在離散分配的基礎上。
# 5.1.3 虛擬存儲器的實現方法
在虛擬存儲器中,允許將一個作業分多次調入內存。如
果採用連續分配方式,不僅造成內存資源的浪費,而且無法
從邏輯上擴大內存容量。因此,虛擬存儲器的實現都是建立
在離散分配的存儲管理方式的基礎上。
# 1. 分頁請求系統
在分頁系統的基礎上,增加了請求調頁功能和頁面置換功能所形成的頁式虛擬存儲系統。它允許只裝入部分頁面的程序(及數據),便啓動運行。以後再通過調頁功能及頁面置換功能,陸續將即將要運行的頁面調入內存,同時把暫不運行的頁面換出到外存上。置換時以頁面爲單位。
爲實現請求調頁和置換功能,系統必須提供必要的支持:
◼ 硬件支持:
1. ①請求分頁的頁表機制
2. ②缺頁中斷機構
3. ③地址變換機構
◼ 軟件支持:①實現請求調頁的軟件 ②實現頁面置換的軟件
# 2. 請求分段系統
在分段系統的基礎上,增加了請求調段功能和分段置換功能所形成的段式虛擬存儲系統。它允許只裝入若干段的程序(及數據),便啓動運行。以後再通過調段功能及段的置換功能,把暫不運行的段調出,同時調入即將要運行的段。置換時以段爲單位。爲實現請求調段和置換功能,系統必須提供必要的支持:
◼ 硬件支持:
1. ①請求分段的段表機制
2. ②缺段中斷機構
3. ③地址變換機構
◼ 軟件支持:①實現請求調段的軟件 ②實現段的置換的軟件
# 3. 請求段頁式系統,PPT沒有
頁表,作業表,空閒塊
5.2 請求分頁存儲管理方式
請求分頁系統是建立在基本分頁基礎上的,增加了請求調頁功能和頁面置換功能。換入和換出的基本單位都是長度固定的頁面,因而在實現上比請求分段系統簡單。
5.2.1 請求分頁中的硬件支持
# 1. 頁表機制
# 2. 缺頁中斷機構
在請求分頁系統中,每當要訪問的頁面不在內存時,便產生一缺頁中斷,請求OS將所缺之頁調入內存。
==缺頁中斷作爲中斷,同樣需要經歷諸如保護CPU環境、分析中斷原因、轉入缺頁中斷處理程序進行處理、恢復CPU環境等幾個步驟==。但缺頁中斷是一種特殊的中斷,與一般中斷有明顯區別:
◼ 在指令執行期間產生和處理中斷信號。
◼ 一條指令在執行期間,可能產生多次缺頁中斷。
# 3. 地址變換機構
請求分頁系統中的地址變換機構,是在分頁系統地址變換機構的基礎上,再爲實現虛擬存儲器而增加了某些功能而形成的,如產生和處理缺頁中斷,以及從內存中換出一頁的功能等等
5.2.2 請求分頁中的內存分配
爲進程分配內存時,涉及三個問題:
◼ 最小物理塊數的確定
◼ 物理塊的分配策略
◼ 物理塊的分配算法
# 1. 最小物理塊數的確定
最小物理塊數,指能保證進程正常運行所需的最小物理塊數。當系統爲進程分配的物理塊數少於此值時,進程將無法運行.進程應獲得的最小物理塊數與計算機的硬件結構有關,取決於指令的格式、功能和尋址方式。
對於某些簡單機器,若是單地址指令且採用直接尋址方式,最小物理塊數應爲2;如果該機器允許間接尋址,則至少要求3個物理塊。
對於某些功能較強的機器,指令長度可能是兩個或兩個以上字節,至少要爲進程分配6個物理塊。
# 2. 物理塊的分配策略
在請求分頁系統中,可以採取兩種內存分配策略,即固定和可變分配策略。在進行置換時,也可以採取兩種策略,即全局置換和局部置換。於是可以組合出三種適合的策略。
1. 固定分配局部置換
2. 可變分配全局置換
3. 可變分配局部置換
◼ 固定分配局部置換(固定物理塊數)
基於進程的類型,或根據程序員、程序管理員的建議,爲每個進程分配一定數目的物理塊,在整個運行期間不再改變。採用該策略時,如果進程在運行中發現缺頁,只能從該進程在內存中的n個頁面中選出一頁換出,然後再調入一頁。
困難:應爲每個進程分配多少個物理塊難以確定。
◼ 可變分配全局置換(可淘汰其他進程的頁)
在採用這種策略時,先爲系統中的每個進程分配一定數目的物理塊,而OS自身也保持一個空閒的物理塊隊列。如果某進程發生缺頁時,由系統從空閒的物理塊隊列中,取出一個物理塊分配給該進程,並將欲調入的頁裝入其中。
◼ 可變分配局部置換(只能淘汰自己進程的頁)
基於進程的類型,或根據程序員的要求,爲每個進程分配一定數目的物理塊,如果某進程發生缺頁時,只允許從該進程在內存的頁面中選出一頁換出,不會影響其他進程執行。如果進程在運行中頻繁發生缺頁中斷,則系統再爲進程分配若干物理快;如果進程在運行中缺頁率特別低,則適當減少分配給該進程的物理塊。
# 3. 物理塊分配算法
(1) 平均分配算法
(2) 按比例分配算法
(3) 考慮優先權的分配算法
在實際應用中,爲了照顧重要的、急迫的作業儘快完成,應
爲它分配較多的內存空間。
方法:
一部分按比例地分配給各進程;另一部分則根據各進程的優
先權,適當地增加其相應份額後,分配給各進程。
5.2.3 頁面調入策略
# 1. 何時調入頁面
1)預調頁策略
採用以預測爲基礎的預調頁策略,將那些預計在不久之後便會被訪問的頁面,預先調入內存。
主要用於進程的首次調入時,由程序員指出應該先調入哪些頁。
2)請求調頁策略
當程序在運行中需要訪問某部分程序和數據時,若發現其所在的頁面不在內存,便立即提出請求,由OS將其所需要的頁面調入內存。
優點:由請求調頁策略所確定調入的頁,一定會被訪問;請求調頁策略比較容易實現。
缺點:每次僅調入一頁,需花費較大的系統開銷,增加了磁盤I/O的啓動頻率。
# 2. 從何處調入頁面
在請求分頁系統中的外存分爲文件區和對換區。
每當發生缺頁時,系統應從何處將缺頁調入內存,可分爲:
- ➢ 系統擁有足夠的對換區空間:可以全部從對換區調入所需頁面,
以提高調頁速度。 - ➢ 系統缺少足夠的對換區空間:凡不會被修改的文件,直接從文件區調入;換出時不用換,再調入時仍從文件區調入。可能被修改的部分,換出時需調到對換區,換入時從對換區調入。
- ➢ UNIX方式:與進程有關的文件放在文件區,故未運行的頁面應從文件區調入。曾經運行但又被換出的頁面被放在對換區,下次調入應從對換區調入。進程請求的共享頁面可能已被其他進程調入,無需再從對換區調入。
# 3. 頁面調入過程(算法)
(1)每當程序所要訪問的頁面未在內存時,便向CPU發出一缺頁中斷,中斷處理程序首先保護CPU環境,分析中斷原因後,轉入缺頁中斷處理程序。
(2)該程序通過查找頁表,得到該頁在外存上的物理塊後,如果此時內存能容納新頁,則啓動磁盤I/O將所缺之頁調入內存,然後修改頁表。
(3)如果內存已滿,則需按照某種置換算法從內存中選出一頁準備換出;如果該頁未被修改過,可不必寫回磁盤;但如果此頁已被修改,則必須將它寫回磁盤,然後把所缺的頁調入內存,並修改頁表中的相應表項,置其存在位爲“1”,並將此頁表項寫入快表。
(4)在缺頁調入內存後,利用修改後的頁表,形成所要訪問的
物理地址,再去訪問內存數據。
5.3 頁面置換算法
在進程運行過程中,若其訪問的頁面不在內存而需將其調入,但內存已無空閒空間時,需從內存中調出一頁程序或數據,送入磁盤的對換區。但應將哪個頁面調出,需根據一定的算法來確定。把選擇換出頁面的算法稱爲頁面置換算法,其好壞直接影響系統的性能。
一個好的置換算法應具有較低的頁面更換頻率。從理論上講,應將那些以後不會再訪問的頁面換出,或者把那些在較長時間內不會再訪問的頁面換出。
設作業執行中訪問頁面的總次數爲A,其中有F次訪問的頁面尚未裝入主存,故產生了F次缺頁中斷。現定義缺頁中斷率爲:
f=F/A
5.3.1 最佳置換算法和先進先出置換算法
最佳置換算法是一種理想化的算法,具有最好的性能,但難於實現。先進先出置換算法最直觀,但可能性能最差,故應用極少。
# 1. 最佳置換算法(無法實現)
其所選擇的被淘汰頁面,將是以後永不再用的,或許是在最長(未來)時間內不再被訪問的頁面。
優點:保證獲得 最低 的缺頁率
缺點:無法預知一個進程在內存的若干個頁面,哪個在未來最長時間內不再被訪問。
算法無法實現,但可評價其他算法。
設作業分配3個物理塊,開始3頁不算缺頁(後面算法同)。則
#2. 先進先出置換算法
算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。
算法實現簡單,只需把一個進程已調入內存的頁面,按先後次序鏈接成一個隊列,並設置一個指針(替換指針),使它總是指向最老的頁。
算法與進程的實際運行規律不相適應,因爲進程中的某些頁面經常被訪問,但先進先出置換算法不能保證這些頁面不被淘汰。
5.3.2 最近最久未使用(LRU)算法
# 1. LRU置換算法的描述
算法根據頁面調入內存後的使用情況進行決策。由於無法預測各頁面將來的使用情況,只能 利用“最近的過去”作爲“最近的將來”的近似 ,因此,LRU置換算法是選擇最近最久未使用的頁面予以淘汰。
該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當需淘汰一個頁面時,選擇現有頁面中其t值最大的,即最近最久未使用的頁面予以淘汰
最佳置換算法是從“向後看”的觀點出發的,即它是根據以後各頁的使用情況;而LRU算法則是“向前看”的,即根據各頁以前的使用情況來判斷,而頁面過去和未來的走向之間並無必然的聯繫。
# 2. LRU置換算法的硬件支持(實現)
LRU置換算法雖然較好,但需較多的硬件支持,爲了瞭解一個進程在內存中的各個頁面各有多少時間未被進程訪問,以及如何快速地知道哪一頁是最近最久未使用的頁面,需有以下兩類硬件之一的支持:
➢ 寄存器(成本大)
➢ 棧
1)寄存器
爲每個在內存中的頁面配置一個移位寄存器,用來記錄某進程在內存中各頁的使用情況。移位寄存器表示爲
R=Rn-1Rn-2Rn-3…R2R1R0
當進程訪問某物理塊時,要將相應寄存器的Rn-1位置成1。此時,定時信號將每隔一定時間將寄存器右移一位。如果把n位寄存器的數看作一個整數,那麼具有最小數值的寄存器所對應的頁面,就是最近最久未使用的頁面。
2)棧
利用一個特殊的棧來保存當前使用的各個頁面的頁面號。每當進程訪問某頁面時,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,而棧底則是最近最久未使用頁面的頁面號。
5.3.3 Clock置換算法
5.3.4 頁面緩衝算法
- 最少使用置換算法LFU(Least Frequently Used)
選擇到當前時間爲止被訪問次數最少的頁面被置換;
◼ 基本方法
記錄每個頁面的訪問次數,最少訪問的頁面首先考慮淘汰。
◼ 實際採取方法
爲頁面設置移位寄存器。
與LRU的區別:R1=10000000
R2=01110100
LRU----------淘汰R2
LFU----------淘汰R1
2.頁面緩衝算法(Page Buffering Algorithm)
是對FIFO算法的發展,通過被置換頁面的緩衝,有機會找回剛
被置換的頁面;該算法在頁面分配時,採用可變分配和局部置
換的方式。
被置換頁面的選擇和處理:用FIFO算法選擇被置換頁,把被置
換的頁面放入兩個鏈表之一。
➢ 如果頁面未被修改,就將其歸入到空閒頁面鏈表的末尾
➢ 否則將其歸入到已修改頁面鏈表。
2.頁面緩衝算法(Page Buffering Algorithm)
- 最少使用置換算法LFU(Least Frequently Used)
需要調入新的物理頁面時,將新頁面內容讀入到空閒頁面鏈表
的第一項所指的頁面,然後將第一項刪除。
空閒頁面和已修改頁面,仍停留在內存中一段時間,如果這些
頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作爲
進程的內存頁。
當已修改頁面達到一定數目後,再將它們一起調出到外存,然
後將它們歸入空閒頁面鏈表,這樣能大大減少I/O操作的次數。
在請求頁式存儲管理系統中,計算EAT。
分爲如下兩種情況:
- 被訪問的頁面不在快表中(快表未命中)
(1) 頁面在內存中
(2) 頁面不在內存中 - 被訪問的頁面在快表中 (快表命中)
設系統缺頁率爲f,快表命中率爲a;查找快表的時間爲λ,訪
問實際內存的時間爲t,缺頁中斷處理時間爲ε。請計算EAT。
5.4 “抖動”與工作集
請求分頁式虛擬存儲器系統在正常運行情況下,能有效地
減少內存碎片,提高處理機的利用率和吞吐量。 但如果在系統
中運行的進程太多,進程在運行中會頻繁地發生缺頁情況,這
又會對系統的性能產生很大的影響。
多道程序度與“抖動”
隨着進程數目的增加,處理機利用率趨於0時是系統中已發
生了“抖動”。
產生“抖動”的原因是同時在系統中運行的進程太多,而
分配給每一個進程的物理塊太少,不能滿足進程正常運行的基
本要求,致使每個進程在運行時,頻繁的出現缺頁,必須請求
系統將所缺之頁調入內存。
工作集
是指在某段時間間隔 裏,進程實際所要訪問頁面的集合。
5.5 請求分段存儲管理方式
在請求分段系統中,程序運行之前,只需先調入若干個分
段(不必調入所有的分段),便可啓動運行。當所訪問的段不在
內存中時,可請求OS將所缺的段調入內存。
5.5.1 請求分段中的硬件支持
- 段表機制
在請求分段系統中所需要的主要數據結構是段表。由於在
應用程序的許多段中,只有一部分段裝入內存,其餘的一些段
仍留在外存上,故需在段表中增加若干項,以供程序在調進、
調出時參考。
請求分段系統中的段表項:
(1) 存取方式 :用於標識本分段的存取屬性。
(2) 訪問字段A :用於記錄本段被訪問的頻繁程度。
(3) 修改位M :表示該段在調入內存後是否被修改過。
(4) 存在位(狀態位)P :指示該段是否已調入內存。
(5) 增補位 :用於表示該段在運行中是否做過動態增長。
(6) 外存地址:用於指出該段在外存上的起始地址(盤塊號)。
-
缺段中斷機構
在請求分段系統中,每當發現運行進程所要訪問的段尚未調
入內存時,便由缺段中斷機構產生一缺段中斷信號,進入OS後
由缺段中斷處理程序將所需的段調入內存。缺段中斷同樣需要
在一條指令的執行期間,產生和處理中斷,以及在一條指令執
行期間,可能產生多次缺段中斷。但不會出現一條指令被分割
在兩個分段中或一組信息被分割在兩個分段中的情況。 -
地址變換機構
請求分段系統中的地址變換機構,是在分段系統地址變換機構
的基礎上形成的。因爲被訪問的段並非全在內存,因而在地址變
換時,若發現要訪問的段不在內存,必須先將所缺的段調入內存,
並修改段表,然後才能利用段表進行地址變換。在地址變換機構
中需增加缺段中斷的處理及請求等功能。
5.5.2 分段的共享和保護
- 共享段表
爲了實現共享,可在內存中配置一張共享段表,所有各共享段都在共享段表中佔有一表項。
(1) 共享計數count:共享段爲多個進程所需要,當某進程不再需要它而釋放它時,系統並不回收該段所佔內存區,僅當所有共享該段的進程全都不再需要它時,才由系統回收該段所佔內存區。設置count用於記錄有多少個進程需要共享該分段。
(2) 存取控制字段:對於一個共享段,應給不同的進程以不同的存取權限。
(3) 段號:對於一個共享段,不同的進程可以各用不同的段號去共享該段。
- 共享段的分享與回收
- 共享段的分配
爲共享段分配內存時,對第一個請求使用該共享段的進程,由
系統爲該共享段分配一物理區,再把共享段調入該區,同時將該區
的始址填入請求進程的段表的相應項中,還須在共享段表中增加一
表項,填寫有關數據,把count置爲1;之後,當又有其他進程需要
調用該共享段時,無需再爲該段分配內存,只需在調用進程的段表
中,增加一表項,填寫該共享段的物理地址;在共享段的段表中,
填上調用進程的進程名、存取控制等,再執行count:=count+1操
作。
- 共享段表
- 共享段的回收
當共享該段的進程不再需要該段時,應將該段釋放,包括撤消
在該進程段表中共享段所對應的表項,以及執行count:=count-1操
作。如果結果爲0,則需由系統回收該共享段的物理內存,以及取
消在共享段表中該段所對應的表項,否則只取消調用者進程在共享
段表中的有關記錄。
- 分段保護
1)越界檢查
段表寄存器存放了段表長度;段表中存放了每個段的段長。
在進行存儲訪問時,將段號與段表長度比較,段內地址與段長比
較。 - 共享段表
- 共享段的分享與回收
2)存取控制檢查
段表中的每個表項都設置了“存取控制”字段,用於規定
該段的訪問方式: 只讀; 只執行; 讀/寫
3)環保護機構
規定:低編號的環具有高優先權
遵循的原則:
➢ 一個程序可以訪問駐留在相同環或較低特權環中的數據。
➢ 一個程序可以調用駐留在相同環或較高特權環中的服務。