頁面置換演算法【轉】

来源:https://www.cnblogs.com/linhaostudy/archive/2019/04/20/10740865.html
-Advertisement-
Play Games

操作系統將記憶體按照頁的進行管理,在需要的時候才把進程相應的部分調入記憶體。當產生缺頁中斷時,需要選擇一個頁面寫入。如果要換出的頁面在記憶體中被修改過,變成了“臟”頁面,那就需要先寫會到磁碟。頁面置換演算法,就是要選出最合適的一個頁面,使得置換的效率最高。頁面置換演算法有很多,簡單介紹幾個,重點介紹比較重要的 ...


操作系統將記憶體按照頁的進行管理,在需要的時候才把進程相應的部分調入記憶體。當產生缺頁中斷時,需要選擇一個頁面寫入。如果要換出的頁面在記憶體中被修改過,變成了“臟”頁面,那就需要先寫會到磁碟。頁面置換演算法,就是要選出最合適的一個頁面,使得置換的效率最高。頁面置換演算法有很多,簡單介紹幾個,重點介紹比較重要的LRU及其實現演算法。

一、最優頁面置換演算法

最理想的狀態下,我們給頁面做個標記,挑選一個最遠才會被再次用到的頁面。當然,這樣的演算法不可能實現,因為不確定一個頁面在何時會被用到。

二、最近未使用頁面置換演算法(NRU)

系統為每一個頁面設置兩個標誌位:當頁面被訪問時設置R位,當頁面(修改)被寫入時設置M位。當發生缺頁中斷時,OS檢查所有的頁面,並根據它們當前的R和M位的值,分為四類:

(1)!R&!M(2)!R&M(3)R&!M(4)R&M

編號越小的類,越被優先換出。即在最近的一個時鐘滴答內,淘汰一個沒有被訪問但是已經被修改的頁面,比淘汰一個被頻繁使用但是“clean”的頁面要好。

三、先進先出頁面置換演算法(FIFO)及其改進

這種演算法的思想和隊列是一樣的,OS維護一個當前在記憶體中的所有頁面的鏈表,最新進入的頁面在尾部,最久的在頭部,每當發生缺頁中斷,就替換掉表頭的頁面並且把新調入的頁面加入到鏈表末尾。

這個演算法的問題,顯然是太過於“公正了”,沒有考慮到實際的頁面使用頻率。

一種合理的改進,稱為第二次機會演算法。即給每個頁面增加一個R位,每次先從鏈表頭開始查找,如果R置位,清除R位並且把該頁面節點放到鏈表結尾;如果R是0,那麼就是又老又沒用到,替換掉。

四、時鐘頁面置換演算法(clock)

這種演算法只是模型像時鐘,其實就是一個環形鏈表的第二次機會演算法,表針指向最老的頁面。缺頁中斷時,執行相同的操作,包括檢查R位等。

image

五、最近最少使用頁面置換演算法(LRU)

缺頁中斷發生時,置換未使用時間最長的頁面,稱為LRU(least recently used)。

LRU是可以實現的,需要維護一個包含所有頁面的鏈表,並且根據實時使用情況更新這個鏈表,代價是比較大的。

於是,需要對這個演算法進行一些改進,也可以說是簡化。將每一個頁面與一個計數器關聯,每次時鐘終端,掃描所有頁面,將每個頁面的R位加到計數器上,這樣就大致跟蹤了每個頁面的使用情況。這種方法稱為NFU(not frequently used,最不常用)演算法。

這樣還是存在一個問題,即很久之前的一次使用,與最近的使用權重相等。

所以,再次改進,將計數器在每次時鐘滴答時,右移一位,並把R位加在最高位上。這種演算法,稱為老化(aging)演算法,增加了最近使用的比重。

老化演算法只能採用有限的位數,所以可能在一定程度上精度會有所損失。

image

六、工作集演算法

簡單來說,工作集就是在最近k次記憶體訪問所使用過的頁面的集合。原始的工作集演算法同樣代價很大,對它進行簡化:在過去Nms的北村訪問中所用到的頁面的集合。

所以,在實現的時候,可以給每個頁面一個計時器。需要置換頁面時,同實際時間進行對比,R為1,更新到現在時間;R為0,在規定閾值之外的頁面可以被置換。

同樣,這個演算法也可以用時鐘的思想進行改進。

image

七、Linux使用的頁面置換演算法

Linux區分四種不同的頁面:不可回收的、可交換的、可同步的、可丟棄的。

  • 不可回收的:保留的和鎖定在記憶體中的頁面,以及內核態棧等。

  • 可交換的:必須在回收之前寫回到交換區或者分頁磁碟分區。

  • 可同步的:若為臟頁面,必須要先寫回。

  • 可丟棄的:可以被立即回收的頁面。

Linux並沒有像我們之前單純討論演算法時那樣,在缺頁中斷產生的時候才進行頁面回收。Linux有一個守護進程kswapd,比較每個記憶體區域的高低水位來檢測是否有足夠的空閑頁面來使用。每次運行時,僅有一個確定數量的頁面被回收。這個閾值是受限的,以控制I/O壓力。

每次執行回收,先回收容易的,再處理難的。回收的頁面會加入到空閑鏈表中。

演算法是一種改進地LRU演算法,維護兩組標記:活動/非活動和是否被引用。第一輪掃描清除引用位,如果第二輪運行確定被引用,就提升到一個不太可能回收的狀態,否則將該頁面移動到一個更可能被回收的狀態。

處於非活動列表的頁面,自從上次檢查未被引用過,因而是移除的最佳選擇。被引用但不活躍的頁面同樣會被考慮回收,是因為一些頁面是守護進程訪問的,可能很長時間不再使用。

image

另外,記憶體管理還有一個守護進程pdflush,會定期醒來,寫回臟頁面;或者可用記憶體下降到一定水平後被內核喚醒。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • anoPC-T2製作刷機包 前提:到友善的wiki中,仔細看編譯uboot、內核、製作刷機包的教程。 準備工作: 1、 虛擬機Ubuntu安裝,並安裝n多軟體可以支撐編譯內核等等。 2、 安裝交叉編譯器,參考wiki-8.1。 3、 下載友善修改好的uboot、內核源代碼,debian_nanopi ...
  • Linux的用戶是以組為單位,每個用戶都屬於某一個組,而用戶組的許可權,是指某個用戶對某個文件(文件夾)的操作許可權,這裡涉及用戶組的概念。 其中root用戶擁有全Linux系統中最高的許可權,比任何其他用戶的許可權都高,可以修改任意文件和用戶。 用戶組的作用:就用於標識同一種類型的用戶,這樣可以給一組用戶 ...
  • 1.vim編輯器 vim操作命令 --在命令模式下進行 底線命令模式: 2.用戶管理和文件目錄許可權 linux下麵的用戶及許可權: root用戶: 超級管理員, 相當於QQ群裡面的群主 普通用戶: 可以做一些簡單的操作, 如果需要做系統服務相關的操作,需要授權 3.文件許可權詳解 4.sudo命令用法 ...
  • You believe it or not there is a feeling, lifetime all not lost to time. 在Linux上部署Web項目 這個是普通的web項目,若是其他項目如大數據,則要安裝下hadoop集群和kms、hdfs、hive等插件後才可用在該環境基 ...
  • 4 How Interrupts work 與遵循樹的自然結構的地址範圍轉換不同, 中斷信號可以起源於或者終止於板卡上的任何設備。 與設備樹中自然表示的設備定址不同,中斷信號的表示獨立於設備樹節點之間的連接。通常用下麵的四個屬性來描述一個中斷連接: interrupt-controller - 一個 ...
  • 主要用途:用於內部網路和網路服務供應商自動分配IP地址給用戶 用於內部網路管理員作為對所有電腦作集中管理的手段 使用場景:自動化安裝系統 解決IPV4資源不足問題 DHCP共有八種報文: 常見的為前四種報文 DHCP DISCOVER:客戶端到伺服器 DHCP OFFER :伺服器到客戶端 DHCP ...
  • Linux 用戶及許可權詳解 用戶 , 組 ,許可權 安全上下文(secure context); 許可權: r,w,x 文件: r : 可讀,可以使用類似cat 等命令查看文件內容。 w : 可寫,可以編輯或刪除此文件; x : 可執行,eXcutable, 可以命令提示符下當做命令提交給內核運行; 目 ...
  • 實驗一:創建kickstart文件實現用網路來進行半自動化安裝系統 1. 安裝圖形化工具來製作應答文件 yum install system-config-kickstart 也可參考/root目錄下自帶的 anaconda-ks.cfg 文件,進修修改。 註:6系統和7系統為各自不同的應答文件,需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...