缓存机制中,当发生页冲突时,操作系统将会调用页面置换算法进行淘汰,而我们这篇文章中重点介绍随机访问情况下效率较高的两种算法。

LRU:Least Recently Used

NRU:Not Recently Used


LRU

LRU淘汰的是最早被使用的Cache,算法可以分为两种实现:

A.时间戳

硬件记录最近一次访问时间,每次淘汰遍历求最早访问的Cache。

B.链表

Algorithm 4th:著名的前移编码策略,假设最近访问过的元素很有可能再次访问,因此可以用于缓存、数据压缩等许多场景。

这里将所有可能被淘汰的Cache用一张线性链表存储,当查询时,每次被查询到的Cache节点将会被移除出链表并且插入表头。如此一来,链表头将会是最新被访问的数据,而链表尾则会被淘汰。

这样一来,淘汰最早访问的Cache则非常方便,代价则是需要链表的结构是可修改的

在硬件层,这两种实现都具有巨大的开销,因此难以用于实践。

NRU

考虑到LRU实现困难,Clock 页面置换算法(NRU)应运而生。

记录谁最早被使用很难,那么换一种思路,把时间分成一个个周期,如果最近一个周期都没有被使用,那就干脆当做一直没有被使用。

本质上这可以说是一种逆向思维:不一定要最早被使用的被淘汰,只要不是最近被使用的被淘汰就好了。而统计谁最近被使用则成本低廉,只需要在某个时间段清空访问状态,是否新被访问就很容易判断。

如同时钟一般,Clock将所有可能被淘汰的Cache entry用一张环形链表存储,并由页表维护reference bit,时钟的柄(clock hand)作为入口(如果是固定入口的话,会导致靠近入口的entry更容易被淘汰,因此不可取)。

被Cache的页表是物理内存,而非虚拟内存,而MMU负责管理的reference bit在虚拟内存页上。因此实际查找的不仅是一个页,更是一个页链表(一个物理页对应多个虚拟页),只要链表其中有一个ref bit为1,那么整个物理页就被视为新被访问。而置0操作代表将物理页对应的所有虚拟内存页的ref bit置0

当进行查询时:

Hit:

将虚拟内存页的reference bit设置为1(新被访问)

Miss:

从clock hand开始查找物理页Reference bit为0 的entry
如果物理页Reference bit为1,将物理页对应的所有虚拟内存页的ref bit置0(注意,这里的前移会导致入口变化),指针前移,直到找到为0的entry为止。(清空访问状态)
如果物理页Reference bit 为0, 将数据放入该entry,并将虚拟内存页Reference bit置1。(没有新被访问,所以被淘汰),指针前移,终止。

由于链表环形,因此即使第一圈扫描没有找到Ref bit为0的entry,但由于已经清空了所有对应虚拟内存页Ref bit,因此下一圈依然能够轻易地找到没有新被访问的entry。

从性能上来讲,NRU和LRU差距不大,因此可以作为替代品。

Clock​pages.cs.wisc.edu

而最主要的是,这种环形链表本身的结构是稳定的,不同于LRU里的节点的反复插入,这里变动的只是页表上存储的Ref Bit,使得其被硬件实现的可能性远远增强


这使我想起以前上选修课的时候听过的一个例子,在计算机图形学中,反射公式本身运用大量积分计算,这是科研界的职责;而工业界则把这些复杂公式近似成计算效率高但是差距又不大的简单公式,这样才能在配置落后的PC上运行。

对于Cache来说,能找到最早访问的固然好,但是宽容一点,不是最早,但是也很早被访问的被淘汰问题也不大,只要不淘汰最近被访问的破坏locality就好了。而这种近似,是必然存在的对现实的妥协,也是工业界必不可少的生存智慧。

lru页面置换算法_C|内存管理|从LRU王国到NRU王国相关推荐

  1. 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...

    LRU页面置换算法模拟-最近最久未使用置换算法 LRU页面置换算法模拟-最近最久未使用置换算法|课程设计|计算机数据库课程设计 一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了 ...

  2. LRU页面置换算法模拟

    一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了解内存分页管理策略 3.掌握调页策略 4.掌握一般常用的调度算法 5.选取调度算法中的典型算法,模拟实现 二.设计任务 在Win ...

  3. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  4. OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc

    实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...

  5. 南京邮电大学操作系统实验三:虚拟内存页面置换算法

    实验内容 使用数组存储一组页面请求,页面请求的数量要50个以上,访问的页面号可以用随机数生成(0~20): (1)设置为分配给进程的页框数(假定是5),使用LRU算法,模拟完成全部的页面请求,最后输出 ...

  6. 7-2 页面置换算法--LRU (50 分)

    一:题目(思路+详解+运行时错误解决) 先初始化页面大小,和物理块数.连续输入页面的逻辑地址,以"-1"作为结束标志,采用LRU页面置换算法.固定分配局部置换分配策略.输出该页面的 ...

  7. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  8. 8虚拟内存9页面置换算法

    8.1虚拟存储的需求背景 虚拟内存是非连续内存分配的一个延续,非连续内存分配在存储空间内可以连续也可以不连续.虚拟内存是在非连续内存分配基础上,可以把一部分内容放到外存中去,让应用程序有更大的空间使用 ...

  9. linux存储--页面置换算法(十一)

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种 1. 最佳置换算法(OP ...

最新文章

  1. 打开深度学习的黑盒,详解神经网络可解释性
  2. 亚里士多德千年前的猜想,被这群MIT本科生向前推进了一步
  3. nodejs实现继承的简单代码示例
  4. C++ STL之vector常用方法
  5. oracle查询各个池的使用率,oracle查询连接数、并发数、共享池大小
  6. 【论文解读】突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...
  7. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
  8. 功能测试包含哪些测试_一小时复习,期末考试必过 重邮软件测试题总结
  9. C#代码中背后进行的值拷贝
  10. Codeforces Beta Round #10 D. LCIS 动态规划
  11. 【语法】一些奇怪的语义错
  12. 设计模式的征途—7.适配器(Adapter)模式
  13. HDU today(最短路径)
  14. R语言编写用户自定义函数:R语言编写用户自定义函数计算变异系数(coefficient of variation)、输入为向量
  15. python螺旋线-利用Python绘制一个正方形螺旋线
  16. RPC框架pigeon源码分析
  17. xss.haozi.me靶场详解
  18. @Required用法
  19. PPPoE拨号以及失败解决思路
  20. HTML5与CSS3基础教程学习笔记【第三章 基本HTML结构】

热门文章

  1. 【汇编】C++ 函数调用之——有参无返回调用(传指针)
  2. 关于jQuery的$.getJSON乱码问题
  3. [Linux实用工具]Ubuntu环境下SSH的安装及使用
  4. jsfl 改变舞台宽高
  5. java HashMap和LinkedHashMap区别
  6. symantec、officescan控制台忘记密码如何处理
  7. SQL JOIN的用法
  8. Java中怎样创建线程安全的方法
  9. Oracle 查询当前日期
  10. C程序验证邮件地址是否真实存在(不是验证邮箱格式)