1. 程式人生 > >第四章 虛擬儲存器

第四章 虛擬儲存器

                                                         第5章    虛擬儲存器
                                                         邏輯上擴充記憶體

1虛擬儲存器的基本概念
引入、實現、特徵
2請求分頁儲存管理方式
硬體支援、地址變換、分配演算法
頁面置換演算法
效能分析
3請求分段儲存管理方式

  1. 虛擬儲存器的基本概念
    分析常規儲存器管理不足的原因:
    1)常規儲存器管理方式的特徵
    一次性:作業在執行前一次性地全部裝入記憶體
    駐留性:作業裝入記憶體後,便一直駐留在記憶體中,直至作業執行結束。
    :一次性及駐留性在程式執行時是否是必須的?
    NO。程式執行有區域性性。
    2)區域性性原理
    1968年,Denning.P提出
    程式在執行時將呈現出區域性性規律:
    在一較短的時間內
    程式的執行僅侷限於某個部分;
    相應地,所訪問的儲存空間也侷限於某個區域。

程式執行的特點:
多數情況下仍是順序執行。
少部分的轉移和過程呼叫指令會使程式執行由一部分割槽域轉至另一部分割槽域(但研究表明呼叫深度多數情況下不超過5)
許多由少數指令構成的迴圈結構會多次執行。
對許多資料結構的處理(如陣列)往往侷限於很小的範圍內。
所有上述情況都表現出程式執行的區域性性:
時間區域性性(temporal locality)
被引用過一次的儲存器位置很可能在不遠的將來再被多次引用。
空間區域性性(spatial locality)
如果一個儲存器位置被引用了一次,那麼程式很可能在不遠的將來引用附近的一個儲存器位置。

關於區域性性的討論
有良好區域性性的程式執行速度更快;
計算機系統的各個層次都利用了局部性:
Cache;
主存:快取磁碟檔案系統最近使用的磁碟塊;
Web瀏覽器將最近被引用的文件放在本地磁碟上;
Web伺服器將最近被請求的文件放在前端磁碟快取記憶體中

重複引用同一個變數的程式有良好的時間區域性性;

對於使用陣列等資料結構的程式,a[1],a[2]……資料的使用可看做具有步長k=1的引用模式,步長越小,空間區域性性越好;陣列按行訪問和按列訪問其區域性性不同。

對於取指令來說,迴圈有好的時間和空間區域性性;

迴圈體越小,迴圈迭代次數越多,區域性性越好。

基於區域性性原理
程式執行前,不需全部裝入記憶體(打破一次性)
僅裝入當前要執行的部分頁面或段即可執行,其餘部分暫留在外存上。
缺頁/段的情況:要訪問的頁(段) 尚未調入記憶體。程式應利用OS所提供的請求調頁(段)功能,將它們調入記憶體,使程式繼續執行。
調入需要的頁/段時,如果記憶體已滿,無法再裝入新頁(段),通過置換功能將記憶體中暫時不用的頁(段)調至外存,騰出足夠的記憶體空間。(不總駐留)

交換技術與虛存使用的調入調出技術有何相同和不同之處?
主要相同點是都要在記憶體與外存之間交換資訊;
主要區別在於交換技術換出換進一般是整個程序(proc結構和共享正文段除外),因此一個程序的大小受物理儲存器的限制;
而虛存中使用的調入調出技術在記憶體與外存之間來回傳遞的是儲存頁或儲存段,而不是整個程序,從而使得程序對映具有了更大的靈活性,且允許程序的大小比可用的物理儲存空間大的多 。

總之:
為了用小的記憶體實現在大的虛空間中程式的執行目的
基於區域性性原理
虛擬儲存器管理——由作業系統提供一個比實際記憶體大的,假想的特大儲存器。

3)虛擬儲存器的定義

所謂“虛擬儲存器”,是指具有請求調入功能和置換功能,能從邏輯上對記憶體容量加以擴充的一種儲存器系統。
虛擬儲存管理下
記憶體邏輯容量由記憶體容量和外存容量之和所決定
執行速度接近於記憶體速度
每位的成本卻接近於外存。

4)虛擬儲存器的實現

虛擬儲存管理:
允許將一個作業分多次調入記憶體。
若採用連續分配方式,需申請足夠空間,再分多次裝入,造成記憶體資源浪費,並不能從邏輯上擴大記憶體容量。
虛擬的實現建立在離散分配儲存管理基礎上
方式:請求分頁/請求分段系統
細節:分頁/段機構、中斷機構、地址變換機構、軟體支援

5)虛擬儲存器的特徵
離散分配方式是基礎
多次性:一個作業被分成多次調入記憶體執行
對換性:允許在作業的執行過程中進行換進、換出。(程序整體對換不算虛擬)
最終體現虛擬性:能夠從邏輯上擴充記憶體容量,使使用者所看到的記憶體容量遠大於實際記憶體容量。
在這裡插入圖片描述
2. 請求分頁儲存管理方式
基本分頁 + “請求調頁”和“頁面置換”功能。
換入和換出基本單位都是長度固定的頁面
1)硬體支援
一臺具有一定容量的內/外存的計算機

  • 頁表機制
  • 缺頁中斷機構
  • 地址轉換機構
    ①頁表基本功能不變:邏輯地址對映為實體地址
    增加虛擬功能後需記錄的頁表項資訊有變化:
    在這裡插入圖片描述
    (1) 狀態位P :指示該頁是否已調入記憶體。
    (2) 訪問欄位A :用於記錄本頁在一段時間內被訪問的次數,或記錄本頁最近已有多長時間未被訪問。(置換時考量的引數)
    (3) 修改位M :該頁在調入記憶體後是否被修改過。(關係到置換時調出的具體操作)
    (4) 外存地址:用於指出該頁在外存上的地址。

②缺頁中斷機構
每當要訪問的頁面不在記憶體時,便產生一缺頁中斷通知OS,OS則將所缺之頁調入記憶體。作為中斷,需經歷幾個步驟:
“保護CPU環境”
“分析中斷原因”
“轉入缺頁中斷處理程式”
“恢復CPU環境”等。
作為一種特殊中斷,與一般中斷有明顯區別:
(1) 在指令執行期間產生和處理中斷訊號。
(2) 一條指令在執行期間,可能產生多次缺頁中斷。

③地址變換機構
分頁系統地址變換機構的基礎上增加
產生和處理缺頁中斷(請求調入)
從記憶體中換出一頁的功能(置換)
在這裡插入圖片描述
在這裡插入圖片描述
2)記憶體分配
作業不一次裝入,部分裝入的情況下如何為程序分配記憶體,涉及三個問題:
最小物理塊數的確定
少於此數量程序將不能執行
與計算機的硬體結構有關,取決於指令的格式、功能和定址方式
物理塊的分配策略
物理塊的分配演算法

②物理塊的分配策略
考慮:固定OR可變分配、全域性OR區域性置換。
組合出三種適合的策略。
固定分配、區域性置換
為每個程序分配一定數目的物理塊,在整個執行期間不再改變(基於程序的型別,或根據程式設計師、程式管理員的建議)
執行中缺頁時,只能從該程序記憶體中n個頁面中選出一頁換出,然後再調入一頁。
困難:難以把握為每個程序分配“適量”物理塊數
在這裡插入圖片描述
可變分配、全域性置換
先為每個程序分配一定數目的物理塊
OS管理一個空閒物理塊佇列,發生缺頁時,系統從佇列中取出一塊分配給該程序,將欲調入的頁裝入(動態增長型,全域性空閒空間都可分配使用)
空閒空間不足時,可與其他任何程序頁面置換。“會使其他程序缺頁率提高,影響執行”
最易實現
在這裡插入圖片描述
為每個程序分配一定數目的物理塊
缺頁時,只允許換出該程序在記憶體的頁面,不影響其他程序執行。
根據缺頁率增減程序的物理塊數:若頻繁缺頁中斷,則系統再為程序分配若干物理快;若缺頁率特別低,則適當減少分配給該程序的物理塊。
在這裡插入圖片描述
③物理塊的分配演算法
固定分配策略時,分配物理塊可採用以下幾種演算法:
平均分配演算法
將所有可供分配的物理塊平均分配給各程序。
缺點:未考慮各程序本身的大小,利用率不均。
按比例分配演算法
根據程序的大小按比例分配物理塊。
設系統中共有n個程序
則,每個程序能分到的物理塊數:
在這裡插入圖片描述
Si:程序i頁面數為;
S:n個程序頁面數總和;
m:可用物理塊總數
在這裡插入圖片描述
考慮優先權的分配演算法
實際應用中,要照顧重要、急迫的作業儘快完成,為它分配較多的記憶體空間。
所有可用物理塊分兩部分:
一部分按比例分配給各程序;
另一部分根據各程序優先權,適當地為其增加份額,分配給各程序。

3)調頁策略
① 何時調入頁面
預調頁策略
以預測為基礎,將預計不久後便會被訪問的若干頁面,預先調入記憶體。
優點:一次調入若干頁,效率較好
缺點:預測不一定準確,預調入的頁面可能根本不被執行到。主要用於程序的首次調入,由程式設計師指出應該先調入哪些頁。

請求調頁策略
執行中需要的頁面不在記憶體,便立即提出請求,由OS將其調入記憶體。
優點:由請求調頁策略所確定調入的頁,一定會被訪問;比較容易實現。
缺點:每次僅調入一頁,需花費較大的系統開銷,增加了磁碟I/O的啟動頻率。

② 從何處調入頁面
在請求分頁系統中的外存分為:
對換區:連續存放資料,讀寫速度較快
檔案區:離散分配方式,I/O速度相對慢
發生缺頁時,系統應從何處將缺頁調入記憶體,分成三種情況:
系統擁有足夠的對換區空間:
程序執行前所有頁面由檔案區拷貝到對換區;
執行需要的頁面全部從對換區調入記憶體,提高調頁速度。
系統缺少足夠的對換區空間:
不會被修改的部分,在檔案區操作(即:直接從檔案區調入,換出時不用寫入檔案,再調入時仍從檔案區調入)
可能被修改的部分,在對換區操作。
UNIX方式:(隨執行資料逐漸從檔案區轉到對換區)
未執行的頁面從檔案區調入;
曾經執行,但又被換出的頁面放在對換區,下次調入應從對換區調入。
程序請求的共享頁面可能已被其他程序調入,無需再從對換區調入。

外存:檔案區、對換區
系統擁有足夠的對換區空間:對換區
系統缺少足夠的對換區空間:檔案區/對換區
UNIX方式:首次->檔案區/再請調->對換區

③ 頁面調入過程
程式執行前需要裝入記憶體:上述的②步策略處理何處調入;
開始執行:先預調入一部分頁面;
執行中:需要的頁面不在記憶體時,
向CPU發出一缺頁中斷,“中斷處理程式”開始工作:
首先保留CPU環境
分析中斷原因後,轉入缺頁中斷處理程式。
處理:判斷是否置換、頁表資訊更新
恢復現場,重新操作頁面。

3.頁面置換演算法
程序執行過程中,訪問的頁面不在記憶體,調入時記憶體已無空閒空間,需要將記憶體中的一頁程式或資料調到外存。
頁面置換演算法(page replacement algorithms):選擇換出哪些頁面的演算法,其好壞直接影響系統的效能。
應具有較低的缺頁率:
頁面調入次數(缺頁次數)
/
總的頁面使用次數

最佳Optimal置換演算法
先進先出FIFO置換演算法
最近最久未使用(LRU)置換演算法
CLOCK置換演算法
其他

1)最佳(Optimal)置換演算法
Belady,1966年提出的一種理論上的演算法
換出以後永不再用的,或在最長(未來)時間內不再被訪問的頁面。
優點:保證獲得最低的缺頁率
不足:無法實現,因為無法預知一程序將來的執行情況
作用:作為參照標準,評價其他演算法
在這裡插入圖片描述
2)先進先出置換演算法(FIFO)
先進入的先淘汰,即選擇記憶體中駐留時間最久的頁面予以淘汰。
優點:實現簡單,把一程序已調入記憶體的頁面按先後次序組織成一個佇列,並設定一個指標(替換指標),使它總是指向隊首最老的頁面。
不足:與程序實際執行規律不相適應(較早調入的頁往往是經常被訪問的頁,頻繁被對換造成執行效能降低)

在這裡插入圖片描述
Belady 現象
Belady現象:出現分配的頁面數增多,缺頁率反而提高的異常現象。
描述:一個程序P要訪問M個頁,OS分配N個記憶體頁面給程序P;對一個訪問序列S,發生缺頁次數為PE(S,N)。當N增大時,PE(S, N)時而增大,時而減小。
Belady現象的原因:FIFO演算法的置換特徵與程序訪問記憶體的動態特徵矛盾,即被置換的頁面並不是程序不會訪問的
在這裡插入圖片描述
3)最近最久未使用(LRU)置換演算法
無法預測將來的使用情況,只能利用“最近的過去”作為“最近的將來”的近似,因此,LRU置換演算法選擇最近最久未使用(least recently used)的頁面予以淘汰。
對例1用LRU演算法計算:
在這裡插入圖片描述
不足:
有時頁面過去和未來的走向之間並無必然的聯絡。
相應的需較多的硬體支援:記錄每個頁面自上次被訪問以來所經歷的時間t,淘汰時選擇頁面t值最大的;以及需要快速地知道哪一頁是最近最久未使用的頁面,用暫存器或棧。
①暫存器記錄時間的原理
一程序有8個頁面,每個頁面需配備一個8位的(移位)暫存器。
移位暫存器表示為
R=Rn-1Rn-2Rn-3…R2R1R0
頁面被訪問後的操作:
將該頁對應的暫存器的Rn-1位置為1
如何記時:
由系統發出定時訊號,每隔一定時間將所有暫存器右移1位。
某一時刻,比較各暫存器的值,被用到的標誌1逐漸往低位上積累,若高位上沒有1,就說明最近沒用過。所以最近最久未使用的就是暫存器值最小的那個頁。
在這裡插入圖片描述
②棧記錄時間的原理
某頁面被訪問,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此:棧頂始終是最新被訪問頁面的編號,越久未使用,頁面越被壓在棧底。
在這裡插入圖片描述
4)輪轉演算法(clock) 又稱最近未使用演算法(NRU, Not Recently Used),
LRU(最近最久未使用演算法)近似演算法
折衷FIFO
每個頁設一個使用標誌位(use bit),若該頁被訪問則將其置為1。
設定一個指標,從當前指標位置開始按地址先後檢查各頁,尋找use bit=0的頁面作為被置換頁。
若指標經過的頁use bit=1,修改use bit=0(暫不凋出,給被用過的頁面駐留的機會 ),指標繼續向下。到所有頁面末尾後再返回隊首檢查。

在這裡插入圖片描述
改進CLOCK
改進:主要考慮對沒訪問過的頁面再細分是否修改過的不同情況,減少因修改造成的頻繁I/O操作。
每頁除記錄是否用過A,還記錄是否修改的標誌M。置換時根據兩個標誌的值有4種不同情況的處理。
在這裡插入圖片描述
在這裡插入圖片描述
5)其他置換演算法
最少使用 (LFU, Least Frequently Used)
關鍵在次數記錄上
每頁設定訪問計數器,每當頁面被訪問時,該頁面的訪問計數器加1;缺頁中斷時,淘汰計數值最小的頁面,並將所有計數清零;
計數的實現類似LRU,用移位暫存器,但比較時不是簡單比較暫存器的值,而是比較暫存器每位的和∑Ri。
LRU與LFU
1000101
0001111
LFU置換次數少的。程式區域性性會導致一個頁面在一段時間內使用次數很多。但使用次數多並不能說明將來被用到的可能性大
而LRU置換最近最久未用的,對未來的預計一般會更好些。
所有,LRU相對得到較好的應用。

頁面緩衝演算法PBA(page buffering algorithm)
對FIFO演算法的發展,彌補了FIFO可能造成的I/O開銷,又不需要LRU等演算法的硬體支援。
仍用FIFO演算法選擇被置換頁
但並不將其馬上換入外存。
系統將頁面放入兩個連結串列之一:如果頁面未被修改,就將其歸入到空閒頁面連結串列的末尾;否則將其歸入到已修改頁面連結串列。
需要調入新的物理頁面時,將新頁面內容讀入到空閒頁面連結串列的第一項所指的頁面,然後將第一項刪除(從空閒連結串列摘下)。
空閒頁面和已修改頁面,仍停留在記憶體中一段時間,如果這些頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作為程序的記憶體頁。
當已修改頁面達到一定數目後,再將它們一起調出到外存,然後將它們歸入空閒頁面連結串列,這樣能大大減少I/O操作的次數。

多道程式度與處理機利用率
抖動 工作集 駐留集

4.請求分段儲存管理方式
在請求分段系統中,程式執行之前,只需先調入若干個分段(不必調入所有的分段),便可啟動執行。當所訪問的段不在記憶體中時,可請求OS將所缺的段調入記憶體。
1)請求分段中的硬體支援
段表機制
缺段中斷機構
地址變換機構

①段表機制
在這裡插入圖片描述
(1) 存取方式 :用於標識本分段的存取屬性。R,R/W,W
(2) 訪問欄位A :用於記錄本段被訪問的頻繁程度。
(3) 修改位M :表示該段在調入記憶體後是否被修改過
(4) 存在狀態位P :指示該段是否已調入記憶體。
(5) 增補位 :特有欄位,表示該段執行中是否做過動態增長
(6) 外存地址:用於指出該段在外存上的起始地址(盤塊號)。

②缺段中斷機構
發現執行程序所訪問段尚未調入記憶體
由缺段中斷機構產生一缺段中斷訊號
進入OS,由缺段中斷處理程式將所需的段調入記憶體。
缺段中斷同樣在一條指令的執行期間產生和處理中斷,一條指令執行可能產生多次缺段中斷。但不會出現一條指令被分割在兩個分段中或一組資訊被分割在兩個分段中的情況。
③ 地址變換機構
基於分段系統地址變換機構的基礎
段調入記憶體
修改段表
再利用段表進行地址變換。
總之:就是增加了缺段中斷的請求及處理等功能

2)分段的共享和保護
分段在邏輯意義上劃分,實現共享和保護都較方便。以下討論具體實現:
①實現共享:共享段表
在記憶體中配置一張共享段表,每個共享段都佔有一表項,記錄如下內容:
共享計數count:
共享段為多個程序所需要,當某程序不再需要它而釋放它時,系統並不回收該段所佔記憶體區,僅當所有共享該段的程序全都不再需要它時,才由系統回收該段所佔記憶體區。設定count用於記錄有多少個程序需要共享該分段。
在這裡插入圖片描述
② 共享段如何分享與回收
共享段的分配
第一個請求使用該共享段的程序A:系統為該共享段分配一物理區,再把共享段裝入該區;
將該區的始址填入A的段表相應項;
共享段表中增加一表項,填寫有關資料,count置1;
其他程序B也呼叫該共享段時,無需再為該段分配記憶體,只需在B的段表中增加一表項,填寫該共享段的實體地址;在共享段的段表中,填上呼叫程序的程序名、存取控制等,再執行count:=count+1操作。
共享段的回收
包括撤消在程序段表中共享段所對應的表項,執行count:=count-1。
如果count為0,則由系統回收該共享段的實體記憶體,並取消共享段表中該段所對應的表項。

③ 分段保護
越界檢查
段表暫存器存放了段表長度;段表中存放了每個段的段長。
在進行儲存訪問時,將段號與段表長度比較,段內地址與段長比較。
存取控制檢查
尤其表現在不同程序對共享段的不同使用上。段表每個表項都設定“存取控制”欄位,規定該段的訪問方式:只讀,只執行,讀/寫
環保護機構
規定:低編號的環具有高優先權
遵循的原則:一個程式可以訪問駐留在相同環或較低特權環中的資料。一個程式可以呼叫駐留在相同環或較高特權環中的服務