第五章 虛擬存儲器,請求頁式管理

5.2與5.3是重點


5.1 虛擬存儲器概述

前面介紹的各種存儲器管理方式,要求將一個作業全部裝
入內存後方能運行。於是出現了兩種情況:
◼ 有的作業很大,所要求的內存空間超過內存總容量,作業不能
被全部裝入內存,致使該作業無法運行。
◼ 有大量作業要求運行,但內存容量不足以容納所有作業,只能
將少數作業裝入內存使其運行,其他大量作業留在外存上等待。
解決方法:
➢ 從物理上增加內存容量
➢ 從邏輯上擴充內存容量

# 5.1.1 常規存儲器管理方式的特徵和局部性原理

# 1. 常規存儲器管理方式的特徵

◼ 一次性:作業在運行前一次性地全部裝入內存
◼ 駐留性:作業裝入內存後,便一直駐留在內存中,
直至作業運行結束。
問題:一次性及駐留性在程序運行時是否是必須的?

# 2. 程序運行的局部性原理

1968年,Denning.P提出:程序在執行時將呈現出局部性
規律,即在一較短的時間內,程序的執行僅侷限於某個部分;
相應地,它所訪問的存儲空間也侷限於某個區域。

◼ 程序執行時,除了少部分的轉移和過程調用指令外,在大多數
情況下仍是順序執行的。

◼ 過程調用將會使程序的執行軌跡由一部分區域轉至另一部分區
域,但研究表明,過程調用的深度在大多數情況下不超過5。

◼ 程序中存在許多循環結構,由少數指令構成,但會多次執行。

◼ 程序中對許多數據結構的處理,往往都侷限於很小的範圍內。

局部性的表現:

  1. 時間局部性
  2. 空間局部性

# 5.1.2 虛擬存儲器的定義和特徵

# 虛擬存儲器的定義(複雜):

基於局部性原理,應用程序在運行前,沒有必要全部裝入內存,僅將當前要運行的部分頁面或段先裝入內存即可運行,其餘部分暫留在外存上。

程序運行時,如果要訪問的頁(段)已調入內存,便可繼續執行;如果尚未調入內存(稱爲缺頁或缺段),此時程序應利用OS所提供的請求調頁(段)功能,將它們調入內存,使程序繼續執行。如果內存已滿,無法再裝入新的頁(段),還必須利用頁(段)的置換功能,將內存中暫時不用的頁(段)調至外存,騰出足夠的內存空間後,再將要訪問的頁(段)調入內存,使程序繼續執行。

# 虛擬存儲器的定義(簡潔):

是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。其邏輯容量由內存容量和外存容量之和所決定,運行速度接近於內存速度,而每位的成本卻接近於外存。

# 特點;
  1. 多次性:一個作業被分成多次調入內存運行
  2. 對換性:允許在作業的運行過程中進行換進、換出。
  3. 虛擬性:能夠從邏輯上擴充內存容量,使用戶所看到的內存容量遠大於實際內存容量。

虛擬性以多次性和對換性爲基礎;

多次性和對換性又必須建立在離散分配的基礎上。

# 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. 從何處調入頁面

在請求分頁系統中的外存分爲文件區和對換區。
每當發生缺頁時,系統應從何處將缺頁調入內存,可分爲:

  1. ➢ 系統擁有足夠的對換區空間:可以全部從對換區調入所需頁面,
    以提高調頁速度。
  2. ➢ 系統缺少足夠的對換區空間:凡不會被修改的文件,直接從文件區調入;換出時不用換,再調入時仍從文件區調入。可能被修改的部分,換出時需調到對換區,換入時從對換區調入。
  3. ➢ 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 頁面緩衝算法

  1. 最少使用置換算法LFU(Least Frequently Used)
    選擇到當前時間爲止被訪問次數最少的頁面被置換;
    ◼ 基本方法
    記錄每個頁面的訪問次數,最少訪問的頁面首先考慮淘汰。
    ◼ 實際採取方法
    爲頁面設置移位寄存器。
    與LRU的區別:R1=10000000
    R2=01110100
    LRU----------淘汰R2
    LFU----------淘汰R1

2.頁面緩衝算法(Page Buffering Algorithm)
是對FIFO算法的發展,通過被置換頁面的緩衝,有機會找回剛
被置換的頁面;該算法在頁面分配時,採用可變分配和局部置
換的方式。
被置換頁面的選擇和處理:用FIFO算法選擇被置換頁,把被置
換的頁面放入兩個鏈表之一。
➢ 如果頁面未被修改,就將其歸入到空閒頁面鏈表的末尾
➢ 否則將其歸入到已修改頁面鏈表。
2.頁面緩衝算法(Page Buffering Algorithm)

  1. 最少使用置換算法LFU(Least Frequently Used)

需要調入新的物理頁面時,將新頁面內容讀入到空閒頁面鏈表
的第一項所指的頁面,然後將第一項刪除。
空閒頁面和已修改頁面,仍停留在內存中一段時間,如果這些
頁面被再次訪問,只需較小開銷,而被訪問的頁面可以返還作爲
進程的內存頁。
當已修改頁面達到一定數目後,再將它們一起調出到外存,然
後將它們歸入空閒頁面鏈表,這樣能大大減少I/O操作的次數。

在請求頁式存儲管理系統中,計算EAT。
分爲如下兩種情況:

  1. 被訪問的頁面不在快表中(快表未命中)
    (1) 頁面在內存中
    (2) 頁面不在內存中
  2. 被訪問的頁面在快表中 (快表命中)
    設系統缺頁率爲f,快表命中率爲a;查找快表的時間爲λ,訪
    問實際內存的時間爲t,缺頁中斷處理時間爲ε。請計算EAT。
    在這裏插入圖片描述

在這裏插入圖片描述


5.4 “抖動”與工作集

請求分頁式虛擬存儲器系統在正常運行情況下,能有效地
減少內存碎片,提高處理機的利用率和吞吐量。 但如果在系統
中運行的進程太多,進程在運行中會頻繁地發生缺頁情況,這
又會對系統的性能產生很大的影響。
多道程序度與“抖動”
隨着進程數目的增加,處理機利用率趨於0時是系統中已發
生了“抖動”。
產生“抖動”的原因是同時在系統中運行的進程太多,而
分配給每一個進程的物理塊太少,不能滿足進程正常運行的基
本要求,致使每個進程在運行時,頻繁的出現缺頁,必須請求
系統將所缺之頁調入內存。
工作集
是指在某段時間間隔 裏,進程實際所要訪問頁面的集合。


5.5 請求分段存儲管理方式

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

5.5.1 請求分段中的硬件支持

  1. 段表機制
    在請求分段系統中所需要的主要數據結構是段表。由於在
    應用程序的許多段中,只有一部分段裝入內存,其餘的一些段
    仍留在外存上,故需在段表中增加若干項,以供程序在調進、
    調出時參考。
    在這裏插入圖片描述

請求分段系統中的段表項:
(1) 存取方式 :用於標識本分段的存取屬性。
(2) 訪問字段A :用於記錄本段被訪問的頻繁程度。
(3) 修改位M :表示該段在調入內存後是否被修改過。
(4) 存在位(狀態位)P :指示該段是否已調入內存。
(5) 增補位 :用於表示該段在運行中是否做過動態增長。
(6) 外存地址:用於指出該段在外存上的起始地址(盤塊號)。

  1. 缺段中斷機構
    在請求分段系統中,每當發現運行進程所要訪問的段尚未調
    入內存時,便由缺段中斷機構產生一缺段中斷信號,進入OS後
    由缺段中斷處理程序將所需的段調入內存。缺段中斷同樣需要
    在一條指令的執行期間,產生和處理中斷,以及在一條指令執
    行期間,可能產生多次缺段中斷。但不會出現一條指令被分割
    在兩個分段中或一組信息被分割在兩個分段中的情況。

  2. 地址變換機構
    請求分段系統中的地址變換機構,是在分段系統地址變換機構
    的基礎上形成的。因爲被訪問的段並非全在內存,因而在地址變
    換時,若發現要訪問的段不在內存,必須先將所缺的段調入內存,
    並修改段表,然後才能利用段表進行地址變換。在地址變換機構
    中需增加缺段中斷的處理及請求等功能。

5.5.2 分段的共享和保護

  1. 共享段表
    爲了實現共享,可在內存中配置一張共享段表,所有各共享段都在共享段表中佔有一表項。
    (1) 共享計數count:共享段爲多個進程所需要,當某進程不再需要它而釋放它時,系統並不回收該段所佔內存區,僅當所有共享該段的進程全都不再需要它時,才由系統回收該段所佔內存區。設置count用於記錄有多少個進程需要共享該分段。
    (2) 存取控制字段:對於一個共享段,應給不同的進程以不同的存取權限。
    (3) 段號:對於一個共享段,不同的進程可以各用不同的段號去共享該段。

在這裏插入圖片描述

  1. 共享段的分享與回收
  1. 共享段的分配
    爲共享段分配內存時,對第一個請求使用該共享段的進程,由
    系統爲該共享段分配一物理區,再把共享段調入該區,同時將該區
    的始址填入請求進程的段表的相應項中,還須在共享段表中增加一
    表項,填寫有關數據,把count置爲1;之後,當又有其他進程需要
    調用該共享段時,無需再爲該段分配內存,只需在調用進程的段表
    中,增加一表項,填寫該共享段的物理地址;在共享段的段表中,
    填上調用進程的進程名、存取控制等,再執行count:=count+1操
    作。
  1. 共享段表
  1. 共享段的回收
    當共享該段的進程不再需要該段時,應將該段釋放,包括撤消
    在該進程段表中共享段所對應的表項,以及執行count:=count-1操
    作。如果結果爲0,則需由系統回收該共享段的物理內存,以及取
    消在共享段表中該段所對應的表項,否則只取消調用者進程在共享
    段表中的有關記錄。
  1. 分段保護
    1)越界檢查
    段表寄存器存放了段表長度;段表中存放了每個段的段長。
    在進行存儲訪問時,將段號與段表長度比較,段內地址與段長比
    較。
  2. 共享段表
  3. 共享段的分享與回收
    2)存取控制檢查
    段表中的每個表項都設置了“存取控制”字段,用於規定
    該段的訪問方式: 只讀; 只執行; 讀/寫
    3)環保護機構
    規定:低編號的環具有高優先權
    遵循的原則:
    ➢ 一個程序可以訪問駐留在相同環或較低特權環中的數據。
    ➢ 一個程序可以調用駐留在相同環或較高特權環中的服務。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章