[操作系统] 页面置换算法(二)

来源:互联网 发布:儿童计算机编程培训 编辑:程序博客网 时间:2024/04/29 04:51

页面置换算法(二)


  • 页面置换算法二
    • 工作集基本概念
      • 什么是工作集
      • 工作集模型
      • 工作集的另一种定义
    • 工作集页面置换算法
    • 工作集时钟页面置换算法
    • 小结


1. 工作集基本概念

1. 什么是工作集

在单纯的分页系统里,刚启动进程时,在内存中并没有页面。在CPU试图读取第一条指令时就会产生一次缺页中断,使操作系统装入含有第一条指令的页面。其他由访问全局数据和堆栈引起的缺页中断通常会紧接着发生。一段时间后,进程需要的大部分页面都已经在内存了,进程开始在较少缺页中断的情况下运行。这个策略称为请求调页,因为页面是在需要时被调入的,而不是预先装入。

大部分进程在工作时表现出了一种局部性访问行为,即在进程运行的任何阶段,它都只是访问较少的一部分页面。而进程当前正在使用的页面的集合被称作它的工作集

显而易见,如果整个工作集都被装入到了内存中,那么进程在运行到下一运行阶段之前,不会产生很多缺页中断。但若内存太小而无法容纳整个工作集,那么进程在运行过程中就会产生大量的缺页中断。若每执行几条指令程序就发生一次缺页中断,就称这个程序发生了颠簸

2. 工作集模型

多道程序设计中,经常会把进程转移到磁盘上(即从内存中移走所有页面),这样可以让其他的进程有机会占有CPU,但是当进程再次调回来时,还要重新处理缺页中断,浪费时间。所以不少分页系统会设法跟踪进程工作集,以确保让进程运行以前它的工作集就在内存中,该方法称为工作集模型,其目的在于减少缺页中断率。在让进程运行前预先装入其工作集页面称为预先调页(注意工作集是随时间变化的)。

在任意时刻t,都存在一个集合,包含了最近所有k次所访问过得页面。这个集合w(k, t)就是工作集。因为最近1次访问过后的工作集肯定包含最近2次访问的工作集中的页面。所以w(k, t)是一个单调非递减函数。工作集不可能无限变大,因为程序不可能访问比它的地址空间所能容纳的页面数目上限还多的页面。

为了实现工作集模型,操作系统必须跟踪哪些页面在工作集中。然后通过这些信息推导出一个合理的页面置换算法。当发生缺页中断时,淘汰一个不在工作集中的页面。

3. 工作集的另一种定义

根据定义,工作集就是最近k次内存访问所使用过的页面的集合。所以为了实现工作集算法,必须预先k的值。k值被确定后,页面集合就是惟一确定的了。

  1. 向后找最近k次的内存访问
    设想有一个长度为k次的移位寄存器,每进行一次内存访问就左移一位,然后再最右端插入刚才所访问过的页面号。移位寄存器中的k个页面号的集合就是工作集。理论上,当缺页中断发生时,只要读出移位寄存器中的内容,并排序删除重复页面后,结果就是工作集。然而,维护寄存器并在缺页中断时处理它所需要的开销很大,因此该技术没有被使用过。

  2. 考虑执行时间
    按照以前的方法,定义工作集为前1000万次内存访问所使用过的页面集合,那么现在可以定义:工作集是过去10ms中的内存访问所用到的页面的集合。进程只计算自己的执行时间,如果一个进程在T时刻开始,在T+100 ms的时刻使用了40ms的CPU时间,工作集只是40ms。一个进程从它开始执行到当前所实际使用的CPU时间的总数通常称作当前实际运行时间。

    在这里,进程的工作集可以被称为在过去t秒实际运行时间中它所访问过的页面的集合。

2. 工作集页面置换算法

基本思路是找出一个不在工作集中的页面并淘汰它。在页表中,每个表项至少包含了两条信息:上次使用该页面的近似时间和R(访问)位。其他的域如页框号、保护位、M(修改)位在该算法中不需要,被忽略(用空白域表示)。

工作集算法

假设使用硬件来设置R(访问)位和M(修改)位。同样,假设在每个时钟滴答中,有一个定期的时钟中断会用软件的方法来清除R位。每当缺页中断发生时,扫描页表以找出一个合适的页面淘汰之。

在处理每个表项时,需要检查R位。如果是1,就把当前实际时间写进页表项的”上次使用时间”域,以表示缺页中断时该页面正在被使用。既然该页在当前时钟滴答中已经被访问过,那么很明显它应该出现在工作集中,并且不应该被删除(假设t足够大并横跨多个时钟滴答)。

如果R是0,那么表示在当前时钟滴答中,该页面还没有被访问过,则它就可以作为候选者被置换。我们需要计算它的生存时间(即当前实际运行时间减去上次使用时间),然后与t做比较。如果生存时间较大,那么它就应该被淘汰。

如果R是0,但是生存时间小于等于t,那么该页面应该留在工作集中。并记录下生存时间最长的页面。如果整个表中都没有适合淘汰的页面,只能淘汰生存时间最长的页面。

存在一种情况,所有页面的R位都为1,即都在工作集中,这时需要随机选择一个页面淘汰。最好选择一个没有被有被修改过的干净页面,因为这样可以直接被淘汰,而不需要将该页面在写回磁盘,可以节省时间。

3. 工作集时钟页面置换算法

当缺页中断发生后,需要扫描整个页表才能确定被淘汰的页面。所以基本工作集算法比较费时。有一种改进算法,基于时钟算法,并且使用了工作集信息,称为WSClock(工作集时钟)算法。

与时钟页面置换算法一样,所需的数据结构是一个以页框为元素的循环表。

工作集时钟页面算法

最初,该表是空的当装入第一个页面时,把它加到该表中。随着更多的页面的加入,它们形成一个环。每个表项包含来自基本工作集算法的上次使用时间,以及R(访问)位和M位(修改位,图中由每个表项上面的空白域表示)。

与时钟页面置换算法一样,每次缺页中断时,首先检查指针指向的页面。如果R为被置位1,该页面在当前工作集中,不该被淘汰。然后把该页面R置为0,指针指向下一个页面,重复该算法。

当指针指向的页面R=0时,同样是比较生存时间与t。若生存时间较大,并且页面是干净的,就淘汰该页面,并把新页面放在其中。如果该页面被修改过,不能立即申请页框,为了避免写磁盘操作引起的进程切换,指针继续向前走,找到一个旧的并干净的页面。存在一种可能,所有的页面因为磁盘I/O在某个时钟周期被调度。为了降低磁盘阻塞,所以需要设置一个值n,目的是限制最大只允许写回n个页面。一旦到达该限制,不允许调度新的写操作。

如果指针经过一圈并返回起始点,存在两种情况

  1. 至少调度了一次写操作

    对于这种情况,指针仅仅是不停地移动,寻找一个干净页面。既然已经调度了一个或多个写操作,最终一定会有一个某个写操作完成,并且它的页面会被标记为干净。置换遇到的第一个干净页面,这个页面不一定是第一个被调度写操作的页面。因为磁盘驱动程序可能把写操作重排序。

  2. 没有调度过写操作

    对于这种情况,所有页面都在工作集中。简单的方法是随便选择一个干净页面淘汰,所以在上一步的扫描过程中,需要记录所有干净页面的位置。如果不存在干净页面,那么就把当前页面淘汰。

4. 小结

算法 注释 最优算法 不可实现,但可以用作基准 最近未使用(NRU)算法 最近最少使用(LRU)算法的粗糙近似 先进先出(FIFO)算法 可能抛弃最近需要使用的页面 第二次机会算法 对先进先出算法的改善 时钟算法 第二次机会算法的更好性能的实现 最近最少使用(LRU)算法 很优秀,但是需要硬件实现 最不经常使用(NFU)算法 LRU的粗略近似 老化算法 近似LRU的有效算法 工作集算法 实现起来开销很大 工作集时钟算法 有好的效率的算法


参考书目:现代操作系统第三版

原创粉丝点击