您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

操作系统之页面置换算法

来源:https://www.bilibili.com/video/BV1YE411D7nH

背景:在内存不足的情况下,操作系统会将内存中暂时不需要使用的信息换出到外存,页面置换算法就是用于选择到底将哪个页面换出到外存的算法。

在这里插入图片描述

注意:页面置换算法的好坏是可以通过缺页率来体现的,一个好的页面置换算法往往拥有较小的缺页率


  1. 最佳置换算法(Optimal,OPT)

思想:每次选择淘汰的页面将是以后永远不再使用或在最长时间内不再使用的页面,以保证最低的缺页率。

例子:假如系统为操作系统分配了三个内存块,并且采用以下的页面号引用串(会依次访问这些页面):7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0

访问页面7012030423032120
内存块177722222
内存块20000400
内存块3113331
是否缺页YYYYYYYY

解释:首先进程一共有三个内存块,因此7 、0、 1依次进入内存块。当2想要进入内存块的时候,发现已满(里面是7,0,),这时候从前往后找,0和1下一次会被使用的位置,在7下一次使用的位置之前。这说明7就是最长时间不会被使用的页面,因此将7的内存块换出到外存,2进入到内存块1。后面依次类推。在整个过程中:缺页中断发生了8次**,页面置换发生了5次(前3次都发生了缺页,但是没用进行置换)。因此可以知道:**缺页时未必发生页面置换,若还有可用的内存块时,就不会进行置换

总结:最佳置换算法可以保证最低的缺页率,但是实际上不能被实现。因为只有在进程执行过程中才能知道接下来会访问哪个页面,而操作系统并不能提前预知页面的访问顺序

先进先出置换算法(FIFO)

思想:每次选择淘汰的页面是最早进入内存的页面(FIFO队列的最大长度取决于系统为进程分配了多少个内存块)

例子:假设系统为某进程分配了三个内存块,并以下面的页面号为引用串:3,2,1,0,3,2,4,3,2,1,0

访问页面32103243210
内存块1333000444
内存块222233311
内存块31112220
是否缺页YYYYYYYYY

解释:当访问1号页面的时候,这时候队列的形式是3->2->1;当要访问0号页面的时候,内存已满,则将最先进入队列的3置换到外存,这时候队列的形式为2->1>0,后面的情形可以依次类推

注意

  • FIFO算法实现简单,但是与进程实际运行的规律相违背,因为先进入内存的页面也可能会被经常访问。

  • FIFO算法会出现Belady(贝拉迪)异常

    **Belady异常**是指:当为进程分配的物理块数增大的时候,缺页的次数不增反减(在上面的例子中,如果将内存块改为4个,其他不变,那么缺页的次数将达到10次)

最近最少使用置换算法(Least Recently Used,LRU)

思想:淘汰最近最少使用的页面

实现方法:在每个页面的页表项中,用访问字段记录该页面自从上一次被访问以来经历的时间t,如果需要淘汰一个页面的话,就在页表中选择t值最大的页面。格式如下:

页号内存块号状态位(0表示未进入内存,1表示在内存)访问字段修改位外存地址

例子:假设系统为某进程分配了四个内存块,并以下面的页面号为引用串:1,8,1,7,8,2,7,2,1,8,3,8,2,1,3,1,7

访问页面18178272183821317
内存块1711111
内存块288887
内存块37733
内存块4222
是否缺页YYYYYY

解释:首先肯定是1 8 7 2将内存填满,在下一次访问到3的时候,这时候内存中没有,所以要进行置换操作,在访问3前面,7是最远一次访问的,因此t比较大,所以要置换7。下一次要访问7时,也是这样子进行置换的。

总结:LRU的实现需要硬件支持,其性能最接近最佳页面置换算法,但是该算法实现困难,开销大

时钟置换算法(CLOCK)

简介:是一种性能和开销相对均衡的算法。也被称为最近未使用算法(Not Recenty Use,NRE)。

思想:简单的CLOCK算法为页面设置一个访问位,再将内存中的页面通过链接指针链接成一个循环队列。当某页被访问的时候,其访问位置设置为1。当淘汰一个页面的时候,只需要检查页的访问位如果是0,就选择将该页换出(之前没被访问过);如果是1,则将其置换为0,暂时不换出(上次访问过,可能还会继续访问)。然后接着检查下一个页面,如果第一轮扫描结束后,所以的页面的访问位都是1,则会将这些页面全部置0,再进行第二次扫描(第二轮扫描中肯定有为0的页面)。因此,简单的CLOCK算法选择淘汰一个页面最多经过两轮扫描

页号内存块号状态位访问位(1表示最近访问过,0表示没有)修改位外存地址

例子:假设系统为某进程分配了五个内存块,并以下面的页面号为引用串:1,3,4,2,5,6,3,4,7

首先五个内存块中分别放入了页面1,3,4,2,5,这时候循环队列如下,访问位都设置为1了:

在这里插入图片描述

想要放入6的时候,这时候内存满了,因此需要淘汰,经过一轮的遍历后,会将这五个页面的标志位修改位0,再从队头1的位置放入6,此时循环队列如下:

在这里插入图片描述

下一次访问3,则将3号页置为1,再下一次访问4再将4号页置为1,此时循环队列为:
在这里插入图片描述

最后访问7,只是7不在内存中,则遍历队列,先将3号页置为0,再将4号页置为0,遍历到2号页的时候,发现2号页的访问位为0,则将2号页换出,此时循环队列如下:

在这里插入图片描述

改进型的时钟置换算法

​ 简单的时钟置换算法仅考虑了一个页面是否被访问过。事实上,如果淘汰的页面是一些没有被修改过的页面,那么就不用执行I/O操作。只有被淘汰的页面被修改过时,才需要写回外存。


思想:除了考虑一个页面最近是否被访问之外,操作系统还应考虑页面是否被修改过。在其它条件相同下,优先淘汰没有被修改过的页面,避免I/O操作。其中,修改位为0表示没有被修改过,修改位为1表示被修改过。


算法规则: 假设用(访问位,修改位)的形式记录各个页面的状态。如(1,1)表示一个页面最近被访问过并修改过。

首先还是将可能被置换的页面排成一个循环队列。

第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换本轮扫描不修改任何标志位第一优先级:找一个既没有被标记也没有被修改过的页面

第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0, 1)的帧用于替换本轮将所有扫描的帧访问位设置为0第二优先级:找一个没有被标记但是被修改过的页面

第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位第三优先级:找一个最近被访问过但是未被修改过的页面

第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换【第四优先级:找一个最近被访问过同样也被修改过的页面

注:由于第二轮扫描的时候将访问位设置为0了,因此经过第三轮、第四轮扫描一定有一个帧被选中。因此改进的CLOCK置换算法选择一个淘汰页面最多会进行四次扫描


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进