第五章:虛擬存儲器管理
5.1、虛擬存儲器概述
5.1.1、常規存儲管理方式的特征和局部性原理
常規存儲管理方式的特征
存在的問題 | 特點 | 缺點 |
---|---|---|
一次性 | 程序必須全部裝入內存才能運行 | ①大作業無法在小內存中運行; ②限制了在內存中並發進程的數量 |
駐留性 | 作業一直駐留內存直到完成 | 一些不用或者暫時不用的程序(數據)占據了大量的內存空間,浪費空間 |
局部性原理
程序運行的局部性:程序在一個有限的時間內,訪問過的代碼和數據集中在有限的地址范圍內。
局限性又表現在下述的兩個方面:
1)、時間局部性:即剛被訪問過的單元在很短的時間內還將被訪問。
2)、空間局部性:即被訪問過的單元的鄰近單元也將被訪問。
產生時間局限性的典型原因是:在程序中存在大量的循環結構
產生空間局部性的典型原因是:程序的順序執行
5.1.2、虛擬存儲器的定義和特征
虛擬存儲器的定義
虛擬存儲器:是指僅把作業的一部分裝入內存便可運行作業的存儲器系統,具有請求調入功能和置換功能,能從邏輯上對內存容量進行擴充的一種存儲器系統。
虛擬存儲器的特征
1)、多次性
多次性是相對於傳統存儲器管理方式的一次性而言的,是指一個作業中的程序和數據無需在作業運行時一次性地全部裝入內存,而是被分成多次調入內存運行。
2)、對換性
在進程運行期間,允許將那些暫不使用的代碼和數據從內存調至外存的對換區(換出),待以后需要時再將它們從外存調至內存(換進)。
甚至還允許將暫時不運行的進程調至外存,待它們重又具備運行條件時再調入內存。
3)、虛擬性
虛擬性是指能夠從邏輯上擴充內存容量,使用戶所看到的內存容量遠大於實際內存容量。
虛擬性是以多次性和對換性為基礎的,而多次性和對換性又是以離散分配為基礎的。
5.1.3、虛擬存儲器的實現方法
虛擬存儲的實現思路
基於局部性原理,應用程序在運行之前沒有必要將之全部裝入內存,而僅須將那些當前要運行的少數頁面(段)先裝入內存便可運行,其余部分暫留在盤上。
程序在運行時,如果它所要訪問的頁(段)已調入內存,便可繼續執行下去;
但如果程序所要訪問的頁(段)尚未調入內存(稱為缺頁或缺段),便發出缺頁(段)中斷請求,此時OS將利用請求調頁(段)功能將它們調入內存,以使進程能繼續執行下去。
如果此時內存已滿,無法再裝入新的頁(段),OS還須再利用頁(段)的置換功能,將內存中暫時不用的頁(段)調至盤上,騰出足夠的內存空間后,在將要訪問的頁(段)調入內存,使程序繼續執行下去,這樣,便可是一個大的用戶程序在較小的內存空間中運行,也可在內存中同時裝入更多的進程,使它們並發執行。
綜上所述,簡而言之,就是:
在程序運行時,只把當前必須運行的很小的一部分代碼和數據裝入內存,其余代碼和數據需要時再裝入,不再運行的代碼和數據及時從內存中刪除。
虛擬存儲器管理的目標
- 使得大的程序能在較小的內存中運行;
- 使得多個程序能在較小的內存中運行;
- 使得多個程序並發運行時地址不沖突;
- 使得內存利用效率高;
虛擬存儲器的工作原理:
置換
- 基於置換算法
請求調入
- 基於中斷機制
部分裝入
- 基於局部性原理
基於離散的存儲管理
- 頁式虛擬存儲管理方式 —— 請求分頁系統
- 段氏虛擬存儲管理方式 —— 請求分段系統
5.2、請求分頁管理方式
5.2.1、請求分頁的硬件支持
為了實現請求分頁,系統必須提供一定的硬件支持,計算機系統除了要求一定容量的內存和外存外,還需要請求頁表機制、缺頁中斷機構以及地址變換機構。
1、請求頁表機制
作用:仍然是將用戶地址空間中的邏輯地址映射為內存空間中的物理地址。
為了滿足頁面換僅換出的需要,在請求頁表中又增加了四個字段:
1)狀態位(存在位)P:指示該頁是否已調入內存,供程序訪問時參考。
2)訪問字段A:用於記錄本頁在一段時間內被訪問過的次數,或記錄本頁最近已有多長時間未被訪問,提供給置換算法(程序)在選擇換出頁面時參考。
3)修改位M:標識該頁在調入內存后是否被修改過。
由於內存中的每一頁都在外存上保留一份副本,因此在置換該頁時,有兩種情形:
- 若未被修改過,就不需要再將該頁寫回到外存上
- 若被修改過,則必須將該頁重寫到外存上,以保證外存中所保留的副本始終是最新的。
4)外存地址:指出該頁在外村上的地址,通常是物理塊號,供調入該頁時參考
2、缺頁中斷機構
當要訪問的頁面不在內存時,便產生一缺頁中斷,請求OS將所缺頁調入內存。
缺頁中斷作為一種特殊的中斷,它與一般的中斷相比有着明顯的區別,主要表現在下面兩個方面:
1)在指令執行期間產生和處理中斷信號。
- 缺頁中斷返回后,該指令要重新執行(指令復執)
2)一條指令在執行期間可能產生多次缺頁中斷。
3、地址變換機構
簡要地址變換過程:
請求分頁系統中的詳細的地址的地址變換過程:
主要的動作:
- 處理缺頁中斷
- 從外存磁盤讀入所需的頁面
- 重新開始執行被中斷的進程
主要的時間開銷:
- 從磁盤讀入所需的頁面(I\O操作)
5.2.2、請求分頁中的內存分配
在為進程分配內存時,將涉及到三個問題:
(對於單個進程而言)
第一:為保證進程能正常運行,所需要的最小物理塊數的確定;
第二:在為每個進程分配物理塊時,應采取什么樣的分配策略,即所分配的物理塊是固定的還是可變的;
(對於全部進程而言)
第三:為不同進程所分配的物理塊數,采取什么樣的策略,是采取平均分配算法,還是根據進程的大小按比例分配;
1、最小物理塊數的確定
最小物理塊數是指:保證進程正常運行所需要的的最小物理塊數,當系統為進程分配的物理塊數少於此值時,進程將無法運行。
1)分配給一個進程的物理塊數越少,內存中的進程數越多;
2)若一個進程分配的物理塊數太少,缺頁率較高;
3)最少物理塊數與指令的格式、功能和尋址方式有關
2、內存分配策略
-
在請求分頁系統中,可采取兩種內存分配策略,即固定和可變分配策略。
-
在進行置換時,也可采取兩種策略,即全局置換和局部置換。
-
從空閑物理塊中選擇
-
若沒有空閑物理塊 —— 置換
全局置換:可以選擇內存中任意進程的頁進行替換。可以從另一個進程中獲得物理塊。
局部置換:只能從進程自身在內存中的頁面進行替換。
於是可組合出一下三種適用的策略。
1)固定分配局部置換(Fixed Allocation,Local Replacement)
-
固定分配:指為每個進程分配固定的物理塊數,進程在整個運行期間不變
-
局部置換:指進程運行過程中若發生缺頁,只能從進程本身所擁有的的物理塊中選擇一頁換出,再調入所需頁。
-
特點:
- 分配簡單,不會影響其他進程。
- 但進程所需的內存大小難確定;太少,頻繁缺頁中斷;太多,內存中進程數目減少
2)可變分配全局置換(Variable Allocation,Global Replacement)
-
可變分配:開始時系統為每個進程分配一定數目的物理塊,OS自身保留一空閑物理塊隊列。當某進程發生缺頁中斷時,從空閑隊列中取出一空閑物理塊分配給該進程,讓其裝入頁
-
全局置換:指若空閑隊列已空,而又發生缺頁中斷時,從內存空間中的任一進程所擁有的物理塊中選擇一頁換出。
-
特點:
- 實現簡單,在很多操作系統中使用。
- 但會導致其他進程缺頁率增加。
3)可變分配局部置換(Variable Allocation,Local Replacement)
-
可變分配:開始為各進程分配一定數目的物理塊,並且在進程運行期間可根據情況(缺頁率)適當調整物理塊數。
-
局部置換:當發生缺頁中斷時,只能從本進程的頁面中選擇一頁換出。
-
特點:
- 性能較好,但較復雜。
3、物理塊分配算法
1)平均分配算法:即將系統中所有可供分配的物理塊平均分配給各個進程。
2)按比例分配:即根據進程的大小按比例分配物理塊
- 各進程頁面總數為:\(S = \sum_{i=1}^N Si\)
- Si 為每個進程的頁面數
- 物理塊總數為:m
- 則每個進程所得物理塊數為:\(Bi = \frac{Si}{S} * m\)
- 其中\(Bi\)應該取整,它必須小於最小物理塊數
3)考慮優先權的分配算法:依據進程優先級分配物理塊。
5.2.3、頁面調入策略
為了使進程能夠正常運行,必須事先將要執行的那部分程序和數據所在的頁面調入內存。
現在的問題是:
- 系統應在何時調入所需頁面
- 系統應從何處調入這些頁面
- 是如何進行調入的
1、何時調入所需頁面
為了確定系統在進程運行時將所缺的頁面調入內存的時機,可以采取預調入頁策略或請求調頁策略。先分述如下:
1)預調入策略
如果進程的許多頁是存放在外存的一個連續區域中,一次調入若干個相鄰的頁會比一次調入一頁更高效些。
以預測為基礎的預調頁策略,將那些預計在不久后之后便會被訪問的頁面預先調入內存,目前預調頁的成功率僅約 50%。
2)請求調頁策略
當進程在運行中需要訪問某部分程序和數據時,若發現其所在的頁面不在內存,便立即提出請求,每次調入一頁,由 OS 將其所需的頁面調入內存。
-
優點:
- 易於實現,目前虛擬存儲器,大多采用此策略
-
缺點:
- 花費較大的系統開銷,增加了磁盤I/O的啟動頻率
2、從何處調入這些頁面
將請求分頁系統中的外存分為兩部分:
- 用於存放文件的文件區(采用離散分配方式)
- 用於存放對換頁面的對換區(通常是采用連續存儲分配的)
每當發生缺頁請求時,系統應從何處將缺頁調入內存,可分成如下三種情況進行:
1)、系統擁有足夠的對換區空間。
這時可以全部從對換區調入所需的頁面,以提高調頁速度。為此,在進程運行前,便須將與該進程有關的文件從文件區拷貝到對換區。
2)、系統缺少足夠的對換區空間。
這時,凡是不會被修改的文件,都直接從文件區調入;當換出這些頁面時,由於它們未被修改,則不必再將它們重寫到磁盤(換出),以后再調入時,仍從文件區調入。
對於已被修改的頁面,在將它們換出時便須調到對換區,以便需要時在從對換區調入。
3)、UNIX方式
由於與進程有關的文件都放在文件區,故凡是未運行過的頁面,都應從文件區調入;而對於曾經運行過但又被換出的頁面,由於是被放在對換區,因此在下次調入時應從對換區調入。
由於UNIX系統允許頁面共享,因此,某進程所請求的頁面有可能被其他進程調入內存,此時也就無需再從對換區調入。
3、頁面調入過程
1)、每當程序所要訪問的頁面未在內存時(存在位為“0”),便向CPU發出一缺頁中斷,中斷處理程序首先保留CPU環境,分析中斷產生的原因,然后轉入缺頁中斷處理程序。
2)、通過查找頁表找到該頁在外存的物理地址后
3)、查看此時內存是否已滿,如果未滿,就能容納新頁,則啟動磁盤I/O,將所缺之頁調入內存,然后修改頁表
4)、如果已滿,則須先按照某種置換算法,從內存中選出一頁准備換出;若要換出的一頁未被修改過(修改位為”0“),可不必將該頁寫會磁盤;
5)、但如果此頁已被修改過(修改位為“1“),則必須將它寫會磁盤,然后再把所缺的頁調入內存,並修改頁表中的相應表項(將存在位置為“1”),並將此頁表項寫入快表中;
6)、缺頁調入內存后,利用修改后的頁表形成所要訪問的物理地址,再去訪問內存數據。
4、缺頁率
假設在進程 J中:
- 邏輯頁面:n 頁
- 物理塊:m 塊 (m <= n)
- 訪問頁面成功的次數為:S
- 訪問頁面失敗(產生缺頁)的次數為:F
- 進程執行過程中總的頁面訪問次數為:A
- \(A = S + F\)
則,進程運行中的缺頁率為:\(P = \frac{F}{A}\)
和存取時間的關系:
- 存取內存的時間:1ms
- 頁面交換的時間:10ms
\(EAT = (1-p)*1 + p*10 = 1+9p\)
影響缺頁率的因素:
- 頁面的大小
- 進程分配的物理塊數
- 頁面置換算法
- 程序固有特性
5.3、頁面置換算法
在進程的運行過程中,若其要訪問的頁面不在內存中,而需要把它們調入內存,但內存已無空閑空間時,為了保證進程能夠正常運行,系統必須從內存中調出一頁程序(數據)送到磁盤的對換區中。
把選擇換出頁面的算法稱為:頁面置換算法(Page-Replacement Algorithm)
在介紹頁面置換算法之前,先了解一下什么是 “抖動”?
“抖動”(Thrashing):即剛被換出的頁很快又要被訪問,需要將它重新調入,此時有需要再選一頁調出;而此剛被調出的頁很快又被訪問,又需將它調入,如此頻繁地更換頁面,以致一個進程在運行中把大部分的時間花費在頁面置換工作中,我們稱該進程發生了“抖動”。
簡而言之:“抖動”是頁面在內存和外存之間頻繁交換的現象。
頁面置換策略的目標是:
- 具有較低的缺頁率(高命中率)
- 避免程序發送“抖動”
5.3.1、最佳置換算法和先進先出置換算法
1、最佳置換算法(OPT,optimal)
只能作為一個“標准”,去評價其他算法
-
思想:置換永不再用或者最長時間內(未來)不再被訪問的頁面
-
舉例:
-
優點:
- 缺頁率最低,性能最好
-
缺點:
- 實際上無法實現,無法預知哪一個頁面是未來最長時間內不再被訪問過的;
2、先進先出置換算法(FIFO)
-
思想:置換在內存中駐留時間最久的頁面
-
舉例:
-
優點:
- 實現簡單
-
缺點:
- 與進程實際運行的規律不相適應,進程只有按順序訪問地址空間時,頁面命中率最理想。
-
異常現象:Belady現象(隨着物理塊數的增加,缺頁率不減少反而增加)
5.3.2、最近最久未使用和最少使用置換算法
3、最近最久未使用(LRU,Least Recently Used)
-
思想:置換最長時間未被使用的頁面
-
實現方式:
- 賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來經歷的時間 t。當需要淘汰一個頁面時,選擇現有頁面中 t 值最大的頁面進行置換。
-
舉例:
-
優點:性能接近最佳算法
-
缺點:需要記錄頁面使用時間的先后關系,硬件開銷太大。
4、最少使用置換算法(LFU,Least Frequently Used)
-
思想:選擇在最近時期使用最少的頁面作為淘汰頁
-
舉例:LFU置換算法的頁面訪問圖,與LRU置換算法的訪問圖完全相同。
- 特點:
- 要求較多的硬件支持,使得其實現所需要的成本較高。
- 故在實際應用中,大多采用LRU的近似算法。Clock算法就是用得較多的一種LRU近似算法。
5.2.3、Clock置換算法
是LRU的一種近似算法
1、簡單的Clock算法
由於該算法是循環檢查個頁面的使用情況,故稱為:Clock算法。
執行過程:
1)、利用簡單Clock算法時,只需為每頁設置一位訪問位,再將內存中的所有頁面都通過鏈接指針連接成一個循環隊列。
2)、當某頁被訪問過時,其訪問位置被置為 1。置換算法在選擇一頁淘汰時,只需檢查頁的訪問位。如果是 0,就選擇該頁換出;
3)、若為 1,則重新將它置為 0,暫不換出,給予該頁第二次駐留內存的機會,再按照 FIFO 算法檢查下一個頁面。
4)、當檢查到隊列中的最后一個頁面時,若其訪問位仍為 1,則再返回到隊首檢查第一個頁面。
但因該算法只有一位訪問位,只能用它表示該頁是否已經使用過,而置換時是將未使用的頁面換出去,故又把該算法稱為 最近未用算法(NRU,Not Recently Used)
2、改進型的Clock置換算法
在將一個頁面換出時,如果該頁已被修改過,便須將該頁重新寫會到磁盤上;但如果該頁未被修改過,則不必將它拷回磁盤。
換而言之,對於修改過的頁面,在換出時所付出的開銷比未修改過的頁面大,或者說,置換代價大。
這樣,在選擇頁面換出時,既要考慮未使用過的頁面,又要是未被修改過的頁面。
執行過程:
1)、從指針所指示的當前位置開始,掃描循環隊列,尋找 A = 0,M = 0的第一類頁面,將所遇到的第一個頁面作為所選中的淘汰頁。在第一次掃描期間不改變訪問位 A。
2)、如果第一步失敗,即查找一輪后未遇到第一類頁面,則開始第二輪掃描,尋找 A = 0,M = 1的第二類頁面,將所遇到的第一個這類頁面作為淘汰頁。在第二次掃描期間,將所有掃描過的訪問位 A 都置為 0。
3)、如果第二步也失敗,即未找到第二類頁面,則將指針返回到最開始的位置,並將所有與的訪問位A復 0,然后重復第一步,如果仍失敗,則重復第二步。
該算法與簡單Clock算法比較,可減少磁盤的I/O操作次數。但為了找到一個可置換的頁,可能須經過幾輪掃描。
換言之,實現該算法本身的開銷將有所增加。
5.3.4、頁面緩沖算法
在請求分頁系統中,頁面換進換出所要付出的開銷將對系統性能產生重大影響。為此,我們需要對影響頁面環進環出的因素進行分析。
1、影響頁面環進環出效率的若干因素
1)、頁面置換算法
2)、寫回磁盤的頻率
對於已修改的頁面,在將其換出時,應當會寫回磁盤。
但是如果在系統中建立一個已修改換出頁面的鏈表,則對每一個要被換出的頁面(已修改),系統可暫時不把它們寫會磁盤,而是將它們掛在已修改換出頁面的鏈表上,僅當被換出頁面達到一定值時,再一起寫回磁盤。減少了操作磁盤I/O的操作次數。
3)、讀入內存的頻率
在設置了已修改換出頁面鏈表后,在該鏈表上就暫時有一批裝有數據的頁面,如果該進程在這批數據還未寫會磁盤時,就需要再次訪問,則可以直接從已修改換出頁面的鏈表上獲取。減少將頁面從磁盤讀入內存的頻率。
2、頁面緩沖算法 PBA
在 VAX/VMS操作系統中
在內存中需要設置兩個鏈表
-
空閑頁面鏈表
-
修改頁面鏈表
-
特點:
- 顯著降低了頁面換進、換出的頻率,使磁盤I/O操作次數大為減少,因而減少了頁面換進換出的開銷。
- 實現簡單,不需要特殊的硬件支持
5.3.5、訪問內存的有效時間
\(EAT:內存的有效訪問時間\)
\(\lambda:查找快表的時間\)
\(t:訪問實際物理地址所需的時間(或查找頁表項的時間)\)
\(\alpha:處理缺頁中斷的時間\)
1)被訪問的頁在內存中,且對應的頁表項在快表中
EAT = 查找快表的時間 + 訪問實際物理地址所需的時間
\(EAT = \lambda + t\)
2)被訪問的頁在內存中,且對應的頁表項不在快表中
EAT = 查找快表的時間 + 查找頁表項的時間 + 更新快表的時間 + 訪問實際物理地址所需的時間
\(EAT = \lambda + t + \lambda + t\)
3)被訪問的頁不在內存中
EAT = 查找快表的時間 + 查找頁表項的時間 + 處理缺頁中斷的時間+ 更新快表的時間 + 訪問實際物理地址所需的時間
\(EAT = \lambda + t + \alpha + \lambda + t\)
5.4、“抖動”與工作集
5.4.1、多道程序度與“抖動”
1、多道程序度與處理機利用率
橫軸:多道程序度
縱軸:CPU的利用率
2、產生“抖動“的原因
發生“抖動”的根本原因是,同時在系統中運行的進程太多,由此分配給每一個進程的物理塊太少,不能滿足進程正常運行的基本要求,致使每個進程在運行時,頻繁地出現缺頁,必須請求系統將所缺之頁調入內存,這會使得在系統中排隊等待頁面調進/調出的進程數目增加。
顯然,對磁盤的有效訪問時間也隨之增加,造成每個進程的大部分時間都用於頁面的換進/換出,而幾乎不能再去做任何有效的工作,從而導致發生處理機的利用率急劇下降並趨於 0 的情況。我們稱此時的進程是處於 “抖動” 狀態。
5.4.2、工作集
1、引入的原因:
由於“抖動”的發生與系統為進程分配的物理塊的多少有關,1968年,Denning認為,依據程序訪問的局部性原理,通過進程在過去一段時間內訪問的頁面來動態調整分配給進程的物理塊數
2、工作集的定義
工作集:一個進程在某段時間間隔 \(\Delta\) 內,進程要訪問的頁面集合。
-
\(\Delta\):工作集窗口,是給定訪問序列選取的定長區間。
-
落在工作集窗口中的頁面集合稱為工作集
-
用\(W(t_i, \Delta)\)表示在 \(t_i - \Delta\) 到 \(t_i\) 之間所訪問的頁面集合,則它就是進程在時間 \(t_i\)的工作集
-
\(|W(t_i, \Delta)|\) 表示工作集中頁面數目,稱為 工作集尺寸
-
舉例:
如果系統能隨 \(|W(t_i, \Delta)|\) 的大小來分配物理塊,就既能有效利用主存,又可使缺頁中斷盡量少地發生。
3、實現過程
- 操作系統跟蹤每個進程的工作集,並為其分配大於其工作集的物理塊
- 如果還有空閑物理塊,則可啟動其他進程
- 如果所有工作集之和超過了可用物理塊的總數,那么操作系統會暫停一個進程,將其該進程換出,所釋放的物理塊分配給其他進程。
5.4.3、“抖動”的預防方法
1、采取局部置換策略(內存如果是可變分配方式)
2、把工作集算法融入到處理機調度中
3、利用 “L = S”准則調節缺頁率
-
L:缺頁之間的平均時間
-
S:平均缺頁時間,即用於置換一個頁面所需的時間
4、選擇暫停的進程
在內存管理中,“內零頭”和“外零頭”個指的是什么?在固定式分區分配、可變式分區分配、頁式虛擬存儲系統、段式虛擬存儲系統中,各會存在何種零頭?為什么?
解答:
1)、在存儲管理中,內零頭是指分配給作業的存儲空間中未被利用的部分,外零頭是指系統中無法利用的小存儲塊。
在固定式分區分配中,為將一個用戶作業裝入內存,內存分配程序從系統分區表中找出一個能滿足作業要求的空閑分區分配給作業,由於一個作業的大小並不一定與分區大小相等,因此,分區中有一部分存儲空間浪費掉了。由此可知,固定式分區分配中存在內零頭。
2)、在可變式分區分配中,為把一個作業裝入內存,應按照一定的分配算法從系統中找出一個能滿足作業需求的空閑分區分配給作業,如果這個空閑分區的容量比作業申請的空間容量要大,則將該分區一分為二,一部分分配給作業,剩下的部分仍然留作系統的空閑分區。由此可知,可變式分區分配中存在外零頭。
3)、在頁式虛擬存儲系統中,用戶作業的地址空間被划分成若干大小相等的頁面,存儲空間也分成也頁大小相等的物理塊,但一般情況下,作業的大小不可能都是物理塊大小的整數倍,因此作業的最后一頁中仍有部分空間被浪費掉了。由此可知,頁式虛擬存儲系統中存在內零頭。
4)、在段式虛擬存儲系統中,作業的地址空間由若干個邏輯分段組成,每段分配一個連續的內存區,但各段之間不要求連續,其內存的分配方式類似於動態分區分配。由此可知,段式虛擬存儲系統中存在外零頭。