視頻地址
http://www.bilibili.com/video/av6538245
介紹
本篇博客,旨在記錄視頻學習的要點,所以格式隨意, 方便本人日后自考和回憶,有興趣的朋友可以評論討論。
原文地址http://www.cnblogs.com/clockq/p/10318639.html
一、操作系統(OS)描述
1.1 什么是操作系統
OS = Kernel + Shell,是介於底層硬件和應用軟件之間的一層軟件架構。
- Shell 主要提供與Users的交互工作(Windows的GUI和Linux的Terminal)
- Kernel 主要負責管理計算機的硬件資源
- CPU調度器
- 內存管理 = 物理內存 + 虛擬內存
- 文件系統管理
- 中斷和設備驅動
Kernel 特征
- 並發(也並行)
- 共享
- 虛擬化(cpu,內存 => 進程, 硬盤 => 文件)
- 異步
1.2 操作系統的發展歷史
- 紙帶+人工操作系統
- 多道操作系統
- 分時操作系統(1/1000 s一次分時)
- 單用戶操作系統
- 分布式操作系統
計算機的快速發展與各個底層硬件的快速發展是分不開的(CPU的計算能力,IO的讀寫能力和網絡帶寬)
二、OS的啟動、中斷、異常和系統調用
2.1 計算機系統啟動流程
BIOS = Basic Input/Output System
graph LR
A[BIOS]-->B[Bootloader]
B --> C[OS]
2.1.1 BIOS啟動流程
POST = Power-On Self-Test
graph LR
A[POST]-->B[啟動順序]
B-->C[主引導記錄]
2.1.2 主引導記錄
主引導記錄(MBR)= Master Boot Record
graph LR
A[MBR]-->B[分區表]
B-->C[活動分區]
2.1.3 硬盤啟動
硬盤啟動分為三種情況:
- 卷引導記錄(Win)
- 擴展分區和邏輯分區(不常見)
- 啟動管理器(Linux的Grub)
卷引導記錄(VBR)= Volume boot record
graph LR
A[活動分區]-->B[VBR]
B-->C[OS]
啟動管理器模式:
graph LR
A[MBR]-->B[Grub]
2.1.4 操作系統啟動
graph LR
A[Load /boot/kernel]-->B[run /sbin/init]
2.2 中斷、異常、系統調用
- 中斷:不同硬件設備的計時器或網絡中斷(外設發起)(異步)
- 異常:非法指令或其他失敗的處理狀態(應用程序發起)(同步)
- 系統調用:應用程序主動向操作系統發出的服務請求(應用程序發起)(同步或異步)
2.2.1 中斷處理流程
graph LR
A[外設設置中斷標記] --> B[保存現場]
B --> C[中斷程序處理]
C --> D[清除中斷標記]
D --> E[恢復現場]
2.2.2 異常處理流程
graph LR
A[保存現場] --> B[異常處理]
B --> C[殺死異常程序]
B --> D[重啟發生異常的程序]
C --> E[恢復現場]
D --> E[恢復現場]
2.2.3 系統調用處理流程
應用程序無法直接操作硬件,需要OS提供的服務接口來間接調用,例:
C語言的printf()
函數,執行時會調用OS的write()
接口
三、內存管理
參考文章https://blog.csdn.net/hguisu/article/details/5713164
3.1 計算機體系結構
計算機基本硬件結構 = CPU + 內存 + 外設
CPU = 運算器 + 寄存器 + 控制器 + Cache(L1 + L2)+ 存儲管理單元(MMU)
3.2 內存分層體系
越是靠近CPU的內存,讀取速度越快,由近及遠依次是:
CPU寄存器 => Cache => 主存 => 虛擬內存
操作系統在內存管理上要完成的任務:
- 抽象
- 邏輯地址空間 != 實際地址空間
- 保護(隔離)
- 同時運行多個應用,每個應用有一片獨立的地址空間
- 共享
- 進程間可以使用共享內存進行交互和數據的傳遞
- 虛擬
- 內存不足可以利用硬盤獲得更多的地址空間
3.3 地址空間和地址生成
- 邏輯地址空間:一個運行程序所擁有的內存范圍。該地址是相對於當前進程數據段的地址,不和絕對物理地址相干。一個邏輯地址,是由一個段標識符加上一個指定段內相對地址的偏移量,表示為 [段標識符:段內偏移量]。
- 線性地址:是邏輯地址到物理地址變換之間的中間層。
- 物理地址空間:硬件支持的地址空間。
邏輯地址------(段機制)------->線性地址------(頁機制)------->物理地址。
既然邏輯地址最終要轉換為物理地址,那么為何還需要邏輯地址呢?
邏輯地址提供了權限檢查功能:比如我們設置邏輯地址和物理地址之間的映射關系時,可以設置某塊地址是只讀的,只寫的,只有CPU處於管理模式時才能訪問等。這些功能可以讓系統的內核,用戶程序的運行空間相互獨立:用戶程序即使出錯,也無法破壞內核;用戶程序A崩潰了,也無法影響到用戶程序B。
3.3.1 邏輯地址生成過程
graph LR
A[C程序.c] --> |編譯| B[編譯程序.s]
B --> |匯編| C[匯編程序.o]
C --> |鏈接| D[執行程序.exe]
D --> |加載| E[應有載入內存]
各個步驟的作用:
- 編譯:C程序代碼中,每個指針(變量名、函數名)就代表着一個
邏輯地址
,但該地址對硬件而言是不友好的,因此先經過編譯,將代碼轉為語法樹,通過符號來描述地址。 - 匯編:經過匯編,將上一步的語法樹轉為機器語言,使用一段相對連續的,從零開始的地址描述程序。更加接近底層硬件語言。
- 鏈接:一個大的程序,可能通過多個.o文件組成,所以通過鏈接,將多個從零開始描述的.o文件組合到一起,並且使之不發生內存沖突。由此組成成為一個.exe應用程序,但此時該程序還存放在硬盤上。
- 加載:將上一步中,硬盤上的應用程序,通過一定的偏移量加載到內存中。此時的地址依然是邏輯地址。
具體流程如下圖:
3.3.2 物理地址生成過程
graph LR
A[CPU加載邏輯地址內容] --> B{查看MMU中是否映射了物理地址}
B --> |有| L[獲得物理地址]
B --> |沒有| C{到主存中查找是否有物理地址映射表}
C --> |有| L
L--> D[讀取物理地址的內容]
3.4 連續內存分配
3.4.1 內存碎片
- 外部碎片:在分配單元間未使用的內存
- 內部碎片:在分配單元中未使用的內存
3.4.2 分區的動態分配
什么時候分配?
- 應用程序啟動,運行棧加載到內存的時候,分配一塊連續的內存空間
- 應用程序加載數據時
內存分配算法
1. 首次適配
如要分配N byte,在內存中查找第一個可用(>=N)的空閑塊,以滿足最快分配。
需求:1. 按照地址排序; 2. 分配需要尋找合適的空閑塊; 3. 內存回收后,要將相鄰塊進行合並。
優勢:實現簡單; 易於產生更大數據塊。
劣勢:會產生外部碎片; 不確定性。
2. 最優適配
如要分配N byte,在內存中查找第一個可用(>=N)的且最小的空閑塊,以滿足最快分配。更大的利用小空間。
需求:1. 按照剩余空間大小排序; 2. 分配需要尋找 最 合適的空閑塊; 3. 內存回收后,要將相鄰塊進行合並。
優勢:實現簡單; 適合大量分配小內存。
劣勢:重分配慢; 易產生大量微小的外部碎片。
3. 最差適配
如要分配N byte,在內存中查找第一個可用(>=N)的且最大的空閑塊,以滿足最快分配。避免出現大量微小空間。
需求:1. 按照剩余空間大小排序(倒序排列); 2. 分配需要尋找 最 合適的空閑塊; 3. 內存回收后,要將相鄰塊進行合並。
優勢:適合大量分配中等大小內存。
劣勢:重分配慢; 易產生外部碎片; 會破壞大的空閑塊,使更大的應用無法分配。
3.4.3 壓縮式碎片整理
將非運行時應用占用的內存移動到相鄰的一處內存,以減少應用間的外部碎片
3.4.4 交換式碎片整理
利用虛擬內存,將非運行時應用占用的內存移動到虛擬內存,以使的運行時應用有更大的空閑空間使用。
3.5 非連續內存分配
優點:
- 內存分配在物理地址空間是非連續的
- 可以更好,最大化的利用物理內存和管理
- 允許共享代碼和數據(共享庫等、、)
- 支持動態加載和動態鏈接
缺點:
- 內存管理本身的一些維護開銷
- 硬件的配合和支持(分段和分頁)
3.5.1 分段(Segmentation)
為了更好的分離和管理。
使用分斷管理機制后,在邏輯地址層面,地址看上去是連續的,而在物理地址層面,可以將不同的代碼段分離出來管理,從而實現共享,管理,權限保護等。
分斷尋址方案
3.5.2 分頁(Paging)
先划分物理內存至固定大小的幀(Frame),用二元組(f,o)表示幀號和幀內偏移;划分邏輯地址空間至相同大小的頁(Page),用二元組(p,o)表示頁號和頁內偏移。幀更像是相框,里面啥也沒有,放了照片(邏輯頁面)才有意義。
物理尋址方式例題:
16-bit的地址空間,512byte大小的頁幀大小,則物理地址為(3,6)的實際地址是多少?
解:
512 = 2^9 // 頁幀需要使用9bit表示
16-9 = 7 // 頁號需要使用7bit表示
所以實際物理地址的二進制表示為 0000011 000000110
轉為十進制為1542,也可以用 3 * 512 + 6 = 1542
3.5.3 頁表的缺點
每個運行程序都有一個頁表,屬於程序的運行狀態,會動態的發生改變。
缺點:
- 通過分頁實現的內存映射,需要進行兩次查詢(頁表查詢,物理地址訪問)
- 頁表會占用額外的內存,假如64bit機器的每頁大小為1024byte,則最大會有2^54個頁號
- 每個應用都有一份頁表,對於問題2,就更加麻煩了
上述問題,可以使用緩存
和間接訪問
兩種方式解決。
3.5.4 頁表的優化
TLB(Translation Look-aside Buffer)
TLB是一塊特殊的快表,可以更快的獲得物理幀號,且TLB的miss幾率可以忽略不計。
頁表有個特殊的概念叫駐留位(上圖標紅的地方),駐留位為0
的表示物理幀號不存在,也就是本頁映射無效。
多級頁表
反向頁表
頁寄存器方案:
頁表反向設計,頁表索引以幀號為index,因為物理內存是固定的,而邏輯空間是無限增長的,因此大大減少了頁表大小。
優:
- 占用空間小
- 轉換表只與物理內存有關,與邏輯內存無關
弊:
- 信息對調,無法根據頁號找到幀號
關聯內存方案:。。。
Hash方案:。。。
四、虛擬內存管理
4.1 起因
希望有個很大、很快、很便宜的存儲器,最好掉電數據不丟失。因此,貪心的人類想到了利用硬盤。
早期的計算機由於硬件限制,經常會出現內存不夠的情況,當時主要通過覆蓋技術(只把需要的指令和數據存在內存中)
和交換技術(把暫時不用的指令和數據存到swap中)
。
4.2 覆蓋技術
產生於20世紀80年代,一般用於多道程序系統的DOS操作系統。當時計算機的內存容量大多只有640kb。
目的:
在較小的內存容量下運行較大的應用程序,與分區存儲管理配合使用。
實現:
如下圖所示,A程序為常駐應用,但BC程序不會相互調用,DEF程序也不會相互調用,所以就可以讓之后調用程序內存覆蓋之前調用的內存空間。(以模塊為粒度覆蓋)
缺點:
- 由程序員來考慮把一個大程序,划分為若干小的功能模塊,並確定各個模塊之間的依賴,覆蓋關系。增加了系統復雜性和編程難度。
- 覆蓋模塊從外存裝入內存,是典型的時間換空間。
4.3 交換技術
一般用於Unix操作系統。
目的:
讓正在運行或需要運行的程序可以獲得更多內存資源。
實現:
將暫時沒有運行的程序移到外部swap,從而獲得更多的物理內存。(以程序為粒度交換)
注意:
- 何時進行換入(swap in)和換出(swap out)操作? 盡量少,內存不夠再換出
- 交換分區(swap)的空間要設置多大?必須足夠大,可以存放所用用戶進程的內存拷貝。
- 內存換入時的地址重定向問題?要采用動態地址映射法。
4.4 虛存技術
在有限容量的內存中,以更小的頁粒度為單位裝入更多更大的程序(對覆蓋技術和交換技術的一次融合)。
目的:
- 像覆蓋技術一樣,不將應用全部載入內存,而是載入部分,以此來運行比物理內存大很多的應用程序。但不需要程序員維護。
- 像交換技術一樣,能夠實現應用在內存和外存之間的交換。但不以程序為粒度交換。
要求:
局部性原理:
指程序在執行過程的一個較短時間內,所執行的指令地址和指令操作數地址,分別局限在一小塊區域。
- 時間局部性:一條指令的一次執行和下次執行,數據的一次訪問和下次訪問都集中在較短時間內;(類似緩存、預加載,增加命中率)
- 空間局部性:當前指令和臨近的幾條指令,當前訪問數據和臨近的數據都集中在一塊較小的區域內;(減少swap次數,同上)
舉例: 對於一個二維數組[1024 * 1024], 對於橫向打印和豎向打印,效率差異還是相當大的!
特征:
- 充分利用CPU尋址能力,獲得更大的可用物理內存(主存+虛存)
- 部分交換
- 不連續性:邏輯地址也可以不連續
虛擬頁式內存管理:
這種管理方式,是大多數虛擬存儲設備的選擇,即在頁式存儲的基礎上,增加了請求調頁和頁面置換功能。
請求調頁:應用程序裝入內存時,不是一次性載入全部的頁片到內存,而是用到哪個頁片載入哪個幀。(局部加載)
頁面置換:在應用運行過程中,如果發現需要的頁片不在內存中,就會發生“斷頁中斷請求”,系統處理這個中斷,就會將虛擬內存中的幀加載到物理內存中。(延遲調用)
頁表項結構
缺頁中斷處理過程
語言描述
缺頁中斷發生時的事件順序如下:
-
硬件陷入內核,在堆棧中保存程序計數器。大多數機器將當前指令的各種狀態信息保存在特殊的CPU寄存器中。
-
啟動一個匯編代碼例程保存通用寄存器和其他易失的信息,以免被操作系統破壞。這個例程將操作系統作為一個函數來調用。
-
當操作系統發現一個缺頁中斷時,嘗試發現需要哪個虛擬頁面。通常一個硬件寄存器包含了這一信息,如果沒有的話,操作系統必須檢索程序計數器,取出這條指令,用軟件分析這條指令,看看它在缺頁中斷時正在做什么。
-
一旦知道了發生缺頁中斷的虛擬地址,操作系統檢查這個地址是否有效,並檢查存取與保護是否一致。如果不一致,向進程發出一個信號或殺掉該進程。如果地址有效且沒有保護錯誤發生,系統則檢查是否有空閑頁框。如果沒有空閑頁框,執行頁面置換算法尋找一個頁面來淘汰。
-
如果選擇的頁框“臟”了,安排該頁寫回磁盤,並發生一次上下文切換,掛起產生缺頁中斷的進程,讓其他進程運行直至磁盤傳輸結束。無論如何,該頁框被標記為忙,以免因為其他原因而被其他進程占用。
-
一旦頁框“干凈”后(無論是立刻還是在寫回磁盤后),操作系統查找所需頁面在磁盤上的地址,通過磁盤操作將其裝入。該頁面被裝入后,產生缺頁中斷的進程仍然被掛起,並且如果有其他可運行的用戶進程,則選擇另一個用戶進程運行。
-
當磁盤中斷發生時,表明該頁已經被裝入,頁表已經更新可以反映它的位置,頁框也被標記為正常狀態。
-
恢復發生缺頁中斷指令以前的狀態,程序計數器重新指向這條指令。
-
調度引發缺頁中斷的進程,操作系統返回調用它的匯編語言例程。
-
該例程恢復寄存器和其他狀態信息,返回到用戶空間繼續執行,就好像缺頁中斷沒有發生過一樣。
流程圖
與分頁有關的工作
摘自[https://blog.csdn.net/qq_22238021/article/details/80192776]
操作系統要在下面的四段時間里做與分頁相關的工作:進程創建時,進程執行時,缺頁中斷時和進程終止時。
當在分頁系統中創建一個新進程
時,操作系統要確定程序和數據在初始時有多大,並為它們創建一個頁表。操作系統還要在內存中為頁表分配空間並對其進行初始化。當進程被換出時,頁表不需要駐留在內存中,但當進程運行時,它必須在內存中。另外,操作系統要在磁盤交換區中分配空間,以便在一個進程換出時在磁盤上有放置此進程的空間。操作系統還要用程序正文和數據對交換區進行初始化,這樣當新進程發生缺頁中斷時,可以調入需要的頁面。某些系統直接從磁盤上的可執行文件對程序正文進行分頁,以節省磁盤空間和初始化時間。最后,操作系統必須把有關頁表和磁盤交換區的信息存儲在進程表中。
當調度一個進程執行
時,必須為新進程重置MMU,刷新TLB,以清除以前的進程遺留的痕跡。新進程的頁表必須成為當前頁表,通常可以通過復制該頁表或者把一個指向它的指針放進某個硬件寄存器來完成。有時,在進程初始化時可以把進程的部分或者全部頁面裝入內存中以減少缺頁中斷的發生,例如,PC(程序計數器)所指的頁面肯定是需要的。
當缺頁中斷發生
時,操作系統必須通過讀硬件寄存器來確定是哪個虛擬地址造成了缺頁中斷。通過該信息,它要計算需要哪個頁面,並在磁盤上對該頁面進行定位。它必須找到合適的頁框來存放新頁面,必要時還要置換老的頁面,然后把所需的頁面讀入頁框。最后,還要備份程序計數器,使程序計數器指向引起缺頁中斷的指令,並重新執行該指令。
當進程退出
時,操作系統必須釋放進程的頁表、頁面和頁面在硬盤上所占用的空間。如果某些頁面是與其他進程共享的,當最后一個使用它們的進程終止的時候,才可以釋放內存和磁盤上的頁面。
后備存儲(Backing Store)
在何處保存未加載的幀?
- 能夠簡單的識別在二級存儲器中的頁
- 交換空間(磁盤或者文件)
后備存儲可以有哪些?
- 一個虛擬地址空間的頁:可以被映射到一個文件的某個位置
- 代碼段:可以映射到可執行的二進制文件
- 動態共享程序段:映射到動態調用的庫文件
- 其他段:映射到交換文件中
虛擬內存性能
有效存儲訪問時間(EAT)= Effective Memory Access Time
EAT = 訪問時間 * 頁表命中率 + 缺頁處理時間 * 缺頁幾率
例子:
訪問時間: 10ns
磁盤訪問時間:5ms = 5 * 10^6 ns
page fault rate:p
dirty page rate(頁內容改變,同步到虛擬內存概率):q
EAT = 10 * (1 - p) + 5 * 10^6 * p * (1 + q)
由上述例子可以看出,變量p對於整體EAT的影響最重要。
4.5 頁面置換算法
缺頁幾率,是嚴重影響虛擬內存效率的一個因素,而缺頁幾率與頁面置換算法息息相關。
功能:當缺頁中斷發生,需要加載新的幀頁到內存,但當應用內存已滿時,需要選擇淘汰物理內存中的幀來給新的幀資源。
目標:盡可能的減少頁面換進換出次數。
對於常駐內存(如操作系統或其他關鍵應用)添加鎖定標志位,避免換出。
分類:分為局部頁面置換和全局頁面置換兩大類
-
局部頁面置換:
- 最優頁面置換算法(OPT)(最晚重用被淘汰)(理想狀態,無法實現,可為依據)
- 先進先出算法(FIFO)(存活久的被淘汰)(利用鏈表即可實現,最差情況下性能較差)
- 最近最久未使用算法(LRU)(最久沒用被淘汰)(鏈表、堆棧可實現,但開銷較大)
- 時鍾頁面置換算法(Clock)(利用FIFO優化的LRU)(環形鏈表選最老)
- 二次機會法(??)(Clock臟頁版)(兩條命的命中高,有了臟位換出少)
- 最不常用算法(LFU)(有的最少被拋棄)(表中加個計數器)
-
全局頁面置換:
- 工作集頁面置換算法(??)(利用工作集的LRU)(無須缺頁就淘汰,利用時刻來換出)
- 缺頁率頁面置換算法(PFF)(動態改變常駐集的工作集算法)(根據缺頁頻率,淘汰多個頁面)
4.5.1 最優頁面置換算法(OPT)
基本思路:當一個缺頁中斷發生,需要進行頁面置換時,對於當前內存中的每一個邏輯頁面,計算它下一次被訪問時還需等待的時間,從中選擇等待時間最長的頁面,作為置換頁。
評價:該算法無法實現或者說很難實現,因為OS無法預知每個頁面下次訪問需要的等待時間,但該算法可以作為其他算法評定的依據。
例圖:
4.5.2 先進先出算法(FIFO)
基本思路:對於當前內存中的每一個邏輯頁面,計算它載入內存的時間,從中選擇駐留時間最長的頁面,作為置換頁。
評價:利用鏈表實現,載入向鏈尾加,換出刪除鏈表頭即可。
例圖:
4.5.3 最近最久未使用算法(LRU)
基本思路:選擇最久未被使用的幀頁,作為置換頁。
評價:時間軸上與最優算法相反,符合局部性原理。在最近一段區間內,找到最久未使用的幀。對於記錄各頁面調用的先后順序,開銷較大,可以利用鏈表或堆棧實現。
例圖:
4.5.4 時鍾頁面置換算法(Clock)
基本思路:與LRU相似,是FIFO的一種改進。是二者之間的一種平衡。實現是在頁面中加入一個訪問位
,一個頁面載入時,由硬件初始化為0(軟件也可以),如果頁面被訪問,則相應頁表項置為1。將各頁表項組成一個環形鏈表,發生缺頁中斷時,指針循環判斷環形鏈表,若判斷的頁表項為0,選為置換頁,置換並訪問新頁后,新頁表項置為1,指針下移;若判斷的頁表項為1,則改為0,指針下移。
評價:時間軸上與最優算法相反,符合局部性原理。在最近一段區間內,找到最久未使用的幀。對於記錄各頁面調用的先后順序,開銷較大,可以利用鏈表或堆棧實現。
例圖:
4.5.5 二次機會法()
基本思路:對Clock算法的一個改進,優化Clock算法對修改頁面的寫入邏輯,引入新位dirty bit
(臟位)來標識內存修改過與虛存不一致。對於臟位為0的頁面,不必進行同步回虛存的一步。而對於臟位為1的頁面,多了一次存活機會,與訪問位用法一樣。
評價:優化Clock算法的換出效率,並利用兩個標識位擁有兩條命,來增加存活率,加大命中次數。
例圖:
4.5.6 最不常用算法(LFU)
基本思路:選擇訪問次數最少的頁為置換頁。所以要維護一張表,對每個頁都有個訪問計數器。
評價:LRU關注訪問過去時間,久的淘汰;LFU關注訪問次數,少的淘汰。
4.5.7 局部頁面置換算法總結:
Belady現象:
Belady(筆勒滴,一個科學家名)在采用FIFO算法時,有時會出現分配的物理頁面數增加,缺頁率反而提高(命中率反而下降)的反常現象。
例圖:
解決:LRU算法
FIFO、LRU、Clock三者比較?
- FIFO、LRU都有先進先出思想,但LRU對於訪問算作一次新的進入,有局部性思想。
- FIFO、LRU相比,LRU性能雖好,但開銷較大;而FIFO有Belady現象
- LRU、Clock很相似,但Clock加入訪問位模擬LRU的訪問順序,而不用動態維護順序鏈表,開銷更小,但性能較LRU略有不足
局部頁面置換算法的問題:
對應用分配了固定的物理頁幀,一定程度上限制了系統靈活性,比如同時運行多個程序,但高峰期正好交錯開。所以可以根據應用運行的不同階段,調整分配的物理頁幀,最大化利用系統資源。
4.5.8 工作集和常駐集
工作集:一個進程p當前執行時刻t前,在之前的定長的頁面訪問工作集窗口△階段,使用的邏輯頁面集合,用二元函數 W(t, △)
表示;隨時刻t變化,集合也在變化。 | W(t, △) |
表示集合大小,即頁面數目。(一段時間內訪問的頁面集合)
常駐集:一個進程p在當前時刻t實際駐留在內存中(物理頁面)的頁面集合。(某時刻訪問的頁面集合)
常駐集 <= 工作集。
缺頁率:“缺頁次數” / “內存訪問次數”,影響因素:
- 頁面置換算法
- 分配的物理頁幀數(常駐集大小)
- 頁面本身大小
- 編寫的程序(是否符合局部性)
4.5.9 工作集頁面置換算法
基本思路:類似LRU最久未用被淘汰,但不同的是觸發事件不同,當時刻改變時(而非缺頁時)就會清理物理頁面,准備物理頁幀。
例圖:
4.5.10 缺頁率頁面置換算法(PFF)
基本思路:在工作集頁面置換算法基礎上,動態改變時刻窗口(△)大小,即常駐集大小。當缺頁率上升時,提高常駐集大小,反之減少。(淘汰的觸發時間是缺頁時,一次可能淘汰多個頁面)
評價:性能好,開銷大。
例圖:
4.5.11 抖動問題
什么是抖動?
當分配的常駐集小於工作集,使進程產生很多缺頁中斷,頻繁進行換進換出,從而使運行速度變慢的現象叫做抖動問題。
產生原因?
隨着駐留內存中應用的增加,分配給每個應用的物理頁幀(常駐集)持續減少,缺頁率隨之提高。所以OS要選擇運行適當的進程數量,及每個進程所需頁幀數,使並發水平和缺頁率達到一定平衡。