內存管理 : 06 內存換出

內存換出的重要性及與換入的關系

現在我們講第25講,主題是內存的換出(swipe out)。實際上,上一講我們講的是內存的換入,而這一節聚焦于內存的換出。在這里插入圖片描述
換入和換出必須合在一起工作,不能只有換入而沒有換出。上節課也提到,換入換出合在一起的目的是實現虛擬內存。我們有一個0 - 4g的完整虛擬內存空間,但物理內存可能只有1g。這就好比倉庫很大,而門店空間有限。當我們訪問虛擬地址、需要虛擬頁時,就要從磁盤上把這一頁換到內存中。然而,如果只進行換入,不斷地將內容從磁盤換到內存,遲早內存會滿。所以,有換入就必須有換出,這樣才能空出物理內存,讓新的內容換入,保證系統合理工作。

內存換出算法的引出

換出操作涉及到選擇哪一頁淘汰的算法,這個算法與get free page相關。在這里插入圖片描述
get free page用于獲取物理空閑頁,它出現在頁面中斷處理程序do no page(14號中斷的處理程序)中。在這個程序里,首先會申請一個空閑頁,然后從磁盤上讀入。但內存有限,并非總有新的空閑頁,所以在申請空閑頁時,如果空閑頁不夠,就需要找一頁換出去,再進行申請,這部分代碼就應該放在這里。接下來我們就來探討有哪些算法可以用于選擇換出的頁面。

常見的頁面置換算法

  1. 先來先出(FIFO)算法在這里插入圖片描述

    • 最開始能想到的頁面置換算法就是先來先出。這種調度方法本質上和資源分配、剝奪相關,和最大化、最小化問題沒有本質區別。我們通常從最簡單的先來先服務問題開始思考調度算法,然后分析其問題,逐步提出更好的算法。
    • 例如,我們分配了三個頁框,頁面訪問序列為A、B、C、A、B、D。A來了放入1號頁框,B來了放入,C來了也放入。此時A又來,由于頁框已滿,按照先來先出原則,把最先進入的A換出。接著D來了,再把B換出。但這里存在問題,D剛把A換出去,A馬上又來,導致頻繁換入換出,增加了磁盤讀寫操作,降低了指令執行速度。這說明先來先服務算法存在缺點,我們需要改進。
  2. 最優(OPT)算法在這里插入圖片描述

    • 為了改進FIFO算法的不足,我們引出了最優算法(OPT)。還是以上面的例子,當D要換入時,我們往后看,發現A和B馬上會被使用,而C是未來才會使用,所以換出C是最合適的。這樣操作后,產生缺頁的次數從原來的7次減少到5次,效果變優。
    • 然而,最優算法存在一個嚴重問題,它需要知道將來會訪問哪一頁,但在實際執行過程中,我們無法預知程序將來會執行哪一頁,所以這個算法理論上很完美,但在實際中無法使用。
  3. 最近最少使用(LRU)算法在這里插入圖片描述

    • 由于無法預知未來,人們想到用過去的歷史去預測未來,這就是LRU算法的核心思想。程序往往具有局部性,在一段時間內會在一定范圍內不斷訪問某些頁面。例如在while循環中,會反復訪問相關頁面。所以,歷史上最近一段時間老使用的頁面,待會兒也很可能會使用;而最近一段時間沒有使用的頁面,我們可以預測未來也不太可能使用,就將其淘汰。
    • 同樣以A、B、C、A、B、D的訪問序列為例,當D要換入時,最近最少使用的是C,所以把C換出。后續操作中,LRU算法的缺頁次數也是5次,效果不錯。在實際系統中通過實驗驗證,LRU算法確實是公認的很好的頁面置換算法。
  4. LRU算法的實現及問題在這里插入圖片描述

    • 時間戳實現:最常想到的LRU算法實現方式是使用時間戳。為每個頁面維護一個時間戳,記錄頁面的使用時刻。每次訪問頁面時,更新其時間戳。當需要換出頁面時,選擇時間戳最小的頁面。但這種方法在實際操作系統中代價太大,因為每執行一條指令,都要訪問邏輯頁,查頁表進行地址翻譯,此時都需要針對當前在內存中的頁面維護時間戳,不僅要修改時間戳,還可能面臨時間戳溢出的問題,會極大地降低計算機運行速度,不可行。在這里插入圖片描述

    • 頁面棧實現:另一種實現方式是使用頁面棧。棧的頂部始終保留最近使用的頁面,其他頁面按照使用順序排列。每次訪問頁面時,將該頁面移動到棧頂。當需要換出頁面時,選擇棧底的頁面。但這種方式同樣存在問題,每次訪問頁面都需要調整棧中頁面的位置,即使使用指針實現,也需要修改多次指針,實現代價也很大,在實際系統中也不實用。

    • 因此,LRU算法雖然理論上優秀,但準確實現困難,需要進行近似實現。

  5. Clock算法(二次機會算法)在這里插入圖片描述

    • 基本思想:為了近似實現LRU算法,我們引入引用位(reference bit)。每訪問一頁,就將其引用位置為1,表示該頁被訪問過。當需要淘汰頁面時,如果引用位為1,就將其置為0,不淘汰該頁,再給它一次機會;如果引用位為0,說明該頁最近沒有被訪問過,就將其淘汰。這是對LRU算法的一種近似,它不是嚴格的最近最少使用,而是基于最近是否使用來決定是否淘汰頁面。

    • 效率與問題:這種算法的效率相對較高,因為每訪問一頁,只需要修改一位引用位,而且MMU查頁表時可以自動將訪問頁面的引用位置為1。然而,它對LRU的近似效果不好。由于程序具有局部性,缺頁通常很少發生。當缺頁很少時,頁面會被頻繁訪問,引用位會一直保持為1,導致指針掃描時,所有頁面的引用位都為1。一旦缺頁,指針掃描會將所有引用位都置為0,然后按順序換出頁面,這樣就退化成了FIFO算法,失去了LRU算法的思想,頁面置換效果變差。

  6. 改進的Clock算法在這里插入圖片描述

    • 問題分析與解決:為了解決上述Clock算法的問題,我們需要分析原因。二次機會算法退化成FIFO的原因是引用位記錄了太長的歷史信息,指針掃描速度太慢,無法體現“最近”的概念。所以,解決的核心在于定時清除引用位,縮短其記錄信息的時間。我們可以使用一個掃描指針定時將引用位置為0,這樣就能體現最近一段時間內頁面是否被使用。當淘汰頁面的指針掃描時,如果發現頁面引用位為0,就將其淘汰,這樣更符合LRU算法的思想。
    • 命名由來:這種改進后的算法,一個指針快速清除引用位,一個指針慢速掃描淘汰頁面,就像時鐘的指針轉動,所以被稱為Clock算法。在實際系統中,將定時清除引用位的操作放在時鐘中斷中,淘汰頁面的操作放在缺頁時get free page前面,通過這些程序的相互配合,實現了對LRU算法的近似,完成頁面換出操作。

進程頁面分配數量問題

在解決了頁面換出算法后,還需要考慮一個附帶問題,即應該給一個進程分配多少個頁框。分配的頁框數量過多,會浪費系統內存;分配過少,會產生顛簸問題。在這里插入圖片描述

  1. 顛簸現象:當進程數量過多時,給每個進程分配的頁框就會減少,導致每個進程的缺頁率增加。例如,一個進程本需要4頁內存,但只分配了3頁。在執行過程中,剛把第4頁換出,馬上又需要使用,再換入第4頁時,又會導致其他某一頁被換出,如此反復,不停缺頁。每次缺頁都要啟動磁盤進行頁面換入換出,CPU需要等待磁盤操作完成,導致CPU利用率急劇下降,這種現象就是系統顛簸。系統一旦出現顛簸,效率會變得很低,用戶程序無法正常推進,用戶體驗變差。
  2. 合理分配數量:為了避免顛簸,分配給進程的頁框個數應該能夠覆蓋住程序訪問內存的局部。但這個局部的大小很難確定,因為程序的執行情況復雜,包含循環、條件語句等多種結構。雖然有一些算法可以計算工作集來確定局部大小,進而確定合理的頁框分配數量,但在一些基本的操作系統中,也可以采用近似算法,根據缺頁情況動態調整頁框分配數量。例如,如果缺頁較多,就多分配幾個頁框;如果缺頁較少,就少分配幾個頁框。總之,要合理調整給進程分配的頁框數量,避免顛簸現象的發生。

換入換出與操作系統整體架構在這里插入圖片描述

當我們確定好給進程分配的頁框數量后,就可以形成一個Clock的環形數組,應用Clock算法進行頁面淘汰和內存換出操作。結合之前講的內存換入(當訪問地址缺頁時,進行缺頁中斷,從磁盤讀入一頁,若頁框不足,使用Clock算法換出一頁,再將新頁換入),這就構成了完整的內存換入換出過程,也就是著名的swap分區的工作原理。在安裝Linux時,通常會讓用戶安裝swap分區,它的工作就是進行內存的換入換出。
實現換入換出是為了實現虛擬內存,而虛擬內存又是為了實現分頁,分頁是操作系統管理內存的重要思想,目的是讓程序能夠載入并執行起來,最終落實到進程的運行。內存管理和進程管理是操作系統的核心部分,再加上外圍的設備驅動、文件系統、系統接口以及系統初始化和引導等模塊,就構成了一個完整的操作系統。如果能夠深入理解這些內容,將其融會貫通,就能對操作系統有更深刻的認識,甚至有可能自己設計和實現一個操作系統,或者在實際操作系統中進行模塊設計和修改 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第一節 51單片機概述

目錄 一、單片機系統組成 (一)、單片機硬件系統 (二)單片機的軟件系統 二、STC89C52單片機 (1)、基本信息 (2)、命名規則 (3)、單片機內部結構圖 &am…

前端面試準備-4

1.React Router的history模式中,push和replace有什么區別 都是用于頁面導航,但是他們對瀏覽器歷史記錄的處理不一樣。 ①:push是在瀏覽歷史棧里加入一條新的瀏覽歷史,點擊返回鍵會返回上一個頁面 ②;replace是替換當前歷史記錄…

【機器學習基礎】機器學習入門核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)

機器學習入門核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation) 一、算法邏輯Jaccard相似度 (Jaccard Index)**Pearson相似度 (Pearson Correlation)** 二、算法原理與數學推導1. Jaccard相…

Unity3D仿星露谷物語開發57之保存庫存信息到文件

1、目標 保存下面庫存欄中信息到文件中。 2、修改SceneSave.cs腳本 添加2行代碼: 3、修改InventoryManager對象 添加Generate GUID組件。 4、修改InventoryManager.cs腳本 添加繼承自ISaveable 添加屬性信息: private string _iSaveableUniqueID;pub…

測量3D翼片的距離與角度

1,目的。 測量3D翼片的距離與角度。說明: 標注A 紅色框選的區域即為翼片,本示例的3D 對象共有3個翼片待測。L1與L2的距離、L1與L2的角度即為所求的翼片距離與角度。 2,原理。 使用線結構光模型(標定模式&#xff0…

深入理解 SQL 的 JOIN 查詢:從基礎到高級的第一步

在處理數據庫時,我們常常需要從多個表中提取數據。比如想知道一個城市的天氣情況,同時又想知道這個城市的具體位置。這就需要將 weather 表和 cities 表結合起來查詢。這種操作在 SQL 中被稱為 JOIN 查詢。 現在看下兩種表的情況 1.weather 表&#xff…

上傳頭像upload的簡易方法,轉base64調接口的

1.首頁使用el-image顯示數據&#xff0c;用的是轉base64后端返給的 <el-table-column prop"avatar" align"center" label"頭像"><template #default"scope"><el-image style"height: 40px;width: 40px;" :sr…

[AD] CrownJewel-1 Logon 4799+vss-ShadowCopy+NTDS.dit/SYSTEM+$MFT

QA QA攻擊者可以濫用 vssadmin 實用程式來建立卷影快照&#xff0c;然後提取 NTDS.dit 等敏感檔案來繞過安全機制。確定卷影複製服務進入運作狀態的時間。2024-05-14 03:42:16建立卷影快照時&#xff0c;磁碟區複製服務會使用機器帳戶驗證權限並列舉使用者群組。找到卷影複製過…

rtpmixsound:實現音頻混音攻擊!全參數詳細教程!Kali Linux教程!

簡介 一種將預先錄制的音頻與指定目標音頻流中的音頻&#xff08;即 RTP&#xff09;實時混合的工具。 一款用于將預先錄制的音頻與指定目標音頻流中的音頻&#xff08;即 RTP&#xff09;實時混合的工具。該工具創建于 2006 年 8 月至 9 月之間。該工具名為 rtpmixsound。它…

GitHub 趨勢日報 (2025年05月28日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 2379 agenticSeek 1521 computer-science 841 n8n 577 langflow 351 qlib 282 skt…

threejsPBR材質與紋理貼圖

1. PBR材質簡介 本節課沒有具體的代碼&#xff0c;就是給大家科普一下PBR材質&#xff0c;所謂PBR就是&#xff0c;基于物理的渲染(physically-based rendering)。 Three.js提供了兩個PBR材質相關的APIMeshStandardMaterial和MeshPhysicalMaterial,MeshPhysicalMaterial是Mes…

Android 12系統源碼_多屏幕(四)自由窗口模式

一、小窗模式 1.1 小窗功能的開啟方式 開發者模式下開啟小窗功能 adb 手動開啟 adb shell settings put global enable_freeform_support 1 adb shell settings put global force_resizable_activities 11.2 源碼配置 copy file # add for freedom PRODUCT_COPY_FILES …

C# 將HTML文檔、HTML字符串轉換為圖片

在.NET開發中&#xff0c;將HTML內容轉換為圖片的需求廣泛存在于報告生成、郵件內容存檔、網頁快照等場景。Free Spire.Doc for .NET作為一款免費的專業文檔處理庫&#xff0c;無需Microsoft Word依賴&#xff0c;即可輕松實現這一功能。本文將深入解析HTML文檔和字符串轉圖片兩…

【HTML-15.2】HTML表單按鈕全面指南:從基礎到高級實踐

表單按鈕是網頁交互的核心元素&#xff0c;作為用戶提交數據、觸發操作的主要途徑&#xff0c;其重要性不言而喻。本文將系統性地介紹HTML表單按鈕的各種類型、使用場景、最佳實踐以及高級技巧&#xff0c;幫助開發者構建更高效、更易用的表單交互體驗。 1. 基礎按鈕類型 1.1…

吳恩達MCP課程(4):connect_server_mcp_chatbot

目錄 完整代碼代碼解釋1. 導入和初始化2. 類型定義3. MCP_ChatBot 類初始化4. 查詢處理 (process_query)5. 服務器連接管理6. 核心特性總結 示例 完整代碼 原課程代碼是用Anthropic寫的&#xff0c;下面代碼是用OpenAI改寫的&#xff0c;模型則用阿里巴巴的模型做測試 .env 文…

C++內存學習

引入 在實例化對象時&#xff0c;不管是編譯器還是我們自己&#xff0c;會使用構造函數給成員變量一個合適的初始值。 但是經過構造函數之后&#xff0c;我們還不能將其稱為成員變量的初始化&#xff1a; 構造函數中的語句只能稱為賦初值&#xff0c;而不能稱作初始化 因為初…

MySQL 大戰 PostgreSQL

一、底層架構對比 ??維度????MySQL????PostgreSQL????存儲引擎??多引擎支持&#xff08;InnoDB、MyISAM等&#xff09;單一存儲引擎&#xff08;支持擴展如Zheap、Zedstore&#xff09;??事務實現??基于UNDO日志的MVCC基于堆表(Heap)的MVCC??鎖機制??…

基于FPGA的二叉決策樹cart算法verilog實現,訓練環節采用MATLAB仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) MATLAB訓練結果 上述決策樹判決條件&#xff1a; 分類的決策樹1 if x21<17191.5 then node 2 elseif x21>17191…

【RAG】RAG綜述|一文了解RAG|從零開始(下)

文章目錄 5. RAG的架構5.1 Naive RAG5.2 Advanced RAG5.2.1 檢索前處理和數據索引技術5.2.2 知識分片技術5.2.3 分層索引5.2.4 檢索技術5.2.4.1 優化用戶查詢5.2.4.2 通過假想文檔嵌入修復查詢和文檔不對稱5.2.4.3 Routing5.2.4.5 自查詢檢索5.2.4.6 混合搜索5.2.4.7 圖檢索5.2…

山東大學軟件學院項目實訓-基于大模型的模擬面試系統-面試官和面試記錄的分享功能(2)

本文記錄在發布文章時&#xff0c;可以添加自己創建的面試官和面試記錄到文章中這一功能的實現。 前端 首先是在原本的界面的底部添加了兩個多選框&#xff08;后期需要美化調整&#xff09; 實現的代碼&#xff1a; <el-col style"margin-top: 1rem;"><e…