O p t i m a l 最 佳 页 面 置 换 算 法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

清华大学操作系统公开课(五)页面置换算法

下面介绍在虚拟存储管理中有哪些页面置换算法。

局部页面置换算法

最优页面置换算法(OPT,optimal)

? 先进先出算法(FIFO)

? 最近最久未使用算法(LRU,Least Recently Used)

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

? 最不常用算法(LFU,Least Frequently Used)

? Belady现象

? LRU、FIFO和Clock的比较

全局页面置换算法

工作集模型

? 工作集页置换算法

? 缺页率置换算法

2.页面置换算法

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

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

页面锁定(frame locking)

页面锁定技术是用来锁定物理内存中不应该被换出的内存数据。用于描述必须常驻内存的操作系统的关键部分或时间关键(time-critical)的应用进程。实现的方法是:在页表中添加锁定标志位(lock bit)。

我们该如何评估不同页面置换算法的优劣?通过程序运行时的效率来比较是不容易实现的,可以记录下一个进程对页面的访问轨迹,然后模拟一个页面置换的行为并且记录产生页缺失的数量,以此比较优劣。

3.最优页面置换算法

基本思路

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

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

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

物理内存大小为4个帧,刚开始存入的物理帧是a、b、c、d,一共需要载入5个帧,当访问e时发生缺页中断,此时置换入e,置换出d,因为下一次访问d的等待时间最长,暂时用不到d,可以让d待在外存。

4.先入先出算法(First-In First-Out,FIFO)

基本思路

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

链首页面的驻留时间最长,链尾页面的驻留时间最短。当发生一个缺页中断时,把链首页面淘汰出局,并把新的页面添加到链表的末尾。

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

FIFO算法实现简单,一个单一指针足够,但是缺页中断比别的算法可能要多。比如在时间5时,换入e就换出链表头的a,当7时又要换入a,换出此时的链表头的b。

5.最近最久未使用算法(Least Recently Used,LRU)

基本思路

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

LRU算法在时间5访问e的时候发生缺页,此时他发现c是最久没被引用过的,上一次被访问是在时间1的时刻,故换出c换入e,后面换入换出的过程也如此。

LRU实现办法

LRU算法需要记录各个页面使用时间的先后顺序,开销比较大,两种可能的实现方法是:

系统维护一个页面链表,最近刚刚使用过的页面作为首节点,最久未使用的页面作为尾节点。每一次访问内存时,找到响应的页面,把它从链表中摘下来,再移动到链表之首。每次缺页中断发生时,淘汰链表末尾的页面。实现时可用hashmap+链表将查找响应节点的时间复杂度降到O(1)。

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

6.时钟页面置换算法

我们既想要FIFO那样的高效简单实现,又想要LRU那样较少的缺页率,所以采用一种折中的Clock页面置换算法,是LRU的近似,对FIFO 的一种改进。时钟页面置换算法是一种不精确的访LRU算法。

基本思路

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

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

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

要注意的是,每次访问页表项时,页表项置为1的操作是硬件直接完成的。(我觉得Clock算法中指针移到上边变1为0的操作是软件完成

的)。

基本思路中所说的环形链表、指针、访问位形式大致如图所示。置换的流程要注意以下几点:

访问位置1的操作是由硬件自动完成的:每次访问的时候,硬件会检查页表项的访问位是否为1,如果不是则置为1。

指针只有在发生缺页异常的时候才移动,检查移动到的页访问位是否为1,如果为1则置为0继续扫变页面寻找bit = 0,如果为0则换出。换出以后,指针往后移动一个。

可以从示例更方便地看出如何运行,前四步访问时未发生缺页中断,硬件自动把a~d访问位置1,时间5访问了e发生缺页中断,指针移动寻找bit=0的页表项,发现第一轮旋转a~d都是1,把它们每一个变成0,第二轮找到a的bit=0,换出a换入e,然后硬件自动置e的访问位为1。如此继续下去,置换的时候注意上面两个要点不难看懂。

7.二次机会置换算法(优化的时钟页面置换算法)

基本思路

只通过访问位没办法区分写操作和读操作,而只被读过的页换出开销小,可以直接回收内存空间,省去了写回的操作。但被写过的页在内存中的数据和在外存中的数据不一致,回收时需要写回外存,这就增加了额外的开销。页表项中还有一项修改位(dirty bit)标志是否发生写操作,可以利用修改位的信息减少修改页的缺页处理开销。?

二次机会置换算法中利用访问位和修改位同时指导置换。

可以看到相较普通的CLOCK时钟置换算法而言,同时考虑访问位和

相关文档
最新文档