操作系统 - 页面置换算法

本文深入探讨了操作系统中的页面置换算法,包括最优算法(OPT)、先进先出(FIFO)、最近最久未使用(LRU)、时钟算法及其变种。这些算法在内存管理和缺页处理中扮演关键角色,各有优缺点。例如,FIFO可能导致Belady现象,而LRU则是OPT的一种近似实现。此外,工作集和缺页率算法用于动态调整进程的物理页面分配,以优化CPU利用率和内存效率。
摘要由CSDN通过智能技术生成

置换算法的功能和目标

功能:
当出现缺页异常,需调入新页面而内存已满时,置换算法 选择被置换的物理页面

设计目标:
尽可能减少页面的调入调出次数
把未来不再访问或短期内不访问的页面调出

页面锁定(frame locking):
描述必须常驻内存的逻辑页面
操作系统的关键部分
要求响应速度的代码和数据
页表中的锁定标志位(lock bit)

置换算法的评价方法:
模拟页面置换行为,记录产生缺页的次数
更少的缺页, 更好的性能

页面置换算法分类

局部页面置换算法

  • 置换页面的选择范围仅限于当前进程占用的物理页面内
  • 最优算法、先进先出算法、最近最久未使用算法
  • 时钟算法、最不常用算法

全局页面置换算法

  • 置换页面的选择范围是所有可换出的物理页面
  • 工作集算法、缺页率算法

最优页面置换算法(OPT, optimal)

基本思路:置換在未来最长时间不访向的页面

算法实现:
缺页时,计算内存中每个逻辑页面的下一次访问时间,选择未来最长时间不访问的页面

算法特征:
缺页最少,是理想情况。
OPT在实际系统中无法实现。
无法预知每个页面在下次访向前的等待时间。
作为置换算法的性能评价依据,在模拟器上运行某个程序,并记录每一次的页面访问情况,第二遍运行时使用最优算法。

最优页面置换算法(OPT)示例:
在这里插入图片描述

先进先出算法(First-In First-Out, FIFO)

思路:
选择在内存驻留时间最长的页面进行置换

实现:
维护一个记录所有位于内存中的逻辑页面链表
链表元素按驻留内存的时间排序,链首最长,链尾最短
出现缺页时,选择链首页面进行置换,新页面加到链尾

特征:
实现简单。
性能较差,调出的页面可能是经常访问的。
进程分配物理页面数增加时,缺页并不一定减少(Belady现象)。
很少单独使用。

先进先出算法(FIFO)示例:
在这里插入图片描述

最近最久未使用算法 (Least Recently Used, LRU)

思路:
选择最长时间没有被引用的页面进行置换
如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问

实现:
缺页时,计算内存中每个逻辑页面的上一次访问时间
选择上一次使用到当前时间最长的页面

特征:
最优置换算法的一种近似

最近最未被使用算法(LRU) 示例:
在这里插入图片描述

LRU算法的可能实现方法

1、页面链表:
系统维护一个按最近一次访问时间排序的页面链表,链表首节点是最近刚刚使用过的页面,链表尾节点是最久未使用的页面。
访问内存时,找到相应页面,并把它移到链表之首。
缺页时,置换链表尾节点的页面。

2、活动页面栈:
访问页面时,将此页号压入栈顶,并栈内相同的页号抽出。
缺页时,置换栈底的页面。

用栈实现LRU算法示例:
在这里插入图片描述

时钟置换算法(Clock)

思路:
仅对页面的访问情况进行大致统计

数据结构:
在页表项中增加访问位,描述页面在过去一段时间的内访问情况
各页面组织成环形链表
指针指向最先调入的页面

算法:
访问页面时,在页表项记录页面访问情况
缺页时,从指针处开始顺序查找未被访问的页面进行置换

特征:
时钟算法是LRU和FIFO的折中

时钟置换算法的实现

页面装入内存时,访问位初始化为0
访问页面(读/写)时,访问位置1
缺页时,从指针当前位置顺序检查环形链表

  • 访问位为0,则置换该页
  • 访问位为1,则访问位置0,并指针移动到下一个页面,直到找到可置换的页面

时钟置换算法图示
在这里插入图片描述
时钟页面置换示例:
在这里插入图片描述

改进的Clock算法

思路:
减少修改页的缺页处理开销

算法:
在页面中增加修改位,并在访问时进行相应修改
缺页时,修改页面标志位,以跳过有修改的页面

在这里插入图片描述
改进的Clock算法示例:
在这里插入图片描述

最不常用算法(Least Frequently Used, LFU)

思路:
缺页时,置換访问次数最少的页面

实现:
每个页面设置一个访问计数
访向页面时,访问计数加1
缺页时,置换计数最小的页面

特征:
算法开销大
开始时频繁使用,但以后不使用的页面很难置换

  • 解决方法:计数定期右移

LRU和LFU的区別:
LRU关注多久未访问,时间越短越好
LFU关注访问次数,次数越多越好

LFU算法示例:
执行在4个页帧中:假定最初的访问次数a->8 b->5 c->6 d->2
在这里插入图片描述

Belady现象

现象:
采用FIFO等算法时,可能出现分配的物理页面数增加,缺页次数反而升高的异常现象

原因:
FIFO算法的置换特征与进程访问内存的动态特征矛盾
被它置换出去的页面并不一定是进程近期不会访问的

思考:
哪些置换算法没有Belady现象?

FIFO算法有Belady现象
在这里插入图片描述
在这里插入图片描述
LRU算法没有Belady 现象
在这里插入图片描述

LRU、FIFO和Clock的比较

LRU算法和FIFO本质上都是先进先出的思路

  • LRU依据页面的最近访问时间排序
  • LRU需要动态地调整顺序
  • FIFO依据页面进入内存的时间排序
  • FIFO的页面进入时间是固定不变的

LRU可退化成FIFO

  • 如页面进入内存后没有被访问,最近访问时间与进入内存的时间相同
    例如:给进程分配3个物理页面,逻辑页面的访问顺序为1、2、3、4、5、6、1、2、3…

LRU算法性能较好,但系统开销较大

FIFO算法系统开销较小,会发生Belady现象

Clock算法是它们的折衷

  • 页面访问时,不动态调整页面在链表中的顺序,仅做标记
  • 缺页时,再把它移动到链表末尾

对于未被访问的页面,Clock和LRU算法的表现一样好

对于被访问过的页面,Clock算法不能记录准确访问顺序,而LRU算法可以

局部置换算法没有考虑进程访存差异

全局置换算法

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

全局置换算法要解决的问题:

  • 进程在不同阶段的内存需求是变化的
  • 分配给进程的内存也需要在不同阶段有所变化
  • 全局置换算法需要确定分配给进程的物理页面数
CPU利用率与并发进程数的关系

在这里插入图片描述
CPU利用率与并发进程数存在相互促进和制约的关系:

  • 进程数少时,提高并发进程数,可提高CPU利用率
  • 并发进程导致内存访问增加
  • 并发进程的内存访问会降低了访存的局部性特征
  • 局部性特征的下降会导致缺页率上升和CPU利用率下降
工作集

一个进程当前正在使用的逻辑页面集合,可表示为二元函数W(t, △)

  • t是当前的执行时刻
  • △ 称为工作集窗口(working-set window ),即一个定长的页面访问时间窗口
  • W(t, △)是指在当前时刻 t 前的 △时间窗口中的所有访问页面所组成的集合
  • | W(t, △) | 指工作集的大小,即页面数目

进程的工作集示例:
在这里插入图片描述
在这里插入图片描述

工作集的变化

进程开始执行后,随着访问新页面逐步建立较稳定的工作集
当内存访问的局部性区域的位置大致稳定时,工作集大小也大致稳定
局部性区域的位置改变时,工作集快速扩张和收缩过渡到下一个稳定值
在这里插入图片描述

常驻集

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

工作集与常驻集的关系

  • 工作集是进程在运行过程中固有的性质
  • 常驻集取决于系统分配给进程的物理页面数目和页面置换算法

缺页率与常驻集的关系

  • 常驻集⊇工作集时,缺页较少
  • 工作集发生剧烈变动(过渡)时,缺页较多
  • 进程常驻集大小达到一定数目后,缺页率也不会明显下降
工作集置换算法

思路:
换出不在工作集中的页面

窗口大小τ
当前时刻前τ个内存访问的页引用是工作集,τ被称为窗口大小

实现方法:
访存链表:维护窗口内的访存页面链表
访存时,换出不在工作集的页面;更新访存链表
缺页时,换入页面;更新访存链表

工作集置换算法示例
在这里插入图片描述

缺页率(page fault rate)

缺页次数 / 内存访问次数 或 缺页平均时间间隔的倒数

影响缺页率的因素:
页面置换算法
分配给进程的物理页面数目
页面大小
程序的编写方法

缺页率置换算法(PFF, Page-Fault-Frequency)

通过调节常驻集大小,使每个进程的缺页率保持在一个合理的范围内

  • 若进程缺页率过高,则增加常驻集以分配更多的物理页面
  • 若进程缺页率过低,则减少常驻集以减少它的物理页面数
    在这里插入图片描述
    缺页率置换算法的实现
    在这里插入图片描述
    缺页率置换算法示例
    在这里插入图片描述

抖动问题(thrashing)

抖动:
进程物理页面太少,不能包含工作集
造成大量缺页,频繁置换
进程运行速度变慢

产生抖动的原因:
随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升

操作系统需在并发水平和缺页率之间达到一个平衡:
选择一个适当的进程数目和进程需要的物理页面数

负载控制

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxhlh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值