操作系統之內存管理

1. 功能

內存管理實現的功能:

  • 抽象:邏輯地址空間
  • 保護:獨立地址空間
  • 共享:訪問相同內存
  • 虛擬化:更大的地址空間

2. 管理方式

2.1 重定位

使用基址寄存器和界限寄存器,程序的起始物理地址裝載到基址寄存器中,程序的長度裝載到界限寄存器中。尋址時,地址=基址+偏移。

2.2 分段

將內存分爲堆、堆棧、數據段、代碼段等。

2.3 分頁

  • 頁幀(幀、物理頁面、Frame、Page Frame)
  • 頁面(頁、邏輯頁面、Page)
  • 頁表:頁到幀的映射,邏輯地址中的頁號是連續的,物理地址中的幀號是不連續的,不是所有的頁都有對應的幀,每個進程都有一個頁表,隨進程運行狀態而動態變化。

分頁帶來的問題:

  • 內存訪問性能問題:訪問一個內存單元需要兩次內存訪問。
  • 頁表大小問題:頁表可能非常大。

處理方法:

  • 快表:緩存
  • 多級頁表
  • 反置頁表(倒排頁表):實際內存中每個頁幀對應一個表項,用虛擬地址進行散列

2.4 段頁式

段式存儲在內存保護方面有優勢,頁式存儲在內存利用和優化轉移到後備存儲方面有優勢。段頁式是在段式存儲的管理基礎上,給每個段加一級頁表。

這種方式通過指向相同的頁表基址,容易實現進程間的內存共享。
在這裏插入圖片描述

2.5 虛擬存儲

2.5.1 基本特徵

  • 不連續:物理內存分配非連續;虛擬地址空間使用非連續。
  • 大用戶空間:提供給用戶的虛擬內存可大於實際的物理內存。
  • 部分交換:只對部分虛擬地址空間進行調入和調出。

2.5.2 缺頁異常(中斷)的處理流程

  • A.在內存中有空閒的物理頁面時,分配一物理頁幀 f,轉第 E 步
  • B.依據頁面置換算法選擇將被替換的物理頁幀 f,對應邏輯頁 q
  • C.如 q 被修改過,則把它寫回外存
  • D.修改 q 的頁表項中的駐留位爲 0
  • E.將需要訪問的頁 p 裝入到物理頁面 f
  • F.修改 p 的頁表駐留位爲 1,物理幀號爲 f
  • G.重新執行產生缺頁的指令

2.5.3 頁面置換算法

2.5.3.1 局部頁面置換算法

置換頁面的選擇範圍僅限於當前進程佔用的物理頁面內。

1. 最優算法(OPT,optimal)

思路:置換在未來最長時間不訪問的頁面。
實現:缺頁時,計算內存中每個邏輯頁面的下一次訪問時間,選擇未來最長時間不訪問的頁面。
特徵

  • 缺頁最少,是理想情況。
  • 實際系統中無法實現,無法預知每個頁面在下次訪問前的等待時間。
  • 可作爲置換算法的性能評價依據。
2. 先進先出算法(First-In First-Out,FIFO)

思路:選擇在內存中駐留時間最長的頁面進行置換。
實現:維護一個記錄所有位於內存中的邏輯頁面鏈表,鏈表元素按駐留內存的時間排序,鏈首最長,鏈尾最短。出現缺頁時,選擇鏈首頁面進行置換,新頁面加到鏈尾。
特徵

  • 實現簡單
  • 性能較差,調出的頁面可能是經常訪問的
  • 進程分配物理頁面數增加時,缺頁並不一定減少(Belady 現象):採用 FIFO 等算法時,可能出現分配的物理頁面數增加,缺頁次數反而升高的異常現象。原因:FIFO 算法的置換特徵與進程訪問內存的動態特徵矛盾,被它置換出去的頁面並不一定是進程近期不會訪問的。
  • 很少單獨使用
3. 最近最少使用算法(Least Recently Used,LRU)

思路:缺頁時,計算內存中每個邏輯頁面的上一次訪問時間,選擇上一次使用到當前時間最長的頁面。
實現:維護一個按最近訪問時間排序的頁面鏈表。
特徵:開銷比較大,每次訪問要更新鏈表。

4. 時鐘算法(Clock)

思路:僅對頁面的訪問情況進行大致統計。
數據結構:在頁表項中增加訪問位,描述頁面在過去一段時間的內存訪問情況,各頁面組織成環形鏈表,指針指向最先調入的頁面。
算法:訪問頁面時,在頁表項記錄頁面訪問情況,缺頁時,從指針處開始順序查找未被訪問的頁面進行置換。
實現:頁面裝入內存時,訪問位初始化爲 0,訪問頁面時,訪問位置 1。缺頁時,從指針當前位置順序檢查環形鏈表:訪問位爲 0,則置換該頁;訪問位爲 1,則訪問位置 0,並指針移動到下一個頁面,直到找到可置換的頁面。
特徵
是 LRU 和 FIFO 的折中。

5. 改進的 CLock 算法

思路:減少修改頁的缺頁處理(寫入外存)開銷。
算法:在頁表項增加修改位,並在訪問時進行相應修改。缺頁時,修改頁面標誌位,以跳過有修改的頁面。

6. 最不常用算法(Least Frequently Used,LFU)

思路:缺頁時,置換訪問次數最少的頁面。
實現:每個頁面設置一個訪問計數,訪問頁面時,訪問計數加 1 ,缺頁時,置換計數最小的頁面。
特徵

  • 開銷大。
  • 開始時使用頻繁,但以後不使用的頁面很難置換。解決方法:計數定期右移。
LRU、FIFO 和 Clock 的比較
  • LRU 和 FIFO 本質上都是先進先出的思路:LRU 依據頁面的最近訪問時間排序;FIFO 依據頁面進入內存的時間排序。
  • LRU 需要動態地調整順序,FIFO 的頁面進入時間是固定不變的。
  • LRU 可退化成 FIFO:如頁面進入內存後沒有被訪問,最近訪問時間與進入內存的時間相同。
  • LRU 算法性能較好,但系統開銷大;FIFO 算法系統開銷較小,但會發生 Belady 現象。
  • Clock 算法是它們的折中,頁面訪問時,不動態調整頁面在鏈表中的順序,僅做標記,缺頁時,再把它移動到鏈表末尾。
  • 對於未被訪問的頁面,Clock 和 LRU 算法的表現一樣好。對於被訪問過的頁面,Clock 算法不能記錄準確訪問順序,而 LRU 算法可以。

2.5.3.2 全局頁面置換算法

置換頁面的選擇範圍是所有可換出的物理頁面,爲進程分配可變數目的物理頁面。進程在不同階段的內存需求是變化的,分配給進程的內存也需要在不同階段有所變化。全局置換算法需要確定分配給進程的物理頁面數。

CPU 利用率與併發進程數的關係:
在這裏插入圖片描述

  • 進程數少時,提高併發進程數,可提高 CPU 利用率。
  • 併發進程導致內存訪問增加。
  • 併發進程的內存訪問會降低訪存的局部性特徵。
  • 局部性特徵的下降會導致缺頁率上升和 CPU 利用率下降。

工作集:一個進程當前正在使用的邏輯頁面集合,可表示爲二元函數W(t,△),t 是當前的執行時刻,△ 稱爲工作集窗口,即一個定長的頁面訪問時間窗口。

常駐集:在當前時刻,進程實際駐留在內存當中的頁面集合。

1. 工作集算法

換出不在工作集中的頁面。

2. 缺頁率算法

缺頁率=缺頁次數 / 內存訪問次數 或 缺頁平均時間間隔的倒數。
通過調整常駐集大小,使每個進程的缺頁率保持在一個合理的範圍內。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章