3.4 页面置换算法
3.4.1 最优页面置换算法
无法实现的算法。简单的说置换出最长指令之后需要访问的页面。
3.4.2 最近未使用页面置换算法
系统为每一个页面设置两个位,一个是被访问时设置R位,另一个是修改页面被写入时设置M位。
如果在一段时间内(比如说20ms)未访问则将R设置为未访问。
如果已经修改则需要将M设置为访问。所有页面分为四类
- 没有被访问,没有被修改
- 没有被访问,已被修改
- 已被范围,没有被修改
- 已被访问,已被修改
算法随机的从类变量最小的非空类中挑选一个页面淘汰。
3.4.3先进先出页面置换算法
记录最先使用的页面最先淘汰
3.4.4第二次机会页面置换算法
寻找一个最近时钟间隔一来没有访问过的页面。如果所有页面都被访问过了,该算法就是FIFO算法。
按照FIFO算法构成一个链表,检查最老页面的R位,如果页面未被读取,则淘汰,如果页面是1,将该页面的R位置0,并且把它放回到链表的队尾。
3.4.5时钟置换页面
第二次机会页面置换算法虽然比较合理,但是它需要经常移动链表效率不高。时钟置换是将页面保存在一个类似钟型的环形链表中,一个表针指向最老的页面。
发送缺页中断时,检测表针指向的页面,如果它的R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针移一个位置。
如果R是1就清除R位,然后指针后移,重复上述步骤。
3.4.6 最近最少使用页面置换算法
在发生缺页中断时置换未使用时间最长的页面。
理论上可实现,但是成本太高。且需要硬件配合。
3.4.7用软件模拟LRU
- NFU(Not Frequently Used,最不常用)算法。将每个页面与一个软件计数器相关联,计数器的初值为0。每次时钟中断时,由操作系统扫描内存中所有的页面,将每个页面的R位加到它的计数器上。这个计数器大体上跟踪了各个页面被访问的频繁程度。当发生缺页中断时,则置换计数器最小的页面。
- 主要的问题是可能置换出有用的页面,因此采用老化(aging)的方法。所以对算法进行简单的改进:
首先,在R位被加进之前先将计数器右移一位,其次将R位加到计数器最左端而不是最右端的位。 - LRU和老化算法的区别:一是LRU算法有时无法确定该置换出哪个页面?二是老化算法计数器只有有限位,限制了其对以往页面的记录
- 主要的问题是可能置换出有用的页面,因此采用老化(aging)的方法。所以对算法进行简单的改进:
3.4.8工作集页面置换算法
一个进程当前使用的页面的集合称为它的工作集。不少系统都会设法跟踪进程的工作集,其目的在于大大减少缺页中断在让进程运行前先装入其工作集页面也称为预先调页(prepaging)
根据定义,工作集就是最近k次内存访问所使用过的页面的集合,为了实现工作集算法,必须预先选定k的值。
一个进程从它开始执行到当前实际使用的CPU时间总数通常称作当前实际运行时间。
机器保存一个在内存内的页面的页表,每个页表项至少包含两条信息。上次使用该页面的近似时间和R(访问)位。
该算法的工作方式:假定使用硬件来置位R和位M。同样假定在每个时钟滴答中,有一个定期的时钟中断会用软件方法来清除R位。
3.4.9 工作集时钟页面置换算法
WSClock(工作集时钟)算法就是:
每次缺页中断时,首先检查指针指向的页面。如果R位被置为1,该页面在当前时钟滴答中就被使用过,那么该页面就不适合被淘汰。然后把该页面的R位置为0,指针指向下一个页面并重复该算法。
如果指针经过一圈返回它的起始点会发生声明呢?:
1. 至少调度了一次写操作,指针仅仅是不停的移动,寻找一个干净页面。既然已经调度了一个或者多个写操作,最终会有某个写操作完成,它的页面会被标记为干净。置换遇到的第一个干净页面。这个页面不一定是第一个被调度到写操作的页面。因为硬盘驱动程序为了性能优化可能已经重排序写操作
2. 没有调度过写操作。所有页面都在工作集中,否则至少将调度了一个写操作。随便置换一个干净的页面来使用,扫描中需要记录干净页面的位置。如果没有干净页面就决定当前页面并把它写回磁盘。
3.4.10小结
老化算法和工作集时钟算法最好。