自学自用 = B站(操作系统_清华大学(向勇、陈渝)) 未完待续。。 (4)

例子:

访问时间: 10ns 磁盘访问时间:5ms = 5 * 10^6 ns page fault rate:p dirty page rate(页内容改变,同步到虚拟内存概率):q EAT = 10 * (1 - p) + 5 * 10^6 * p * (1 + q)

由上述例子可以看出,变量p对于整体EAT的影响最重要。

4.5 页面置换算法

缺页几率,是严重影响虚拟内存效率的一个因素,而缺页几率与页面置换算法息息相关。

功能:当缺页中断发生,需要加载新的帧页到内存,但当应用内存已满时,需要选择淘汰物理内存中的帧来给新的帧资源。

目标:尽可能的减少页面换进换出次数。
对于常驻内存(如操作系统或其他关键应用)添加锁定标志位,避免换出。

分类:分为局部页面置换和全局页面置换两大类

局部页面置换:

最优页面置换算法(OPT)(最晚重用被淘汰)(理想状态,无法实现,可为依据)

先进先出算法(FIFO)(存活久的被淘汰)(利用链表即可实现,最差情况下性能较差)

最近最久未使用算法(LRU)(最久没用被淘汰)(链表、堆栈可实现,但开销较大)

时钟页面置换算法(Clock)(利用FIFO优化的LRU)(环形链表选最老)

二次机会法(??)(Clock脏页版)(两条命的命中高,有了脏位换出少)

最不常用算法(LFU)(有的最少被抛弃)(表中加个计数器)

全局页面置换:

工作集页面置换算法(??)(利用工作集的LRU)(无须缺页就淘汰,利用时刻来换出)

缺页率页面置换算法(PFF)(动态改变常驻集的工作集算法)(根据缺页频率,淘汰多个页面)

4.5.1 最优页面置换算法(OPT)

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

评价:该算法无法实现或者说很难实现,因为OS无法预知每个页面下次访问需要的等待时间,但该算法可以作为其他算法评定的依据。

例图:

image

4.5.2 先进先出算法(FIFO)

基本思路:对于当前内存中的每一个逻辑页面,计算它载入内存的时间,从中选择驻留时间最长的页面,作为置换页。

评价:利用链表实现,载入向链尾加,换出删除链表头即可。

例图:

image

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

基本思路:选择最久未被使用的帧页,作为置换页。

评价:时间轴上与最优算法相反,符合局部性原理。在最近一段区间内,找到最久未使用的帧。对于记录各页面调用的先后顺序,开销较大,可以利用链表或堆栈实现。

例图:

image

4.5.4 时钟页面置换算法(Clock)

基本思路:与LRU相似,是FIFO的一种改进。是二者之间的一种平衡。实现是在页面中加入一个访问位,一个页面载入时,由硬件初始化为0(软件也可以),如果页面被访问,则相应页表项置为1。将各页表项组成一个环形链表,发生缺页中断时,指针循环判断环形链表,若判断的页表项为0,选为置换页,置换并访问新页后,新页表项置为1,指针下移;若判断的页表项为1,则改为0,指针下移。

image

评价:时间轴上与最优算法相反,符合局部性原理。在最近一段区间内,找到最久未使用的帧。对于记录各页面调用的先后顺序,开销较大,可以利用链表或堆栈实现。

例图:

image

4.5.5 二次机会法()

基本思路:对Clock算法的一个改进,优化Clock算法对修改页面的写入逻辑,引入新位dirty bit(脏位)来标识内存修改过与虚存不一致。对于脏位为0的页面,不必进行同步回虚存的一步。而对于脏位为1的页面,多了一次存活机会,与访问位用法一样。

image

评价:优化Clock算法的换出效率,并利用两个标识位拥有两条命,来增加存活率,加大命中次数。

例图:

image

4.5.6 最不常用算法(LFU)

基本思路:选择访问次数最少的页为置换页。所以要维护一张表,对每个页都有个访问计数器。

评价:LRU关注访问过去时间,久的淘汰;LFU关注访问次数,少的淘汰。

4.5.7 局部页面置换算法总结: Belady现象:

Belady(笔勒滴,一个科学家名)在采用FIFO算法时,有时会出现分配的物理页面数增加,缺页率反而提高(命中率反而下降)的反常现象。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywswg.html