《操作系统 - 清华大学》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 算法的实现开销很大,所以它也不是一个有效的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3. STM32_串口

数据通信的基础概念 什么是串行/并行通信: 串行通信就是数据逐位按顺序依次传输 并行通信就是数据各位通过多条线同时传输。 什么是单工/半双工/全双工通信: 单工通信:数据只能沿一个方向传输 半双工通信:数据可以沿两个方向…

Postman设置接口关联,实现参数化

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…

Redis设计与实现 学习笔记 第二十二章 二进制位数组

Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组(bit array,又称“位数组”)。 SETBIT命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始,而二进制位的值可以是0或1&…

Linux服务器安装Linux宝塔面板部署wordpress网站以及雷池WAF

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程,保证网站能够正常访问,并且使用Linux宝塔面板申请并部署了SSL证书,使用https协议正常访问。 三、Linux宝塔…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题 构造函数&…

算法编程题-煎饼排序 不含AAA或者BBB的字符串

算法编程题-煎饼排序 &&不含AAA或者BBB的字符串 煎饼排序原题描述思路简述代码实现复杂度分析 不含AAA或者BBB的字符串原题描述思路简述代码实现复杂度分析 摘要:本文将对两道LeetCode原题进行介绍,分别是煎饼排序和不含AAA或者BBB的字符串。在陈…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

scss文件内引入其他scss文件报错

在 Sass (SCSS) 中,import 语句用于在当前文件中导入其他 Sass 文件,以便你可以重用样式和变量等。然而,从 Dart Sass 1.23.0 版本开始,import 语句已经被标记为弃用(deprecated),并计划在未来的…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能,自己研究了下。 1.其中向量角度计算: 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向,从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

【MATLAB】基于RSSI的蓝牙定位与例程,设置4个基站、二维定位

目录 ​编辑 商品描述 主要功能 技术细节 适用场景 下载链接 商品描述 这款基于接收信号强度指示(RSSI)原理的蓝牙定位程序,专为需要高效、可靠定位解决方案的开发者和研究人员设计。它能够在二维平面内,通过4个锚点实现对未…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

ROC曲线

文章目录 前言一、ROC的应用?二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中,ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异,例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…

第一届“吾杯”网络安全技能大赛 Writeup

战队信息 战队名称&#xff1a;在你眼中我是誰&#xff0c;你想我代替誰&#xff1f; 战队排名&#xff1a;13 Misc Sign Hex 转 Str&#xff0c;即可得到flag。 原神启动&#xff01; 不好评价&#xff0c;stegsolve 秒了&#xff1a; WuCup{7c16e21c-31c2-439e-a814-b…

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…

智能化业务校验框架:动态设计与应用实践

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 &#xff08;一&#xff09;商品spu校验信息数据 &#xff08;二&#xff09;商品sku校验信息数据 &#xff08;三&#xff09;组包商品校验信息数据 &#xff08;四&#xff09;商品数据校验数据持有者 &…

idea2024加载flowable6.8.1.36遇到的问题-idea启动flowable问题flowable源码启动问题

代码下载地址&#xff1a; https://gitee.com/hanpenghu_admin_admin/flowable6.8.1.git 1.首先是通过顶层目录maven clean install 发现很多子模块并不会install本地mavenStore库&#xff0c;这导致了&#xff0c;一堆相互依赖的模块报错找不到&#xff0c;所以需要根据报错…