当前位置: 首页 > news >正文

《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)

文章目录

  • 1. 最近最久未使用算法的工作原理
  • 2. 最近最久未使用算法示例
  • 3.LRU算法实现
    • 3.1 LRU的页面链表实现
    • 3.2 LRU的活动页面栈实现
    • 3.3 链表实现 VS 堆栈实现

1. 最近最久未使用算法的工作原理

在这里插入图片描述最近最久未使用页面置换算法,简称 LRU, 算法思路:当缺页中断产生之后,要替换哪个页?选择最久未被使用的页,要置换这个页。

最久未被使用和前面的 FIFO 算法里面最长驻留时间不是一个概念。最长驻留时间是存在时间很久,但是它可能最近被访问过,但是最久未被使用页是说它可能很长时间程序都没有读或写页的内容,这叫最久未被使用,所以它和 FIFO 算法的依据是不一样的,它的页面特征是不一样。

本质上来说它是对最优置换算法的近似

它是根据过去来推测应该把哪个页给换出去,而不是根据未来。最优置换算法替换是将来最远未被使用页,将来很久都没被使用的页面,那个页面会被淘汰出去,而这个是过去很长时间都没访问的页,这两个正好在两头。
~  
LRU 算法其实是根据历史来推测未来,最优置换算法是根据未来推测未来,但是在不知道未来情况下,那根据过去的访问情况来推测将来访问情况,也是一种合理的选择。
~  
那这个合理性是基于程序的局部性原理,程序运行过程中具有一定局部性特征,时间局部性和空间局部性,在最近一段时间之内,程序访问的代码和数据,在未来一段时间也还有很大的概率还会持续访问,还会被频繁访问,这是局部性,有了局部性之后,LRU 的依据就是合理了。
~  
既然有这么一个特征,那么如果说在当前这段时间之内,某些页没有被访问,那也意味着接下来一小段时间它也很可能没被访问,这是局部性原理的反推,基于这个特征,如果程序是具有局部性特征的程序,LRU算法其实会比较好地预测未来发生情况。

2. 最近最久未使用算法示例

在这里插入图片描述

还是刚才访问序列,如果采取 LRU 算法会产生多少次访问中断,还是同样的一幅图:

  1. 前四次 1 2 3 4 访问序列是 c a d b,刚才已经说这几个页都在物理内存中,所以不会产生缺页中断
  2. 第五次时,依据 LRU 算法,把最久未被使用页面给替换出去, a 页面访问时刻是2 ,b 是 4 时刻,c 是1时刻访问,d 是 3 时刻,很显然 c 是最久未被访问页,所以当第 5 个时刻访问 e 时候,需要去替换最久没有访问页是 c。
  3. 访问 b, b 还在物理页中,所以不会产生中断。那么 6 7 8 这三个时刻访问页序列,由于 a 和 b 都还在物理内存中,所以不会产生中断
  4. 第 9 个时刻要访问 c 了,那么应该换出哪个页?a 是在第7个时刻访问,b 是在第8个时刻访问,都是离这个 c 很近,但不代表很久,d 是在第3时刻访问,而 e 是在第5时刻访问,那么很明显在这里面就是 d 页面是最久未被访问页面,所以说会把 d 给换出去,然后把 c 换进来,产生第二次缺页中断
  5. 接下要访问 d,刚把 d 换出去,这时候应该换哪页?当前最久未被访页是 e,所以说要把 e 给换出去

采取 LRU 算法之后产生了三次中断,比 FIFO 算法要少一些。

3.LRU算法实现

LRU算法找的是最久未被访问页,如果要有效实现算法,它需要记录每个页使用时间的先后顺序。主要采取某种方法记录起来,记录时间顺序的执行开销是比较大的,目前有两种可能的实现方法

3.1 LRU的页面链表实现

在这里插入图片描述
第一个是用链表来实现,如果说系统里面能够维护一个当前访问的页面链表,那么最近刚刚访问的页面作为首节点,放在链表的头,而最久未被使用页面放在链表的尾。

当运行程序访问内存的时候,需要看看这个内存对应的这个页是否在这个链表里面。如果在这链表里面,需要把这个页从某一位置替到链表头上,因为它当前正在被访问,代表最近访问页。如果没有的话,就把这个页插入链表中。

如果产生一次缺页中断,需要替换链表中的某一页,很明显,因为链表会把最近访问页靠近链表头,只有最久访问页放在链表尾,所以直接从链表尾把这个页给摘出来,就可以作为要替换出去的页,这是一种方法。

3.2 LRU的活动页面栈实现

在这里插入图片描述
第二个办法用堆栈,设置一个当前访问页的堆栈,当访问某个页时候就把这个页先压入栈顶,然后再考察栈内是否有跟这个页相同的页号,如果有,把这个页抽出来不要了,因为已经把页压到里面去了,但它需要去查找在这个栈中是否已经存在这个页号,如果存在踢出去,这个查找过程开销比较大。和刚才说的链表查找过程是一样的,都需要去查找在链表和堆栈中这个页是否存在。

如果又产生缺页中断,需要淘汰一页,那淘汰哪个?就要选择堆栈的栈底,就类似前面链表的尾部页面,因为这个页面代表它最久未被访问的页面。

刚刚那个图做例子,如果用所谓堆栈的办法来实现,就这么操作过程:
在这里插入图片描述
底下有 LRU 配置的 stack,就是分配一个堆栈,当每一次访页,就把这个页号压在里面去,同时还要看看这里面是否存在相同的页号,如果有把它剔出去。

  1. 当走到了第 5 时刻,访问 e ,产生缺页异常,产生缺页中断之后,需要把栈的尾部给替换出去,这时候就把 e 给压栈里
  2. 第 6 时刻,把 b 放栈里面去,但由于 b 已经在页帧中,会把 b 从栈中去掉,使得 b 从栈的中间位置调到栈顶。
  3. 同理,第 7 时刻访问 a,会把 a 从栈的某一位置调到栈顶

这就是 LRU 算法基于栈来实现的大致处理过程。可以看到在这里面每次访问都需要去查找这个栈,那如果说这个内存中物理页帧比较多的情况,那其实查找很费时,所以整个过程实现开销是大。

3.3 链表实现 VS 堆栈实现

那这是两种实现方式,每一次内存访问某一页的时候,可能都需要去做一次查找,看这个页是否在链表中,或者说是否在堆栈中,可以做一些相关操作。那这个过程其实开销挺大。

LRU 算法表面上看起来效果不错,但是如果要把它放到操作系统里面去,需要考虑代价,它的结果虽然不错,如果代价太大,它不是一个合适的实现方法。

操作系统设计讲究的第一要高效,第二要简洁,既要达到好的效果,还要实现得快捷。如果说为了实现好效果,要花很大的代价,那整个系统性能就受到很大影响,操作系统占时间越多,也意味着留给应用程序时间越少,所以说希望操作系统用最少时间获得最佳效果,它需要一个 balance,所以 balance 情况下 LRU 算法的实现开销很大,所以它也不是一个有效的方法。

相关文章:

《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)

文章目录 1. 最近最久未使用算法的工作原理2. 最近最久未使用算法示例3.LRU算法实现3.1 LRU的页面链表实现3.2 LRU的活动页面栈实现3.3 链表实现 VS 堆栈实现 1. 最近最久未使用算法的工作原理 最近最久未使用页面置换算法,简称 LRU, 算法思路&#xff…...

ES6新增了哪些特性(待更新)

1.let,const 1.1.var,let,const的区别 1.1.1 var存在变量提升,let和const不存在。 1.1.2 let和const只能在块作用域里访问。 1.1.3 同一作用域下let和const不能声明同名变量,而var可以。 1.1.4 const定义常量&am…...

剖析一下自己的简历第二条

剖析一下自己的简历第二条 背景前置说明可能会被问到的问题 背景 剖析一下自己简历, 增加对一些专业知识的掌握. 我的简历第二条是这样写的: “2. 熟悉JVM、JMM,包括内存模型,垃圾回收机制,了解其基本调优技巧并具备线上调优经验。”. 前置…...

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段:1.Qfile Pro和2.Qsync Pro,实践使用中存在一些区别,针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…...

性能测试基础知识jmeter使用

博客主页:花果山~程序猿-CSDN博客 文章分栏:测试_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 性能指标 1. 并发数 (Con…...

Ceph文件存储

Ceph文件存储1.概念:数据以文件的形式存储在存储介质上,每个文件都有一个唯一的文件名并存储在一个目录结构中。提供方便的文件访问接口,支持多种文件操作,如创建、删除、读取、写入、复制等。用于存储和管理个人文件,如文档、图片…...

Hive分区表新增字段并指定位置

Hive分区表新增字段并指定位置 1、Hive分区表新增字段2、CASCADE关键字3、历史分区新增列为NULL问题 1、Hive分区表新增字段 Hive分区表新增字段并指定位置主要分为两步:新增字段和移动字段 1)新增字段 ALTER TABLE table_name ADD COLUMNS (col_name …...

关系型数据库(RDBMS)与非关系型数据库(NoSQL)应用场景

关系型数据库适用于事务性、强一致性和结构化数据场景;非关系型数据库则在高并发、大数据、非结构化数据场景中表现更优;数据量和并发量增加时,应通过分库分表、缓存、集群扩展等手段进行优化。 1. 在什么样的业务场景下,你会优先…...

浅谈CI持续集成

1.什么是持续集成 持续集成(Continuous Integration)(CI)是一种软件开发实践,团队成员频繁地将他们的工作成果集成到一起(通常每人每天至少提交一次,这样每天就会有多次集成),并且在每次提交后…...

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日,华为新品发布会引起众多关注。发布会上,华为常务董事余承东专门提到,华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”,并且表示经过华为和支付宝的共同优化,使用“碰…...

shell编程基础笔记

目录 echo改字体颜色和字体背景颜色 bash基本功能: 运行方式:推荐使用第二种方法 变量类型 字符串处理: 条件判断:(使用echo $?来判断条件结果,0为true,1为false) 条件语句&a…...

VS Code配置Lua调试环境

我这里选用Emmylua进行Lua代码调试,调试环境配置如下: 一、安装Emmylua 在VS Code扩展里搜索emmylua,然后进行安装, 如下 二、配置launch.json 在Run and Debug里生成launch.json文件 点击以上菜单后,生成launch.json文件如下: 三、配置.e…...

FPGA(一)Quartus II 13.1及modelsim与modelsim-altera安装教程及可能遇到的相关问题

零.前言 在学习FPGA课程时,感觉学校机房电脑用起来不是很方便,想着在自己电脑上下载一个Quartus II 来进行 基于 vhdl 语言的FPGA开发。原以为是一件很简单的事情,没想到搜了全网文章发现几乎没有一个完整且详细的流程教学安装(也…...

【单片机】ESP32-S3+多TMC2209控制步进电机系列1 UART通信及无传感回零 硬件部分

目录 1. 硬件选型1.1 esp32硬件型号1.2 TMC2209 硬件型号 2 原理接线图2.1 esp32接线2.2 TMC2209接线2.2.1 单向通讯 不配置地址2.2.2 单向通讯 配置地址2.2.3 双向通讯 单UART 【本文采用】2.2.4 双向通讯 多UART 3. 成品效果 1. 硬件选型 1.1 esp32硬件型号 采用的是微雪ES…...

Django之ORM

1.ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对…...

html css 图片背景透明

html css图标背景透明 css属性&#xff1a; background-color:transparent; mix-blend-mode: multiply; 完整HTML代码&#xff1a; <html><head><title>Test</title></head><body><div id"test" style"background-col…...

使用ALB实现gRPC协议的负载均衡

gRPC是一种高性能、开源的远程过程调用框架&#xff0c;当您使用gRPC进行后端服务通信时&#xff0c;您可使用应用型负载均衡ALB&#xff08;Application Load Balancer&#xff09;实现gRPC协议的负载均衡&#xff0c;统一流量入口。gRPC基于HTTP/2协议进行通信&#xff0c;目…...

解决IDEA的easycode插件生成的mapper.xml文件字段之间逗号丢失

问题 easycode插件生成的mapper.xml文件字段之间逗号丢失&#xff0c;如图 解决办法 将easycode(在settings里面的othersettings)设置里面的Template的mapper.xml.vm和Global Config的mybatisSupport.vm的所有$velocityHasNext换成$foreach.hasNext Template的mapper.xml.vm(…...

【Linux测试题】

1. 选择题 题目&#xff1a; 如果想将电脑中Windows C盘&#xff08;hd1&#xff09;安装在Linux文件系统的/winsys目录下&#xff0c;请问正确的命令是&#xff08;&#xff09;。 选项&#xff1a; A. root104.123.123.123:~# mount dev/hd1 /winsys B. root104.123.123.12…...

python使用openpyxl处理excel

文章目录 一、写在前面1、安装openpyxl2、认识excel窗口 二、基本使用1、打开excel2、获取sheet表格3、获取sheet表格 尺寸4、获取单元格数据5、获取区域单元格数据6、sheet.iter_rows()方法7、修改单元格的值8、向表格中插入行数据9、实战&#xff1a;合并多个excel 三、获取E…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境

如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境&#xff1f; 在 Python 开发中&#xff0c;为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具&#xff0c;能高效创建不同 Python 版本的 Poetry 虚拟环境&#xff0c;接下来…...