概念
缺页中断:缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。
页面置换算法:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
最佳置换算法(OPT)
即每次选择淘汰的页面将是以后用不使用的,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率
最佳置换算法可以保证最低的缺页率,但实际上,只有在进程的执行过程中才可以知道接下来会访问的页面,操作系统对接下来要访问的页面是不能进行预判的,因此该算法是不能被实现的。
先进先出置换算法(FIFO)
即每次选择淘汰的页面是最早进入内存的页面
实现:把调入内存的页面按照先后顺序放入队列,当需要进行换出页面时,将队头页面换出。队列的最大长度取决于系统为进程分配了多少个内存块。
Belady异常:当为进程分配的内存块增加时,缺页次数不减反增的现象
只有FIFO会产生Belady异常
FIFO虽然实现简单,但是算法与进程实际运行时的规律不符合,因为先进入的页面也有可能被经常访问。算法效率低
最近最久未使用置换算法(LRU)
即淘汰的页面为最近最久未使用的页面
实现:在页表项中,用访问字段记录该页面自上次访问以来所经历的时间t,当要淘汰页面时,选择t最大的淘汰。
该算法实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大
时钟置换算法(CLOCK)
时钟置换算法是一种性能和开销较均衡的算法,又称最近未用算法(NRU)
简单的时钟置换算法
实现:为每个页面设置一个访问位,并通过链接指针将所有页面链接为一个循环队列。当某页被访问的时候,将该页的访问位置为1,当需要淘汰一个页面时,只需要检查页的访问位,如果是0,将该页换出,如果是1,则将它置为0,暂不换出,继续检查下一个页面,直到找到访问位为0的页面,如果遍历一遍后所有页面都是1,此时所有页面已经都置为0,那么重新遍历队列即可。
由于该算法只考虑了一个页面是否最近被访问过,但没有考虑I/O操作,即如果被淘汰的页面没有被修改过,那么就不需要执行I/O操作写回外存。因此会造成性能的下降。
改进的时钟置换算法
在简单时钟置换算法的基础上,优先淘汰没有修改过的页面,规避I/O
实现:增加修改位,为0,没被修改过;为1,被修改过
算法规则:将所有可能被置换的页面排成一个队列
- 第一轮扫描:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
- 第二轮扫描:若第二轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。本轮将所有扫描过的帧访问位设置为0
- 第三轮扫描:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
- 第四轮扫描:若前三轮扫描均失败,则重新扫描,查找第一个(0,1)的帧用于替换。
由于第二轮已经将所有访问位设置为0,因此经过第三轮和第四轮一定会有一个帧被选中。