清华向勇《操作系统 》学习笔记6:页面置换算法

6.1 页面置换算法概念

本节强烈建议看视频:课程第九讲。其中给出了大量的动画示例,有助于理解。
另外,我认为需要足量的练习。留待下一阶段

处理缺页异常(需要调入新页面而内存已满)时,用于选择被置换的物理页面的算法。

设计目标:减少调入调出次数,寻找未来不再访问或短期内不访问的页面调出

在给出页面置换的结构之前,我们有一类特例,即不被替换的页面:
页面锁定(frame locking)

  • 操作系统的关键部分,描述必须常驻的逻辑页面,这部分页面对响应速度有要求
  • 利用页表中的锁定标志位来实现

评价方法:页面轨迹统计,模拟页面置换行为,记录缺页次数

页面置换算法分类:

  • 局部页面置换算法(选择范围仅限当前进程占用的物理页面)
    • 最优算法:全知全能,量身定制
    • 先进先出算法:先调入的页先调出
    • 最近最久未使用算法:一个统计方法,实现较麻烦
    • 时钟算法,最不常用算法
  • 全局置换算法(选择防卫是所有可换出的物理页面)
    • 工作集算法
    • 缺页率算法

6.2 局部页面置换算法

6.2.1 最优置换算法(OPT)

置换在未来的最长时间不访问的页面。

缺页时计算内存中每个逻辑页面的下一次访问时间。全知全能,缺页次数最少,是理想情况。

  • 实际系统中无法实现
  • 无法预制每个页面在下次访问前的等待时间
  • 但具有理论意义:用于评定置换算法的性能

6.2.2 先进先出算法(FIFO)

由于上述以未来情况为依据的算法不可实现,所以我们要使用如下的基于过去情况的算法。

选择在内存中驻留时间最长的页面进行置换,即FIFO算法。

具体实现过程通过维护一个记录所有位于内存中的逻辑页面队列(双向链表)实现。

  • 实现简单

  • 性能较差,调出的页面可能是经常访问的

  • Belady现象:进程分配物理页面数增加时,缺页并不一定减少,例子(内存中能装4页,但实际有5页,最优算法为2次):在这里插入图片描述

  • 很少单独使用

6.2.3 最近最久未使用算法(LRU)

Least Recently Used(LRU)
选择最长时间没有被引用的页面进行置换
局部性原理表明你,如某些页面长时间未被访问,则它们在将来可能会长时间不会访问

缺页时,计算内存中每个逻辑页面的上一次访问时间,排序找最远。

LRU是最优置换算法的一种近似,但由于算法复杂度过大,仍然在实际情况中无法实施。

实际实现可以使用页面链表或者活动页面栈来构建优先队列,从而降低复杂度:

  • 队头:最久未使用的
  • 队尾:刚刚使用过的

当然维护队列维护队列所带来的复杂度也是不可小视的。

6.2.4 时钟算法(Clock)

前面两种算法各有优劣,FIFO考虑得太过简单,导致性能较差,而LRU的核心问题在于统计得过于仔细,所以难以实施。

所以考虑对页面访问的情况进行大致统计。

  • 在页表项中增加访问位,描述页面在过去一段时间中的访问情况。形成环形链表。
  • 缺页时,从指针处开始顺序查找未被访问(LRU因素)的第一个(FIFO因素)页面进行置换。
  • 有环、有指针,所以形象地称为时钟算法。它是LRU和FIFO的折中。在这里插入图片描述

算法描述如下:

页面装入内存
初始化为0
访问页面
	没有缺页
		置1
	缺页
		循环,从当前指针位置顺序检查环形链表
			访问位为0:
				替换
				退出循环
			为1:
				访问位置零
				继续查找

一个示例如下:
在这里插入图片描述

改进的clock算法,
在这里插入图片描述
合并写出的延时

6.2.5 最不常用算法(LFU)

每个页面增加访问计数,访问页面时,计数加1;
缺页时置换计数最小的页面。

相比于优先队列来说,附加一个计数器(只是一个成员)的链表是比较好维护的。

问题:

  • 算法开销较大(不论是时间还是空间,标志位数也增加了不少)
  • 开始时频繁使用,但以后不使用(计数定期右移)

6.2.6 Belady现象

采用FIFO等算法时可能出现分配的物理页数增加但缺页次数增加的现象。
比如对于1,2,3,4,1,2,5,1,2,3,4,5这个序列,

  • 如果FIFO队列长为3,缺页次数为9,
  • 如果FIFO队列长为4,缺页次数为10

原因是

  • FIFO算法的置换特征与局部性原理不相符。
  • 与进程访问的动态特征相矛盾。
    被它置换出去的页面并不一定是进程近期不会访问的。

哪些算法没有Belady现象?(了解)

  • LRU没有Belady现象,思考为什么
  • Clock和改进Clock是否有,为什么

6.2.7 几种算法的对比

都是依据时间排序,LRU依据页面最近访问时间排序,FIFO依据页面进入内存的时间排序

LRU需要动态调整,FIFO页面进入时间固定不变

LRU性能较好,但是系统开销较大,FIFO开销较小,但是会发生Belady现象。Clock算法是一种折中。

LRU可以退化成FIFO,比如页面进入内存之后没有被访问,最近访问时间就和最近进入内存的时间同(LRU适合单曲循环,但放电视剧只用FIFO即可)。这时LRU和Clock算法表现也相同

6.3 全局页面置换算法

6.3.1 背景

很多时候,很少量的页面数限制成为算法的瓶颈,比如这个例子:
在这里插入图片描述
在这里插入图片描述
增加一个物理页面之后,整个置换过程中缺页数量都大大减小。

因而我们思考,可以通过进程之间的物理页面数目的均衡,来改善不同进程的置换算法的表现。

全局置换算法就为进程分配可变数目的物理页面。

  • 进程在不同阶段的内存需求是变化的。
  • 分配给进程的内存也需要在不同阶段也不同。
  • 全局置换算法需要确定分配给进程的物理页面数

CPU利用率与并发进程数相互相互促进、相互制约。
在这里插入图片描述

  • 进程数少时,提高并发进程数,可以提高CPU利用率
  • 并发进程导致内存访问增加
  • 并发进程的内存访问会降低访存的局部性特征(各自为政的害处qwq)

6.3.2 工作集置换算法

在这里插入图片描述

这也能表现出局部性原理的正确性。

常驻集:当前时刻,进程实际驻留在内存中的页面集合。

工作集置换算法和LRU相似,但是是在访存时将不在工作集内的页面换出。
在缺页时直接补入。

6.3.3 缺页率置换算法

缺页率(page fault rate):
P F R = 缺 页 次 数 / 访 存 次 数 或 1 M T B F PFR = {缺页次数}/{访存次数}\quad或\quad \frac{1}{MTBF} PFR=/访MTBF1
通过调节常驻集大小,使每个进程的缺页率保持在一个确定的范围内
在这里插入图片描述

  • 如果PFR过高,则增加常驻集大小
  • 如果PFR过低,则会降低并发度,使CPU利用率下降

具体实现时:

  • 访存时,设置引用位标志
  • 缺页时,计算MTBF
    • 如果MTBF>T,则置换所有这个区间中未被引用的页
    • 如果MTBF<T,则增加缺失页到常驻集

负载控制
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值