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

操作系统页面置换: 最近最少使用算法(LRU)

操作系统页面置换算法

概念

最近最少使用(LRU,Least Recently Used)算法是一种页面置换算法,用于管理操作系统中的虚拟内存。它的核心思想是当需要进行页面置换时,选择最长时间未被访问的页面进行替换。这种策略基于“局部性原理”,即最近被访问的页面在未来被访问的概率较高。

工作原理

LRU算法通过维护一个记录页面访问历史的列表来实现,最近被访问的页面放在列表的前端,而最久未被访问的页面放在列表的末尾。当发生页面缺失且需要加载新页面时,算法将列表末尾的页面(即最久未被访问的页面)从内存中移除,并将新页面加载到内存中,同时更新该页面在列表中的位置。

实现方式

  1. 链表:一个常见的实现方式是使用双向链表。链表的头部表示最近被访问的页面,尾部表示最久未被访问的页面。每次页面被访问时,如果该页面已在链表中,则将其移动到链表头部;如果页面不在链表中,则将其添加到链表头部,如果内存已满,则从链表尾部移除一个页面。

  2. 哈希表+双向链表:为了优化查找效率,可以使用哈希表存储每个页面在链表中的位置,这样可以在O(1)时间内判断一个页面是否在内存中,并能快速访问链表中的任何一个页面。

示例

假设内存可以容纳3个页面,页面请求序列为:1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5。

  1. 请求页面1,内存空,加载页面1到内存。内存状态:[1]
  2. 请求页面2,内存未满,加载页面2到内存。内存状态:[2, 1]
  3. 请求页面3,内存未满,加载页面3到内存。内存状态:[3, 2, 1]
  4. 请求页面4,内存已满,按LRU置换页面1,加载页面4到内存。内存状态:[4, 3, 2]
  5. 请求页面1,内存已满,按LRU置换页面2,加载页面1到内存。内存状态:[1, 4, 3]
  6. 请求页面2,内存已满,按LRU置换页面3,加载页面2到内存。内存状态:[2, 1, 4]
  7. 以此类推…

优点

  • 性能较好:LRU算法能较好地利用局部性原理,减少页面缺失率。
  • 实现直观:算法的策略直观易懂,符合常理。

缺点

  • 实现复杂度:相比FIFO等算法,LRU的实现复杂度较高,尤其是在不使用额外数据结构的情况下。
  • 运行开销:在没有优化的情况下,每次页面访问都可能需要更新链表,导致额外的运行开销。

LRU算法是一种广泛使用的页面置换算法,特别适用于访问模式具有明显局部性的应用场景。

图示

最近最少使用(LRU)算法的实现通常是通过维护一个记录页面访问顺序的数据结构,如链表。在这个链表中,最近被访问的页面会被放到链表的头部,而最久未被访问的页面会被放到链表的尾部。当需要进行页面置换时,链表尾部的页面(即最久未被访问的页面)会被替换。

为了更清晰地展示LRU算法的过程,我们将通过一个具体的例子,页面请求序列为:1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5。假设内存可以容纳3个页面。

初始状态(所有页面帧为空)

链表状态:空

页面请求序列开始

  1. 请求页面1,内存空,加载页面1到内存,页面1移动到链表头部。
链表状态:1
  1. 请求页面2,内存未满,加载页面2到内存,页面2移动到链表头部。
链表状态:2 -> 1
  1. 请求页面3,内存未满,加载页面3到内存,页面3移动到链表头部。
链表状态:3 -> 2 -> 1
  1. 请求页面4,内存已满,按LRU置换页面1(链表尾部的页面),加载页面4到内存,页面4移动到链表头部。
链表状态:4 -> 3 -> 2
  1. 请求页面1,内存已满,按LRU置换页面2(现在链表尾部的页面),加载页面1到内存,页面1移动到链表头部。
链表状态:1 -> 4 -> 3
  1. 请求页面2,内存已满,按LRU置换页面3(现在链表尾部的页面),加载页面2到内存,页面2移动到链表头部。
链表状态:2 -> 1 -> 4
  1. 请求页面5,内存已满,按LRU置换页面4(现在链表尾部的页面),加载页面5到内存,页面5移动到链表头部。
链表状态:5 -> 2 -> 1
  1. 请求页面1,页面1已在内存中,根据LRU,将页面1移动到链表头部。
链表状态:1 -> 5 -> 2
  1. 请求页面2,页面2已在内存中,根据LRU,将页面2移动到链表头部。
链表状态:2 -> 1 -> 5
  1. 请求页面3,内存已满,按LRU置换页面5(现在链表尾部的页面),加载页面3到内存,页面3移动到链表头部。
链表状态:3 -> 2 -> 1

通过这个过程,我们可以看到LRU算法如何通过维护一个链表来记录页面的访问顺序,确保最久未被访问的页面被首先替换。这种方法更好地利用了局部性原理,通常能减少页面缺失率,但实现相对复杂,需要额外的数据结构来记录访问历史。


http://www.kler.cn/news/288615.html

相关文章:

  • Mac基本使用记录
  • 【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 什么是抽象公共代码
  • PLC边缘计算网关的选择策略-天拓四方
  • 0826-0901 各种面试笔试题算法题整理
  • CSS 样式化表格——WEB开发系列24
  • 【数据库|第9期】SQL Server、Access和Sqlite 的字段别名详解
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
  • 使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测
  • Java 入门指南:Java 并发编程 —— 线程隔离技术 ThreadLocal
  • subclass-balancing的实验结果分析
  • 开放式耳机排行榜10强?这五款绝对不能错过!
  • mysql高可用之组复制 (MGR)
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 【战略游戏】
  • Docker笔记-启动容器时,时间与宿主机保持一致
  • 如何找到适合的IT外包服务商
  • 【JAVA】两轮充电桩设计模式实践分享
  • mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题
  • 深入Redis:细谈持久化
  • 浅析前端数据埋点监控:用户行为与性能分析的桥梁
  • ES6基础----Generator的使用
  • 【RabbitMQ之一:windows环境下安装RabbitMQ】
  • 数分基础(05)中心极限定理、假设检验与AB测试简介
  • 多线程并发性
  • 二叉树展开为列表(LeetCode)
  • 改进YOLO的群养猪行为识别算法研究及部署(小程序-网站平台-pyqt)
  • 【通俗理解】最优控制之旅——强化学习中的策略优化
  • 物业|基于SprinBoot+vue的物业管理系统(源码+数据库+文档)
  • 深入理解 CSS Flex 布局