操作系统:第三章 内存管理2 - 详解虚拟内存,页面置换算法,页面分配策略
本文已收錄至 Github(MD-Notes),若博客中有圖片打不開,可以來我的 Github 倉庫:https://github.com/HanquanHq/MD-Notes,涵蓋了互聯網大廠面試必問的知識點,講解透徹,長期更新中,歡迎一起學習探討。
面試必會系列專欄:https://blog.csdn.net/sinat_42483341/category_10300357.html
操作系統系列專欄:https://blog.csdn.net/sinat_42483341/category_10519484.html
第三章 內存管理2 - 虛擬內存
目錄
- 第三章 內存管理2 - 虛擬內存
- 虛擬內存的定義
- 虛擬內存的特征
- 虛擬內存的實現
- 請求分頁存儲管理
- 頁表機制
- 缺頁中斷(內中斷)
- 地址變換機構
- 請求分頁中的地址變換過程
- 頁面置換算法
- 1、最佳置換算法 OPT
- 2、先進先出置換算法 FIFO
- 3、最近最久未使用算法 LRU
- 4、時鐘置換算法 CLOCK / 最近未使用算法 NRU
- 請求分段存儲管理
- 請求段頁式存儲管理
- 頁面分配策略
- 固定分配 / 可變分配
- 局部 / 全局置換
- 何時調入頁面
- 從何處調入頁面
- 駐留集 / 工作集區別
虛擬內存的定義
基于局部性原理,在程序裝入時,將會用到的部分裝入內存,暫時不用的部分留在外存,程序就可以執行。在操作系統的管理下,在用戶看來似乎有一個 比實際內存大得多 的內存,這就是 虛擬內存。
-
若訪問信息不在內存,由操作系統從將信息從外存調入內存。(請求調頁)
-
若內存空間不夠,將暫時不用的信息換出到外存。(頁面置換)
虛擬內存的特征
虛擬內存的實現
請求分頁存儲管理
頁表機制
| 0 | c | 1 | 0 | 0 | x |
| 1 | b | 1 | 10 | 0 | y |
| 2 | 無 | 0 | 6 | 1 | z |
在基本分頁存儲管理的基礎上,增加了:
- 狀態位:表示頁面是否已在內存中
- 訪問字段:記錄最近被訪問過幾次 / 上次訪問的時間,供置換算法選擇換出頁面時間時參考
- 修改位:表示頁面調入內存后是否被修改過,只有修改過的頁面才需要在置換時寫回外存
- 外存地址:頁面在外存中存放的位置
缺頁中斷(內中斷)
在請求分頁系統中,若要訪問的頁面不在內存,則產生一個 缺頁中斷,由操作系統的 缺頁中斷處理程序 處理。
缺頁的進程阻塞,放入阻塞隊列。調頁完成后喚醒,放回就緒隊列。
-
將目標頁面調入內存,必要時換出頁面
-
缺頁中斷屬于內中斷中的“故障”,即可能被系統修復的異常
- 一條指令在執行過程中可能產生多次缺頁中斷,如 copy A to B
地址變換機構
重點關注與基本分頁不同的地方:
- 找到頁表項時,需要檢查是否在內存中
- 若頁面不在內存中,需要請求調頁
- 若內存空間不夠,需要換出頁面
- 頁面調入內存后,需要修改響應頁表項
請求分頁中的地址變換過程
頁面置換算法
1、最佳置換算法 OPT
每次選擇 最長時間不再被訪問 的頁面淘汰,保證缺頁率最低。由于無法預測未來,實際上是無法實現的。
2、先進先出置換算法 FIFO
每次淘汰 最早進入內存 的頁面。將頁面根據先后順序排成一個隊列,每次淘汰隊頭頁面即可。
① 分配 3 個內存塊時,缺頁次數 9 次
② 分配 4 個內存塊時,缺頁次數 10 次
Belady 異常:當為進程分配的物理塊數增大時,缺頁次數不減反增的異?,F象。只有 FIFO 算法會產生 Belady 異常,并沒有考慮到金橙世紀運行時規律。算法性能差。
3、最近最久未使用算法 LRU
每次淘汰 最近最久未使用 的頁面。性能好,但是開銷大。需要硬件支持。
4、時鐘置換算法 CLOCK / 最近未使用算法 NRU
用 (訪問位) 表示頁面狀態。0 表示未訪問過,1 表示訪問過。
算法規則:
- 某頁被訪問時,訪問位置為 1
- 第一輪:如果是 0,則將該頁換出;如果是1,則置 0 且暫不換出
- 第二輪:一定能找到訪問位為 0 的頁面
用 (訪問位,修改位) 表示頁面狀態。0 表示未被訪問 / 未被修改過,1 表示被訪問 / 修改過。
算法規則:
- 第一輪:從當前位置開始掃描到 第一個 (0,0) 的幀用于替換
- 最近沒訪問,且沒修改的頁面
- 第二輪:第一輪掃描失敗則重新掃描,找 第一個 (0,1) 的幀用于替換,同時將 掃描過的訪問位改為 0
- 最近沒訪問,但修改過的頁面
- 第三輪:第二輪掃描失敗則重新掃描,找 第一個 (0,0) 的幀用于替換
- 最近訪問過,但修改過的頁面
- 第四輪:第三輪掃描失敗則重新掃描,找 第一個 (0,1) 的幀用于替換
- 最近訪問過,且修改過的頁面
注:由于第二輪已將所有幀的訪問位置 0,因此經過第三、四輪掃描一定會有幀被選中。
請求分段存儲管理
暫無
請求段頁式存儲管理
暫無
頁面分配策略
固定分配 / 可變分配
駐留集,指請求分頁存儲管理中給進程分配的物理塊的集合。根據 駐留集大小是否可變,分為:
- 固定分配:駐留集大小不變。操作系統為每個進程分配一組固定數目的物理塊
- 可變分配:先為每個進程分配一定數目的物理塊,在進程運行期間,可根據情況做適當的增加或減少。
局部 / 全局置換
根據 頁面置換時的置換范圍,分為:
- 局部置換:發生缺頁時只能選進程自己的物理塊進行置換。
- 全局置換:可以將空閑物理塊分配給缺頁進程,也可將別的進程的物理塊置換到外存,再分配給缺頁進程。
何時調入頁面
- 預調頁策略:(運行前調入)略主要用于進程的首次調入,由程序員指出應該先調入哪些部分。
- 請求調頁策略:(進程運行期間使用)發現缺頁時,才將所缺頁面調入內存。
從何處調入頁面
對換區空間足夠
頁面的調入、調出都在內存與對換區之間進行,這樣可以保證頁面的調入、調出速度很快。在進程運行前,需將進程相關的數據從文件區復制到對換區。
對換區空間不足
不會被修改的數據,直接從文件區調入,換出時不寫回。
可能被修改的部分,換出時寫回磁盤對換區,需要時再從對換區調入。
UNIX 方式:運行前,進程數據全部放在文件區。使用過的頁面換出到對換區,需要時從對換區調入。
駐留集 / 工作集區別
- 駐留集:指請求分頁存儲管理中給進程分配的內存塊的集合。
- 工作集:指在某段時間間隔里,進程實際訪問頁面的集合。
操作系統會根據“窗口尺寸”來算出工作集。例:
某進程的頁面訪問序列如下,窗口尺寸為4,各時刻的工作集為?
駐留集大小不能小于工作集大小,否則進程運行過程中將頻繁缺頁,發生抖動現象。
總結
以上是生活随笔為你收集整理的操作系统:第三章 内存管理2 - 详解虚拟内存,页面置换算法,页面分配策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构:二叉查找树 BST 平均查找长
- 下一篇: 数据结构:严蔚敏、殷人昆快速排序规则不同