操做系統以內存管理

操做系統內存管理

1、內存管理策略

1.背景

基本硬件(基地址與界限地址)算法

地址綁定(編譯時、加載時、 運行時)數組

邏輯地址空間與物理地址空間spa

memory1.jpg

動態加載操作系統

動態連接與共享庫(與靜態庫對比)線程

2.交換(內存與磁盤間)

維護着一個可運行進程就緒隊列,進行內存與磁盤間線程的載入與存出。3d

3.連續內存分配

內存分區之可變分區的思想,將內存分紅一個個孔(hole),使用一張表維護hole的使用狀況。blog

存在碎片問題(分爲外碎片與內碎片)隊列

  • 首次適應--首個足夠大的孔(50%規則,描述碎片多)
  • 最優適應--最小合適的孔
  • 最差適應--最大孔

外部碎片大,解決思路有 緊縮分頁、分段(運行物理地址不連續的策略)進程

4.分段

將內存分爲不一樣長度的段,維護分段硬件支持段表內存

<段名稱s,段偏移d>

memory5.jpg

5.分頁

物理內存分爲固定大小的塊,稱爲幀。邏輯內存也分爲一樣大小的塊,稱爲頁。

<頁碼p,頁偏移> 與對應的頁表

memory3.jpg
memory4.jpg

TLB 帶Hash頁表--轉換表緩衝區

保護機制與共享頁

memory7.jpg

memory8.jpg

6.頁表結構補充

分層頁表

哈希頁表(數組+鏈表)

倒置頁表

2、虛擬內存管理

1.背景

使用虛擬內存來邏輯內存容量--分配出去但未使用的內存空間,經過僞分配實現擴容。

2.請求調頁

概念:僅在須要時,才加載頁面。

調頁程序--惰性變換器實現

memory9.jpg

通常缺頁錯誤的處理很簡單:

  1. 檢查這個進程的內部表,以確認該引用是有效的仍是無效的內存訪問。
  2. 若是引用無效,那麼終止進程。若是引用有效可是沒有調入內存,那麼如今就調入。
  3. 找到一個空閒幀。
  4. 調度一個磁盤操做,以將所需頁面讀到剛分配的幀。
  5. 磁盤讀取完成,修改進程內部表和頁表。以指示該頁如今處於內存中。
  6. 從新啓動被陷入中斷的指令。該進程能訪問所須要的頁面,就好像原來他就在內存中同樣。

memory10.jpg

缺頁處理的時間花費主要體如今:處理缺頁中斷、讀入頁面、從新啓動進程

3.寫時複製(父子進程間)

4.頁面置換

​ 當用戶進程在執行時,可能發生缺頁錯誤。操做系統肯定所須要頁面的磁盤位置,可是卻發現內存上沒有空閒的幀。全部內存都在使用。此時,它會選擇交換出一個進程,以釋放它在全部幀並下降多道程序。

​ 在沒有空閒幀的狀況下,那麼就要查找當前不在使用的一個幀,並釋放它,犧牲幀,他被換出到交換空間,並修改它的頁表。能夠看到當沒有空閒幀的狀況下,須要兩個頁面傳輸(一個傳入,一個傳出)。這種狀況世界加倍了缺頁錯誤處理時間,並增長了有效的訪問時間。 爲了減小置換的時間,系統提供了一個修改位,二者的關聯採用硬件。每當一個頁面內的任何字節被寫入時,它的頁面修改位會由硬件來設置,以表示該頁面被修改過。當要選擇一個頁面置換時,它會先看這個頁面或者幀有沒有被修改過,若是沒有修改過就不用將它換出,直接進行換入,將它的空間覆蓋。

頁面置換算法

  • FIFO 先進先出
  • OPT/MIN 最優置換
  • LRU 最近最少使用
  • 近似LRU

    1. 額外引用位算法 (多位標誌位)
    2. 第二次機會算法(1位標誌位)
    3. 加強型第二次機會算法-分類(元組分類出最近使用與須要寫回)
  • 基於計數

    1. LFU 最不常常使用
    2. MFU 最常常使用

      搭配上頁面緩衝算法--最近被淘汰的頁面被放置在高速磁盤區,減小淘汰錯誤頁面下次換回的代價

5.幀分配

分配算法--平均與比例

全局分配與局部分配(區別,是否面向全部進程的內存暑假頁)

6.系統抖動

頻繁發生頁面置換

7.內存映射文件與IO

相關文章
相關標籤/搜索