一、页面置环算法的概念
1、页面置环算法的概念
①功能:当缺页中断发生时,需要调入新的页面而内存已满时,置环算法选择被置换的物理页面
②目标:尽可能减少缺页中断(页面的换入换出)次数。在局部性原理下根据过去的数据统计预测。
③页面锁定(frame locking):用于描述必须常驻内存的内存的逻辑页面;操作系统的关键部分,或时间关键的应用进程(time-critical)。需要在页表中添加锁定标志位(lock bit)
④置环算法的评价方法
模拟页面置换行为,记录产生缺页的次数,更少的缺页,更好的性能。
2、局部页面置环算法
①最优页面置环算法(OPT optimal)②先进先出算法(FIFO)③最近最久未使用算法(LRU,Least Recently Used)④时钟页面置换算法(Clock)⑤最不常用算法(LFU,Least Frequently Used)⑥Belady算法
3、全局页面置环算法
①工作集置换算法②缺页率置换算法③抖动和负载控制
二、最优算法、先进先出算法和最近最久未使用算法
1、最优界面置换算法:
①基本思路:选择内存中等待时间最长(未来最长时间不访问)的页作为置换页面。
②算法实现:缺页时,计算内存中每个逻辑页面的下一次访问时间;选择未来最长时间不访问的页面。
③算法特征:只能是理想情况,OS无法实现(不知道未来情况)。
可以作为最佳的标准,在第二遍运行时利用第一次的访问轨迹使用最优算法。其他算法应尽量逼近。
2、先进先出算法( first-in first-out FIFO)
①思路:选择在内存中驻留时间最长的页面并淘汰之。OS维护着一个队列链表,淘汰首位,添加末位。
②实现:维护一个记录所有位于内存中的逻辑页面;链表元素按驻留内存时间排序,链首最长,链尾最短;出现缺页时,选择链首页面进行置环,新页面加到链尾。
③特征:性能较差,调出的页面可能是常用页面(驻留时间长,本身就说明可能常用),有belady现象(给的物理页帧越多反而缺页越频繁)。
3、最近最久未使用算法(least recently used LRU)
①思路:选择最久未使用的那个页面淘汰掉。
是对最优置换算法的近似,以过去推未来。根据程序的局部性原理,如果最近一段时间内某些页面被频繁访问,那么在将来还可能被频繁访问。反之,未被访问的将来也不会被访问。 程序应具有较好的局部性。
②实现:缺页时,计算内存中每个逻辑页面上一次访问时间;选择上一次使用到当前时间最长的页面
③两种可能的实现方法:
Ⅰ、页面链表:系统维护一个页面链表,最近刚使用的页面最为首节点,最久未使用的页面作为尾节点,每次访问内存动态更新头结点。缺页中断时,淘汰末位的页面。
Ⅱ、活动页面堆栈:访问某页时,将此页号入栈,并去除栈内的重复页。淘汰栈底的页面。(栈是先进后出,只有栈顶开口,怎么push栈底?)
动态更新(插,删,内部调整)堆栈和链表要开销,注意平衡—不是最有效
三、时钟置环算法和最不常用算法
1、时钟页面置换算法 clock ——LRU的近似,FIFO的改进
①思路:用到页表项的访问位(access bit),当一个页面被装入内存时,把该位初始化为0,被访问(读/写)时,硬件把它置为1. 而OS会定期清0。(1—最近被访问,0—-未访问)
把各个页面组成环形链表类似一个clock,指针指向最老的页面。
②算法:当发生一个缺页中断时,考察指针所指的最老页面,访问位是0则淘汰,如果是1则置为0,然后指针向下移动一格。如此下去直到淘汰某页。
在内存中维持一个环形页面链表,更新并删除used bit=0的页面
③算法实现:页面装入内存时,访问位初始化为0;访问页面(读/写)时,访问位置1;缺页时,从指针当前位置顺序检查环形链表【访问位为0,则置环该页;访问位为1,则访问位置0,并指针移动到下一个页面,直到找到可置换得页面】
2、改进的Clock算法
①思路:减少修改页得缺页处理开销
②算法:在页面增加修改位,并在访问时进行相应修改;缺页时,修改页面标志位,以跳过有修改得页面
3、最不常用算法(least frequently used)LFU
①思路:选择置换访问次数最少的那个页面
②实现:对每个页面设置访问计数器,当一个页面被访问时++。淘汰数值最小的那个。
③特征:硬盘计数器空间开销,排序查找时间开销;
4、LRU/LFU区别:LRU考察的是多久未访问,时间越短越值得留在内存,LFU是访问次数/频率,次数越多越好。
反例:一个页面在进程开始时使用的很多,但以后就不使用了。此时LFU就不适用了。
把时间也考虑进去,在一段时间内考察LFU。比如,定期把次数寄存器右移一位。
四、Belady现象和局部置环算法
1、FIFO belady现象:分配的物理页数增加,缺页率反而提高,原因是FIFO忽视了进程访问的动态特征。多次访问的不要走。尤其是最坏情况发生时,易高缺页率。
原因:FIFO算法的置换特征与进程访问内存的动态特征矛盾;被它置换出去的页面并不一定是进程近期不会访问的
2、综合比较局部页替换算法
① LRU和FIFO的比较:LRU和FIFO本质都是先进先出,但LRU是页面的最近访问时间而不是进入内存的时间,有动态调整,符合栈算法的特性,空间越大缺页越少。如果程序局部性,则LRU会很好。如果内存中所有页面都没有被访问过会退化为FIFO。
Clock 和enhanced clock也是类似于FIFO的算法,但用了硬件的BIT来模拟了访问时间和顺序,近似了LRU,综合起来较好,但也会退化为FIFO。
都对程序的访问次序有局部性的要求,不然都会退化。
② LRU、FIFO和Clock的比较:开销上,LRU开销大,FIFO开销小但BELADY,折中的是Clock算法,开销较小。对内存中还未被访问的页面,Clock效果等同LRU。Clock对曾经被访问过的则不能记住其准确位置,而LRU算法可以。
五、工作集置环算法
1、全局置换算法
①思路:全局置换算法为进程分配可变数目的物理页面
②解决问题:进程在不同阶段的内存需求是变化的;分配给进程的内存也需要在不同阶段有所变化;全局置换算法需要确定分配给进程的物理页面数
2、工作集(working set)
①定义:一个进程当前使用的逻辑页面集合,可以用一个二元函数W(t,Δ),t是当前执行时刻,Δ是工作集窗口(working-set window),一个定长的页面访问的时间窗口。t+Δ构成了一个时间段,W(t,Δ)就是在当前时刻t之前的Δ时间内所有访问页面组成的集合,在随t不断更新。| W(t,Δ)|是工作集的大小即页面数目。
②工作集的变化:进程开始后,随着访问新页面逐步建立较稳定的工作集,当内存访问的局部性区域的位置大致稳定时| W(t,Δ)|波动很小,在过渡阶段,则会快速扩张和收缩过渡到下一个稳定值。有波峰,有波谷。
3、常驻集
①定义:在当前时刻,进程实际驻留在内存当中的页面集合。
②工作集与常驻集的关系:工作集是固有性质,常驻集取决于系统分配给进程的物理页面数目和所采用的置换算法。
③缺页率与常驻集的关系:如果一个进程的常驻集与工作集尽量重叠,则不会造成太多缺页中断。当常驻集大小达到某个数目后,再分配物理页帧也不会有明显下降的缺页率——可以把多出来的物理页帧分给其他程序了。
4、工作集置换算法
①思路:换出不在工作集中的页面
②实现方法:访存链表:维护窗口内的访存页面链表;在访存时,换出不在工作集的页面;缺页时,换入页面,更新访存链表。
六、缺页率置环算法
1、缺页率
缺页率=缺页次数/内存访问次数 =1/缺页的平均时间间隔
影响因素有页面置换算法,分配给进程的物理页面数目(越多越小),页面本身的大小(页面大则会小),编程方法(局部性好就会小)
2、缺页率算法(PFF, page fault frequency)
①思路:动态调整常驻集的大小。性能较好,但增加了系统开销
②算法若缺页率高则增加工作集(Δ)来分配更多物理页面,若过低则减少工作集来减少其物理页面。使缺页率保持在一个合理的范围内。各个程序之间保持一个平衡。
③具体机制:根据缺页的时间间隔来判断 动态更新
保持追踪缺页概率,记录上次缺页到这次的时间间隔 t(current) -t(last),与T比较(自定义一个合理的间隔),若大于T,则缺页率小,置换所有在 [t(current) ,t(last)]时间内没有被引用的页;否则增加缺失页到工作集中。
七、抖动和 负载控制
1、抖动问题(thrashing)
①抖动:如果分配给一个进程的物理页面太少,常驻集远小于工作集,则缺页率会很大,频繁在内外存之间替换页面,使进程的运行慢,这种状态成为”抖动”。
②产生抖动的原因:随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减少,缺页率上升。因此OS要选择一个适当的进程数目和进程需要的帧数,在并发水平和缺页率中达到平衡。
2、加载控制(better criteria for load control: adjust MPL so that):