页面置换算法


文章目录

  • 页面置换算法
  • 前言
  • 一、最近未使用页面置换算法
  • 二、先进先出页面置换算法
  • 三、第二次机会页面置换算法
  • 四、时钟页面置换算法
  • 四、最近最少使用页面置换算法
  • 四、最不常用算法
  • 总结

前言

当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如果要换出的页面在内存驻留期间已经被修改过,就必须把它写回磁盘以更新该页面在磁盘上的副本,如果该页面没有被修改过,那么它在磁盘上的副本已经是最新的,不需要回写。直接用调入的页面覆盖被淘汰的页面就可以了。
当发生缺页中断时,虽然可以随机地选择一个页面来置换,但是如果每次都选择不常使用的页面会提升系统的性能。如果一个被频繁使用的页面被置换出内存,很可能它在很短时间内又要被调入内存,这会带来不必要的开销。人们已经从理论和实践两个方面对页面置换算法进行了深入的研究。下面介绍几个最重要的算法。


一、最近未使用页面置换算法

为使操作系统能够收集有用的统计信息,在大部分具有虚拟内存的计算机中,系统为每一页面设置了两个状态位。当页面被访问(读或写)时设置R位,当页面被写入(即修改)时设置M位。这些位包含在每个页表项中。每次访问内存时更新这些位,一旦设置某位为1,它就一直保持1直到操作系统将它复位。

可以用R位和M位来构造一个简单的页面置换算法:当启动一个进程时,它的所有页面的两个位都由操作系统设置成0,R位被定期地(比如在每次时钟中断时)清零,以区别最近没有被访问的页面和被访问的页面。
一个典型的页表项 :

当发生缺页中断时,操作系统检查所有的页面并根据它们当前的R位和M位的值,把它们分为4类:

  • ·第0类:没有被访问,没有被修改。
  • ·第1类:没有被访向,已被修改。
  • ·第2类:已被访问,没有被修改。
  • ·第3类:已被访问,已被修改。

尽管第1类初看起来似乎是不可能的,但是一个第3类的页面在它的R位被时钟中断清零后就成了第1类。时钟中断不清除M位是因为在决定一个页面是否需要写回磁盘时将用到这个信息。清除R位而不清除M位产生了第1类页面。
NRU (Not Recently Used,最近未使用)算法随机地从类编号最小的非空类中挑选一个页面淘汰。这个算法隐含的意思是:在最近一个时钟中(典型的时间是大约20ms)淘汰一个没有被访问的已修改页面要比淘汰一个被频繁使用的“干净”页面好。NRU的主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。

二、先进先出页面置换算法

另一种开销较小的页面置换算法是FIFO(First-In First-Out,先进先出)算法。为了解释它是怎样工作的,设想有一个超市,它有足够的货架展示k种不同的商品。有一天,某家公司介绍了一种新的方便食品——即食的、冷冻干燥的、可以用微波炉加热的酸乳酪,这个产品非常成功,所以容量有限的超市必须撤掉一种旧的商品以便能够展示该新产品。

一种可能的解决方法就是找到该超市中库存时间最长的商品并将其替换掉,理由是现在已经没有人喜欢它了。这实际上相当于超市有一个按照引进时间排列的所有商品的链表。新的商品被加到链表的尾部,链表头上的商品则被撤掉。

同样的思想也可以应用在页面置换算法中。由操作系统维护一个所有当前在内存中的页面的链表,最新进入的页面放在表尾,最早进入的页面放在表头。当发生缺页中断时,淘汰表头的页面并把新调入的页面加到表尾。当FIFO用在超市时,可能会淘汰剃须膏,但也可能淘汰面粉、盐或黄油这一类常用商品。因此,当它应用在计算机上时也会引起同样的问题,由于这一原因,很少使用纯粹的FIFO算法。

三、第二次机会页面置换算法

FIFO算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改 :检查最老页面的R位。如果R位是0,那么这个页面既老又没有被使用,可以立刻置换掉,如果是1,就将R位清0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续搜索。

这一算法称为第二次机会(second chance)算法

四、时钟页面置换算法

尽管第二次机会算法是一个比较合理的算法,但它经常要在链表中移动页面,既降低了效率又不是很有必要。一个更好的办法是把所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,当发生缺页中断时,算法首先检查表针指向的页面,如果它的R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;如果R位是1就清除R位并把表针前移一个位置。重复这个过程直到找到了一个R位为0的页面为止。

四、最近最少使用页面置换算法

在前面几条指令中频繁使用的页面很可能在后面的几条指令中被使用。反过来说,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。这个思想提示了一个可实现的算法:在缺页中断发生时,置换未使用时间最长的页面。这个策略称为LRU(Least Recently Used,最近最少使用)页面置换算法。

虽然LRU在理论上是可以实现的,但代价很高。为了完全实现LRU,需要在内存中维护一个所有页面的链表,最近最多使用的页面在表头,最近最少使用的页面在表尾。困难的是在每次访问内存时都必须要更新整个链表。在链表中找到一个页面,删除它,是一个非常费时的操作。

四、最不常用算法

NFU(Not Frequently Used,最不常用)算法。该算法将每个页面与一个软件计数器相关联,计数器的初值为0。每次时钟中断时,由操作系统扫描内存中所有的页面,将每个页面的R位(它的值是0或1)加到它的计数器上。这个计数器大体上跟踪了各个页面被访问的频繁程度。发生缺页中断时,则置换计数器值最小的页面。

NFU的主要问题是它从来不忘记任何事情。比如,在一个多次(扫描)编译器中,在第一次扫描中被频繁使用的页面在程序进入第二次扫描时,其计数器的值可能仍然很高。实际上,如果第一次扫描的执行时间恰好是各次扫描中最长的,含有以后各次扫描代码的页面的计数器可能总是比含有第一次扫描代码的页面的计数器小,结果是操作系统将置换有用的页面而不是不再使用的页面。

幸运的是只需对NFU做一个小小的修改就能使它很好地模拟LRU。
其修改分为两部分:

  1. 在R位被加进之前先将计数器右移一位;
  2. 将R位加到计数器最左端的位而不是最右端的位。

修改以后的算法称为老化(aging)算法


总结

算法 解释
NRU(最近未使用)算法 LRU的很粗糙的近似
FIFO(先进先出)算法 可能抛弃重要的页面
第二次机会算法 比FIFO有较大改善
时钟算法 比第二次机会算法有改善
LRU(最近最少使用)算法 很优秀,很难实现
NFU(最不经常使用)算法 LRU相对粗糙的近似

页面置换算法(FIFO、第二次机会、LRU)相关推荐

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

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

  2. Cache与页面置换算法FIFO、LRU等

    1 Cache与存储结构 (1) 定义 狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用动态随机存取存储器(Dynamic Random Access Memory, ...

  3. 操作系统 页面置换算法FIFO与LRU的实现

    FIFO FIFO算法是最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰. LRU 最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做 ...

  4. 7-1 页面置换算法--FIFO (50 分)(思路详解)

    一:题目 先初始化页面大小,和物理块数.连续输入页面的逻辑地址,以"-1"作为结束标志,采用FIFO页面置换算法.固定分配局部置换分配策略.输出该页面的页号和页内位移,若该页不在内 ...

  5. lru页面置换算法_C|内存管理|从LRU王国到NRU王国

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

  6. 页面置换算法 FIFO和LRU 及各自的命中率

    (1) 先进先出算法FIFO:该算法的实质是选择作业中在主存驻留时间最长的一页淘汰,这种算法容易实现,例如分配一个作业的存储块数为m,则只需建立一张m个元素的队列表Q(0).Q(1).-.Q(m-1) ...

  7. 操作系统实验--存储管理--页面置换算法--FIFO and LRU c++实现

    #include<iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  8. 操作系统实验报告17:请求页面置换算法

    操作系统实验报告17 实验内容 实验内容:虚拟存储管理. 编写一个 C 程序模拟实现课件 Lecture24 中的请求页面置换算法 包括FIFO.LRU (stack and matrix imple ...

  9. OS- -内存之页面置换算法

    OS- -内存之页面置换算法 文章目录 OS- -内存之页面置换算法 一.内存之页面置换算法 1.最优页面置换算法 2.最近未使用页面置换算法 3.先进先出页面置换算法 4.第二次机会页面置换算法 5 ...

最新文章

  1. C语言程序设计 | 打印一个n行的菱形
  2. 2021广西蒙山中学高考成绩查询,广西省蒙山中学2020-2021学年高二下学第一次月考数学(文)试题及答案.doc...
  3. 多个redistemplate_Spring boot 使用多个RedisTemplate
  4. 黄聪:bootstrap中模态框modal在苹果手机上会失效
  5. 初始DDD(领域驱动设计)
  6. python 函数中的面试题
  7. POI操作EXCEL2007,报javax.xml.stream.XMLEventFactory.newFactory()错误!
  8. C语言深度解剖:关键字
  9. python如何使用web3py与以太坊投资智能合约交互
  10. 千军万马跑协程goroutine
  11. google datastudio 使用教程
  12. 在一个数组中找到第k小的数(线性时间选择)
  13. android 性能测试iozone篇
  14. python 扫描二维码
  15. outlook导入服务器邮件,OUTLOOK怎么导入邮件?
  16. Barefoot P4加速SDN
  17. (精华)2020年8月7日 微信小程序 直播功能的实现
  18. 中介者模式(Java)
  19. java怎么修改支付宝步数_支付宝怎么修改运动步数 刷步数方法
  20. 海思Hi3519A开发(6.sample内容介绍)

热门文章

  1. Windows监控——性能指标详解
  2. [Camera]摄像头图像处理及色彩模型
  3. Keil5 MDK版本使用ST-LINK下载程序的方法及注意事项
  4. JQuery实现简易音乐播放器
  5. MetroMusic音乐播放器开发心得
  6. 高德地图上线新能源导航 一站式充电服务缓解里程焦虑
  7. 用Python选取神股(简单、粗暴)
  8. 阿里P8整理出SQL笔记:收获不止SOL优化抓住SQL的本质
  9. 别嫌工资少,高薪资的标准你符合几条
  10. 前端学习01 HTML入门