07页面置换算法,最优、FIFO、最近最久未使用、时钟

对应视频内容:

6.1 最优页面置换算法
6.2 先进先出算法
6.3 最近最久未使用算法
6.4 时钟页面置换算法
6.5 二次机会法
6.6 最不常用法
6.7 Belady现象、LRU、FIFO、Clock的比较
6.8 局部页替换算法的问题、工作集模型
6.9 两个全局置换算法
6.10 抖动问题

  • 局部页面置换算法
  • 全局页面置换算法

一、页面置换算法功能与目标

功能:当缺页中断发生时,需要调入新页面;而此时物理内存已满,则需要选择页面进行替换。
目标尽可能减少页面的换进换出的次数(即缺页中断的次数)。因为读取磁盘比读取内存慢几个数量级。同时,操作系统常用的数据段要一直保留在内存中。
页面锁定(Frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键(time critical)的应用进程。实现方法是:在页表中添加锁定标志位(lock bit)。

进程对页访问实例

如上图,只保留进程对页号的访问轨迹,查看你产生缺页中断的次数。越少的缺页数量,越好的性能。

二、最优页面置换算法

将来最远未被使用的页面。

提出愿景:预知将来程序会访问哪些页面,由此决定替换谁。

基本思路:一个缺页中断发生时,对于保存在内存当中的一个逻辑页面,计算在它的下一次访问之前,还需等待多长时间,从中选择等待时间最长的那个,作为被置换页面。

这只是一种理想情况, 在实际系统中无法实现。 因为操作系统无法预知每一个页面要等待多长时间以后才会再次被访问。

可以把本算法作为一个评价标准(在模拟器上运行,第二遍运行时采用这最优算法)。

最优置换算法例子如上。

三、先进先出(FIFO)算法

基本思路:选择在内存中驻留时间最长的页面并淘汰之。具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短。

性能较差,调出页面可能是经常要访问的页面,并且有Belady现象 ,FIFO算法很少单独使用。

例如上,产生了更多的缺页中断。

四、最近最久未使用算法

过去最久未使用的的页面

Least Recently Used, LRU;

  • 基本思路:当一个缺页中断发生时,选择最久未使用的那个页面,并淘汰之。

  • 它是对最优页面置换算法的一个近似,其依据是程序的局部性原理,即在最近一小段时间(最近几条指令)内,如果某些页面被频繁地访问,那么在将来的一小段时间内,它们还可能会再一次被频繁地访问。

LRU算法例如上。产生了三次缺页中断。

性能分析问题

实现的开销比较大,

LRU算法需要记录各个页面使用时间的先后顺序,两种可能的实现方法。

  • 系统维护一个页面链表,最近刚刚使用过的页面作为首节点,最久未使用的作为尾结点。每一次访问内存时,找到相应的页面,把它从链表中摘下来,在移动到链表之首。每次缺页中断发生时,淘汰链表末尾的页面。
  • 设置一个活动页面“栈”,当访问某页时,将此页号压入栈顶,然后,考察栈内是否与此页面相同的页号,若有则抽出。当需要淘汰一个页面时,总是选择栈底的页面,它就是最久未使用的。
    每次访问都需要查找一般堆栈。 此算法代价很大。

如果用堆栈实现LRU,如上图。

五、时钟页面置换算法

Clock页面置换算法,LRU的近似,对FIFO的一种改进。

基本思路

  • 需要用到页表项当中的访问位,当一个页面被装入内存时,把该位初始化为0。然后如果这个页面被访问(读/写),则把该位置为1;

  • 把各个页面组织形成环形链表(类似钟表面),把指针指向最老的页面(最先进来);

  • 当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位(used bit)为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,指导找到被淘汰的页面,然后把指针移动到它的下一格。

如图所示。

例如上,缺页发生时,指针指为0者,被替换,并且指针指向下一位。实际工作环境中,此算法与LRU效果差不多。

六、二次机会法(Enhanced Clock algorithm)

本来的Clock算法有一个巨大的代价来替换“脏”页。
二次机会法增加一个bit(dirty bit),考虑此页是写还是读。
程序对页进行访问,如果是写,则11;如果是读,则10。
设置两个bit的值,都由硬件直接进行。

上图为算法机制。

为什么要有二次机会法?

页在被输入内存前,是存在于磁盘中的。

  • 如果程序只是对页进行读,则释放时只需删除该页就好(因为磁盘中已经存在此页),不需再写入磁盘;
  • 而程序对页进行写操作后,在内存中释放该页,则需要把此页写入磁盘中。
  • 因此,为了避免对磁盘中已有页面的重复写入,同时避免改变的页面过于频繁地进出内存,增加一个脏位(dirty bit)进行判断。
  • 二次机会是指:如果为11,指针会有两次访问的机会。

上图为二次机会法的例子。

七、最不常用算法

Least Frequently Used, LFU;

基本思路:当一个缺页中断发生时,选择访问次数最少的那个页面,并淘汰之,
实现方法:对每个页面设置一个访问计数器,每当一个页面被访问时,该页面的访问计数器加1。发生缺页中断时,淘汰计数值最小的那个页面。

最不常用算法问题

额外增加计数器,不符合OS设计原则;

每次中断要去查找一遍计数器,额外开销。、
一个页面只在进程开始时使用得多,以后就不用了。因此可以隔一段时间对访问次数进行一次更新或者其他操作(如左移一位,即除以2)。

八、Belady现象

在采用FIFO算法时,有时会出现分配的物理页面数增加,缺页率反而提高的异常现象。

原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面),因此,被它置换出去的页面并不一定是进程不会访问的。
FIFO算法可能由于物理页增加性能变差

如上图,物理页3页,访问12次时,三次没有产生缺页中断。

如上图,物理页4页,同样的访问序列时,只有两次没有产生缺页中断,性能反而变差了。

LRU算法则不会出现Belady现象

为什么LRU页面置换算法不会出现Belady现象?此处不详细解释,因为LRU算法符合栈算法的特点

《操作系统概念》中某节对于这种现象做了详细解释。

LRU、FIFO、和clock的比较

上述的算法都是针对一个进程的程序进行的,但是操作系统可以支持多进程的程序。

九、全局页面置换算法

局部页面置换算法问题

  • 上述的例子中,给一个进程分配三个物理页帧和四个物理页帧的区别

  • 刚才采用的局部置换算法有一个假设就是物理页帧是固定的

  • 如果多个程序都采用局部页面置换算法会产生问题,即某个程序对物理页帧大小是可变的。

  • 物理页帧大小对于置换算法性能影响极大。实际情况中,物理页帧可变,那该如何进行页面置换?

工作集模型

前面介绍的各种页面置换算法,包括即将介绍的全局页面置换算法,都要求程序具有局部性

工作集

工作集:一个进程当前正在使用的逻辑页面的集合。
可以用一个二元函数W(t,Δ)来表示:

  • t是当前的执行时刻;
  • A称为工作集窗口(working set window),即一个定长的页面访问的时间窗口;
  • W(t,Δ)=在当前时刻t之前的A时间窗口当中的所有页面所组成的集合(随着t的变化,该集合也在不断地变化);
  • |W(t,Δ)|指工作集的大小,即页面数目。

工作集例子

  • 以起始时间为t1看出,重复的访问7,但是时间局部性没有t2好。
  • 以起始时间为t2看出,具有很好的局部性特点,重复的访问3和4。
  • 当局部性好时,工作集大小趋于稳定。

工作集大小的变化

常驻集

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

  • 工作集是进程在运行过程中固有的性质,而常驻集取决于系统分配给进程的物理页面数目,以及所采用的页面置换算法;
  • 如果一个进程的整个工作集都在内存当中,即常驻集包含工作集,那么进程将很顺利地运行,而不会造成太多的缺页中断(直到工作集发生剧烈变动,从而过渡到另一个状态);
  • 当进程常驻集的大小达到某个数目之后,再给它分配更多的物理页面,缺页率也不会明显下降。
  • 即,常驻集是当前运行的程序,需要访问的页,哪些在内存中;
  • 工作集是程序在运行过程中,需要访问的页是哪些。

我们希望工作集都在常驻集中;如果不在则缺页中断。

十、全局置换算法

工作集替换算法

下图所示的时间窗页面置换。开始时,时刻为1时,工作集为[e,d,a,c]。

  • 随着时间滑动,未发生中断时也会释放划出的页面。
  • 跟局部替换算法不同,未在时间窗口内的页面会被替换,尽管当前任然有物理页帧能够使用
  • 可以确保系统在整个程序调用中,缺页次数降低,保证有足够的页面可以供多个程序使用

缺页率页面置换算法

如果常驻集大小可变,启发出:缺页率的页面置换算法。

可变分配策略:常驻集大小可变。例如:每个进程在刚开始运行的时候,先根据程序大小给它分配一定数目的物理页面,然后在进程运行过程中,再动态地调整常驻集的大小。

  • 可采用全局页面置换的方式,当发生一个缺页中断时,被置换的页面可以是在其他进程当中,各个并发进程竞争地使用物理页面。
  • 优缺点:性能较好,但是增加了系统开销。
  • 具体实现:可以使用缺页率算法(PFF,page fault frequency)来动态调整常驻集的大小。

缺页率

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

影响缺页率的因素

  • 页面置换算法
  • 分配给进程的物理页面数目
  • 页面本身的大小
  • 程序的编写方法

缺页率算法

如果缺页率过高,则增加工作集,来分配更多物理内存;
如果缺页率过低,则减少工作集,来减少该进程的物理内存分配。

缺页率算法流程

具体算法如下。

对于4时刻,4-1=3,大于2,则需要从工作集中去除1、2、3、4时刻没有访问过的页面,即a、e。

此类算法在采取多个运行的程序,有优势。

十一、抖动问题(thrashing,工作集、常驻集概念的拓展)

  • 如果分配给一个进程的物理页面太少,不能包含整个工作集,即常驻集属于工作集,那么进程将会造成很多的缺页中断,需要频繁地在内存与外存之间替换页面,从而使进程的运行速度变得很慢,称为“抖动”。
  • 产生抖动的原因:随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升。所以OS要选择一个适当的进程数目和进程需要的帧数,以便在并发水平和缺页率之间达到一个平衡。

频繁的抖动问题

抖动问题可能会被本体的页面置换改善

随着程序越来越多,机器会越来越迟钝。程序多,缺页多,操作系统频繁进行I/O操作,机器没有空闲执行程序。

因此,可寻找一个平衡点,利用率为平衡状态。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2021、小林子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值