页面置换算法

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

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

3、页面锁定(frame locking)

(1)用于描述必须常驻内存的操作系统的关键部分,或时间关键(time-critical)的应用进程

(2)实现的方法是:在页表中添加锁定标志位(lock bit)

4、缺页情况越少,性能越好

 

局部页面置换算法

1、最优页面置换算法(OPT)

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

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

(3)可用作其他算法的性能评价的依据,在一个模拟器上运行某个程序,并记录每一次的页面访问情况,在第二遍运行时即可使用最优算法

2、先进先出算法(FIFO)

(1)基本思路:淘汰在内存中驻留时间最长的页面,具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面,从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短,当发生一个缺页中断时, 把链首页面淘汰出去,并把新的页面添加到链表的末尾

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

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

(1)通过局部性原理反推,以历史推测未来

(2)基本思路:当一个缺页中断发生时,淘汰最久未使用的那个页面

(3)它是对 OPT 算法的一个近似,依据是程序的局部性原理,即在最近一小段时间(最近几条指令)内,如果某些页面被频繁地访问,那么再将来的一小段时间内,它们还可能会再一次被频繁地访问,反过来说,如果过去某些页面长时间未被访问,那么在将来它们还可能会长时间地得不到访问

(4)需要记录各个页面使用时间的先后顺序,开销比较大

(5)链表实现:系统维护一个页面链表,最近刚刚使用过的页面作为首节点,最久未使用的作为尾结点,再一次访问内存时,找出相应的页面,把它从链表中摘下来,再移动到链表首,每次缺页中断发生时,淘汰链表末尾的页面

(6)栈实现:设置一个活动页面栈,当访问某页时,将此页号压入栈顶,然后,考察栈内是否有与此页面相同的页号,若有则抽出,当需要淘汰一个页面时,总是选择栈底的页面,它就是最久未使用的

4、时钟页面置换算法(Clock)

(1)近似 LRU,改进 FIFO

(2)基本思路 :

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

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

(5)当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位为 0,立即淘汰;若访问位为 1,然后指针往下移动一格,如此类推,直到找到被淘汰的页面,然后把指针移动到下一格

(6)流程 :

(7)如果访问页在物理内存中,访问位设置为 1

(8)如果不在物理页,从指针当前指向的物理页开始,如果访问位为 0,替换当前页,指针指向下一个物理页;如果访问位为 1,设置为 0 后,访问下一个物理页再进行判断

(9)如果所有物理页的访问位都被设置为 0,即指针又回到第一次指向的物理页,将其进行替换

5、二次机会法

(1)Clock 有时候会把一些修改位为 1(有过写操作)的页面进行置换,,这样代价会比较大

(2)改进 Clock,可以结合访问位、修改位来决定应该置换哪一页

(3)访问位、修改位决定,替换的优先级不同:没有读也没写过,那么直接替换,,如果写过或读过,允许跳过一次,如果即写过又读过,允许跳过两次

6、最不常用算法(LFU)

(1)基本思路:当一个缺页中断发生时,淘汰访问次数最少的那个页面

(2)实现方法:对每一个页面设置一个访问计数器,每当一个页面被访问时,该页面的访问计数器加 1,当发生缺页中断时,淘汰计数值最小的那个页面

 

Belady现象

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

2、出现原因:FIFO 算法的置换特征,与进程访问内存的动态特征是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面),因此,被置换出去的页面不一定是进程不会访问的

 

LRU、FIFO、Clock

1、LRU、FIFO 本质都是先进先出的思路

(1)LRU:依据页面的最近访问时间排序,需要动态地调整顺序,算法性能较好,但系统开销较大

(2)FIFO:依据页面进入内存的时间排序,FIFO 的页面进入时间是固定不变的,算法系统开销较小,会发生 Belady 现象

2、LRU 可退化成 FIFO

(1)如页面进入内存后没有被访问,最近访问时间与进入内存的时间相同

(2)例如:给进程分配 3 个物理页面,逻辑页面的访问顺序为 1、2、3、4、5、6、1、2、3……

3、Clock 是 LRU、FIFO 的折中

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

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

 

全局页面置换算法

1、局部置换算法的问题:程序运行的过程中,需要物理页帧的数量不是固定的,不能动态分配

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

3、解决

(1)进程在不同阶段的内存需求是变化的

(2)分配给进程的内存也需要在不同阶段有所变化

(3)全局置换算法需要确定分配给进程的物理页面数

4、CPU 利用率与并发进程数存在相互促进和制约的关系

(1)进程数少时,提高并发进程数,可提高 CPU 利用率

(2)并发进程导致内存访问增加

(3)并发进程的内存访问会降低了访存的局部性特征

(4)局部性特征的下降会导致缺页率上升和 CPU 利用率下降

2、工作集模型

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

(2)t:是当前的执行时刻

(3)Δ:称为工作窗口,即一个定长的页面访问的时间窗口

(4)W(t, Δ) = 在当前时刻 t 之前的 Δ 时间窗口当中的所有页面所组成的集合(随着 t 的变化,该集合也在不断变化)

(5)|W(t, Δ)|:指工作集的大小,即页面数目

(6)工作集大小的变化:进程开始执行后,随着访问新页面逐步建立较稳定的工作集,当内存访问的局部性区域的位置大致稳定时,工作集大小也大致稳定;局部性区域的位置改变时, 工作集快速扩张和收缩过渡到下一个稳定值

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

3、工作集、常驻集的关系

(1)工作集是进程在运行过程中固有的性质

(2)而常驻集取决于系统分配给进程的物理页面数目,以及所采用的页面置换算法

4、缺页率、常驻集的关系

(1)常驻集与工作集交集越多时,缺页越少

(2)工作集发生剧烈变动(过渡)时,缺页较多

(3)进程常驻集大小达到一定数目后,再给它分配更多的物理页面,缺页率也不会明显下降

5、工作集页置换算法

(1)当工作集窗口在滑动过程中,如果页面不在工作集窗口中,那么就会直接丢失这个不在窗口中页面,而不会等待缺页中断再丢弃

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

(3)窗口大小:工作集当前时刻前 n 个内存访问的页引用

(4)实现

(5)访存链表:维护窗口内的访存页面,窗口大小固定不变

(6)访存时,换出不在工作集的页面,更新访存链表

(7)缺页时,换入页面,更新访存链表

6、缺页率置换算法

(1)可变分配策略 : 常驻集大小可变

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

(3)访问内存不缺页时,就把相应的页面的访问位设置为1

(4)缺页时,把当前时间和上次缺页的时间相减计算时间间隔,如果时间间隔大于给定窗口的话,说明缺页率过低了,需要置换窗口中所有未访问的页面;如果时间间隔小于给定窗口的话,就说明缺页率过高,把缺页的添加进内存

(4)与上述工作集算法不同的是,缺页率置换算法只在缺页时才进行页面的增加或减少,这样在缺页中断的时候可以把置换的过程部分提交给硬件进行处理,提高了性能,但增加了系统开销

(5)缺页率 = 缺页次数 / 内存访问次数

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

 

抖动问题

1、如果分配给一个进程的物理页面太少,常驻集不能包含整个的工作集,那么进程将会造成很多的缺页中断,需要频繁的在内存与外存之间替换页面,从而使进程的运行速度变得很慢

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

3、OS 要选择一个适当的进程数目和进程需要的帧数

(1)通过调节并发进程数(MPL)来进行系统负载控制

(2)平衡并发进程数、CPU 利用率、缺页率

(3)平均缺页间隔时间(MTBF)= 缺页异常处理时间(PFST)

(4)ΣWSi = 内存的大小

posted @   半条咸鱼  阅读(714)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示