内存管理 : 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…