当前位置:   article > 正文

清华 操作系统原理 (课程笔记)——页面置换算法_belady现象的原因是fifo算法的置换特征与进程访问内存的动态特征是矛盾的,即

belady现象的原因是fifo算法的置换特征与进程访问内存的动态特征是矛盾的,即

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


功能目标

功能:

缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换。

目标:

尽可能地减少页面的换进换出次数(即缺页中断的次数)

具体来说,把未来不再使用的或短期内较少使用的页面换出,通常只能在局部性原理指导下依据过去的统计数据来进行预测;目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体来说,把未来不再使用的或短期内较少使用的页面换出,通常只能在局部性原理指导下依据过去的统计数据来进行预测;

页面锁定(frame locking)

用于描述必须常驻内存的操作系统的关键部分或时间关键(time-critical)的应用进程。实现的方法是:在页表中添加锁定标志位(lock bit)。页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键(time-critical)的应用进程。实现的方法是:在页表中添加锁定标志位(锁位)。

实验设置与评价方法

在这里插入图片描述

局部页面置换算法

最优页面置换算法(OPT)

基本思路:
当一个缺页中断发生时,对于保存在内存当中的每一个逻辑页面,计算在它的下一次访问之前,还需等待多长时间,从中选择等待时间最长的那个,作为被置换的页面。这只是一种理想情况,在实际系统中是无法实现的,因为操作系统无从知道每一个页面要等待多长时间以后才会再次被访问。
可用作其他算法的性能评价的依据(在一个模拟器上运行某个程序,并记录每一次的页面访问情况,在第二遍运行时即可使用最优算法 )。
在这里插入图片描述
下一次访问到D所需的时间是最长的,所以替换d。

先进先出算法(FIFO)

基本思路:
选择在内存中驻留时间最长的页面并淘汰之。具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短。
当发生一个缺页中断时,把链首页面淘汰出局,并把新的页面添加链表的末尾。性能较差,调出的页面有可能是经常要访问的页面,并且有Belady现象。FIFO算法很少单独使用。

在这里插入图片描述

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

** 基本思路**
当一个缺页中断发生时,选择最久未使用的那个页面,并淘汰之。
它是对最优页面置换算法的一个近似,其依据是程序的局部性原理,即在最近一小段时间(最近几条指令)内,如果某些页面被频繁地访问,那么在将来的一小段时间内,它们还可能会再一次被频繁地访问。反过来说,如果在过去某些页面长时间未被访问,那么在将来它们还可能会长时间地得不到访问。

在这里插入图片描述

LRU算法需要记录各个页面使用时间的先后顺序,开销比较大。两种可能的实现方法是:
系统维护一个页面链表,最近刚刚使用过的页面作为首结点,最久未使用的页面作为尾结点。每一次访问内存时,找到相应的页面,把它从链表中摘下来,再移动到链表之首。每次缺页中断发生时,淘汰链表末尾的页面。
设置一个活动页面,当访问某页时,将此页号压入栈顶,然后,考察栈内是否有与此页面相同的页号,若有则抽出。当需要淘汰一个页面时,总是选择栈底的页面,它就是最久未使用的。
在这里插入图片描述

时钟页面置换算法 (Clock)

Clock页面置换算法,LRU的近似,对FIFO的一种改进;
需要用到页表项当中的访问位,当一个页面被装入内存时,把该位初始化为0。然后如果这个页面被访问(读/写),则把该位置为1;(硬件自动完成置一)
把各个页面组织成环形链表(类似钟表面),把指针指向最老的页面(最先进来);
当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,直到找到被淘汰的页面,然后把指针移动到它的下一格。

在这里插入图片描述

例子视频链接10:04 开始讲这个例子的执行过程
在这里插入图片描述
加入脏位后,可以减少置换的开销。
该页脏位为0,没有被写过。
在这里插入图片描述
例子视频链接,7:00开始解释这个例子
在这里插入图片描述

Enhanced Clock算法变体

更强调区分干净页(修改位为0)和脏页(修改位为1):

useddirtyuseddirty
00releaserelease
01replacereplace
1000
1101

这种变化的有效性取决于系统的特定工作负载和访问模式。如果干净页面和脏页面之间有明显的区别,并且您希望优先替换最近没有引用的脏页面,那么它可能会很好地工作。

最不常用算法(LFU)

基本思路
当一个缺页中断发生时,选择访问次数最少的那个页面,并淘汰之。实现方法:对每个页面设置一个访问计数器,每当一个页面被访问时,该页面的访问计数器加 1。在发生缺页中断时,淘汰计数值最小的那个页面。
LRU和LFU的区别:LRU考察的是多久未访问,时间越短越好;而LFU考察的是访问的次数或频度,访问次数越多越好。

问题:

一个页面在进程开始时使用得很多但以后就不使用了。实现也费时费力。
解决方法:定期把次数寄存器右移一位。
在这里插入图片描述

Belady现象

Belady(科学家名字):

分配的物理页面数增加缺页率反而提高的异常现象;

Belady现象的原因:

FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面 ),因此,被它置换出去的页面并不一定是进程不会访问的。Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面 ),因此,被它置换出去的页面并不一定是进程不会访问的。
**例子**当物理页只有3个的时候,缺页次数x=9
在这里插入图片描述
当物理页为4个的时候,缺页次数x=10
在这里插入图片描述
在这里插入图片描述
为什么LRU和Clock 不会出现Belad现象?
LRU和Clock 考虑了访问页动态最优的策略。

LRU、FIFO和Clock的比较

LRU和FIFO
LRU算法和FIFO本质上都是先进先出的思路,只不过LRU是针对页面的最近访问时间来进行排序,所以需要在每一次页面访问的时候动态地调整各个页面之间的先后顺序(有一个页面的最近访问时间变了);
而FIFO是针对页面进入内存的时间来进行排序,这个时间是固定不变的,所以各页面之间的先后顺序是固定的。
如果一个页面在进入内存后没有被访问,那么它的最近访问时间就是它进入内存的时间。换句话说,如果内存当中的所有页面都未曾访问过,那么LRU算法就退化为FIFO算法。例如:给进程分配3个物理页面,逻辑页面的访问顺序为1、2、3、4、5、6、1、2、3….
LRU算法性能较好,但系统开销较大;FIFO算法系统开销较小,但可能会发生Belady现象。因此,折衷的办法就是Clock算法,在每一次页面访问时,它不必去动态地调整该页面在链表当中的顺序,而仅仅是做一个标记,然后等到发生缺页中断的时候,再把它移动到链表末尾。对于内存当中那些未被访问的页面,Clock算法的表现和LRU算法一样好;而对于那些曾经被访问过的页面,它不能象LRU算法那样,记住它们的准确位置。

全局页面置换算法

局部页替换算法的问题

每个进程采用一个固定的局部页面替换算法会有一些问题:
在这里插入图片描述
在这个情况下,4个页帧可以有效减少缺页的次数, 如果能够根据不同的阶段动态分配每个进程的页帧大小。–全局页面置换算法

工作集模型

前面介绍的各种页面置换算法,都是基于一个前提,即程序的局部性原理。但是此原理是否成立
如果局部性原理不成立,那么各种页面置换算法就没有什么分别,也没有什么意义。例如:假设进程对逻辑页面的访问顺序是1、2、3、4、5、6、7、8、9…,即单调递增,那么在物理页面数有限的前提下,不管采用何种置换算法,每次的页面访问都必然导致缺页中断。如果局部性原理是成立的,那么如何来证明它的存在,如何来对它进行定量地分析?这就是工作集模型!
在这里插入图片描述
类似时间窗口滑动
举个例子: 06:29开始解释这个例子
在这里插入图片描述
工作集大小的变化:进程开始执行后,随着访问新页面逐步建立较稳定的工作集。当内存访问的局部性区域的位置大致稳定时,工作集大小也大致稳定;局部性区域的位置改变时,工作集快速扩张和收缩过渡到下一个稳定值。
在这里插入图片描述
常驻集是指在当前时刻,进程实际驻留在内存当中的页面集合。
工作集是进程在运行过程中固有的性质,而常驻集取决于系统分配给进程的物理页面数目,以及所采用的页面置换算法;
如果一个进程的整个工作集都在内存当中,即常驻集 包含工作集,那么进程将很顺利地运行,而不会造成太多的缺页中断(直到工作集发生剧烈变动,从而过渡到另一个状态);当进程常驻集的大小达到某个数目之后,再给它分配更多的物理页面,缺页率也不会明显下降。所以需要全局的动态分配。

工作集页置换算法

思路:当某个页不在固定的工作集范围内,就替换掉。
在这里插入图片描述

缺页率置换算法

可变分配策略:常驻集大小可变。例如:每个进程在刚开始运行的时候,先根据程序大小给它分配一定数目的物理页面,然后在进程运行过程中,再动态地调整常驻集的大小。可采用全局页面置换的方式,当发生一个缺页中断时,被置换的页面可以是在其它进程当中,各个并发进程竞争地使用物理页面。优缺点:性能较好,但增加了系统开销。具体实现:可以使用缺页率算法(PFF)来动态调整常驻集的大小。
缺页率表示“缺页次数/内存访问次数”(比率)或“缺页的平均时间间隔的倒数”。影响缺页率的因素:页面置换算法分配给进程的物理页面数目页面本身的大小程序的编写方法。
在这里插入图片描述
在这里插入图片描述
时间差大,频率低,减少工作集。 时间差很小,频率高,增加工作集。

在这里插入图片描述

举例:Time =4, 距离上一次出现缺页= 3 >T=2 ,所以不移除(当前页-T=4-2=2)到当前页使用过的页面,其他都删除。
特点:当出现缺页中断的时候才决定是否替换
而工作集页面置换算法是每次都判断是否需要替换
多个正在运行的程序,全局页替换算法比局部页替换算法要好。

抖动问题

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

在这里插入图片描述
故障间隔时间和缺页服务时间的概念:MTBF指的是系统在两次故障之间的平均时间间隔,而PFST指的是系统在发生缺页时,从发现缺页完成页面加载所需的平均时间。

故障检测和修复机制:当系统发生故障时,MTBF决定了系统能够及时检测到故障并进行修复的时间间隔。而PFST则决定了系统在缺页时能够及时加载页面并恢复服务的时间。如果MTBF等于PFST,那么系统在发生故障或缺页时都能够及时进行修复或加载页面,使得系统保持高效运行状态。

系统稳定性和可靠性的提高:当MTBF等于PFST时,系统的故障间隔时间和缺页服务时间相等,使得系统的稳定性和可靠性得到提高。这是因为系统能够及时发现并修复故障,避免了因故障导致的停机或性能下降等问题,从而提高了系统的稳定性和可靠性。


总结

页面置换算法目标: 降低缺页中断频率。
局部页面置换算法:
1、OPT: 最优页面置换算法,使用虚拟环境模拟出来的,作为其他算法的参照目标。
2、FIFO: 编程最简单算法,缺点:存在belady现象。
3、LRU:最近最久未使用, 没有belady现象,开销和编程难度大
4、Clock:把各个页面组成环形链表,每次发生缺页中断,若访问位0->淘汰,若访问1->0,指针移到下一个。
5、LFU:最不常用的,根据的是频率。
全局页面置换算法:
1、工作集替换算法:工作窗口滑动,只保留窗口内的页面
2、缺页率置换算法:出现缺页中断的时候,如果tcurrent- tlast>T,之后从内存中移除所有在[tlast ,tcurrent]时间内没有被引用的页。之后减少工作集。如果tcurrent-tlast < T,添加缺失页到工作集中。增加工作集。
理解这些算法之后,当给定一个页面的执行的序列,可以挑选合适的算法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/687655
推荐阅读
相关标签
  

闽ICP备14008679号