非全局页面置换算法
1 先進先出算法(FIFO)
1.1 基本思路:
選擇在內存中駐留時間最長的頁面并淘汰之. 具體來說, 系統維護著一個鏈表, 記錄了所有位于內存當中的邏輯頁面. 從鏈表的排列順序來看, 鏈首頁面的駐留時間最長, 鏈尾頁面的駐留時間最短. 當發生一個缺頁中斷時, 把鏈首頁面的淘汰出局, 并把新的頁面添加到鏈表的末尾.
1.2 評價:
性能較差, 調出的頁面有可能是要經常要訪問的頁面, 并且有Belady現象. 很少單獨使用.
2 最近最久未使用算法(LRU)
2.1 基本思路
當一個缺頁中斷發生時, 選擇最久未使用的那個頁面, 并淘汰之.
2.2 原理
它是對最優頁面置換算法的一個近似, 其依據是程序的局限性原理, 即在最近一小段時間內, 它們還可能會再一次被頻繁的訪問. 反過來說, 如果在過去某些頁面長時間未被訪問, 那么在將來它們還可能會長時間地得不到訪問.
2.3 評價
LRU算法需要記錄某個和頁面使用時間的先后順序, 開銷比較大, 兩種可能的實現方法是:
3 時鐘頁面置換算法
時鐘頁面置換算法, LRU的近似, 對FIFO的一種改進.
3.1 基本思路:
3.2 流程
時鐘頁面置換算法圖示:???
1. 假設內存中有四個物理頁幀, A, B, C, D, 某一時刻有四個邏輯頁面a, b, c, d與其對應(lp代表最末指針):
2. 假設此時來了一堆邏輯頁號的訪問請求序列: c, a, d, b, e, b, a, b, c, d, 那么有在訪問前四個頁號c, a, d, b時都不會產生缺頁中斷, 但是在訪問邏輯頁號e時, 此時e會產生缺頁中斷, 那么此時需要找到被替換的邏輯頁, 此時lp指向a, 但是a所對應的物理頁幀A的訪問位是1, 所以把A的訪問位置為0, 然后指針移向b:
3. 這次循環下去發現b c d的訪問位都是1, 所以都置為0, 然后lp回到a:
4. 發現a對應的A的訪問位是0, 那么把其替換為e, 并把e的訪問位置為1, 把lp移到b:
5. 訪問b的請求來了, 把b對應的B的訪問位置為1:
6. 訪問a的請求來了, 產生缺頁中斷, 此時lp在b, 但是b的訪問位為1, 那么置為0, 然后吧lp移向c, 發現c的訪問位是0, 直接替換為a, 并把訪問位置為1, 把lp移向d:
7. b的訪問請求來了, 沒有產生缺頁中斷, 把b的訪問位置為1:
8. c的訪問請求來了, 產生缺頁中斷, 此時lp在d, 訪問位是0, 那么直接替換掉, 訪問位置為1, lp移動到e:
9. d的訪問請求來了, 產生缺頁中斷, 此時lp在e, 但是e b a 對應的物理頁幀的訪問位都是1, 所以轉一圈把所有訪問位都置為1之后又回到了e, 此時e對應的A的訪問位為0, 那么把其替換成d, 且訪問位置為1, 然后把lp移至下一位b:
4 二次機會法
clock算法的不足: 將頁面置換出去需要寫入硬盤, 代價較大. 頁表項中不僅有訪問位, 還有寫入位, 代表著這個物理頁幀從硬盤到物理內存后(首次載入或者上次被置換進來)是否被寫入過, 如果在置換算法中需要將一個頁置換出去, 其對應的物理頁幀的寫入位是0, 那么不需要將其物理頁幀內容寫入硬盤, 只需要將其直接釋放即可.
二次機會法思路: 與clock算法類似, 也是維護一個環形鏈表, 當發生頁中斷時, 檢查指針指向的頁對應的頁表項的訪問位和寫入位, 如果都是0, 那么直接置換該頁. 如果訪問位及寫入位有且僅有一位是1, 如果訪問位和寫入位都是1, 那么就把訪問位置為0, 寫入位置為1.
5 最不常用算法
思路: 缺頁中斷產生時, 選擇訪問次數最少的頁作為被置換的頁.
總結
- 上一篇: vue.js能美化界面吗_vue将单页面
- 下一篇: avro 序列化java_Avro 对象