进程“抖动”
进程页面置换过程中,刚被换出的页面很快又要被访问,需要将它重新调入,此时又需要再选一页调出;而此时刚被调出的页面很快又被访问,又需将它调入,如此频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上,我们称该进程发生了“抖动”。
最佳(Optimal)置换算法
最佳置换算法是一种理论上的算法,其所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。
采用最佳置换算法通常可保证获得最低的缺页率,但由于人们目前还无法预知,一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。
先进先出(FIFO)页面置换算法
FIFO算法是最早出现的置换算法,该算法总是淘汰最先进入内存的页面,即选择在内存驻留时间最久的页面予以淘汰。
FIFO算法所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况,因此该算法性能较差。
最近最久未使用(LRU:Least Recently Used)置换算法
LRU页面置换算法是根据页面调入内存后的使用情况做出决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。
最少使用(LFU:Least Frequently Used)置换算法
LFU置换算法选择在最近时期使用最少的页面作为淘汰页。
Clock置换算法
- 简单的Clock置换算法
当利用简单Clock算法时,只需为每一页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,给予该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。
但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法或NRU(Not Recently Used)算法。 - 改进型的Clock置换算法
在改进型Clock算法中,除须考虑页面的使用情况外,还须再增加一个因素--置换代价。这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两种条件的页面作为首选淘汰的页面。由访问位A和修改位M可以组合成下面四种类型的页面:- 类(A=0,M=0):表示该页最近既未被访问,又未被修改,是最佳淘汰页。
- 类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
- 类(A=1,M=0):表示最近已被访问,但未被修改,该页有可能再被访问。
- 类(A=1,M=1):表示最近已被访问且被修改,该页可能再被访问。
改进型Clock算法的执行过程可分为以下三步: - 从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
- 如果第一步失败,即查找一轮后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0。
- 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,即寻找A=0且M=0的第一类页面,如果仍失败,必要时再重复第二步,寻找A=0且M=1的第二类页面,此时就一定能找到被淘汰的页。
该算法与简单Clock算法比较,可减少磁盘的I/O操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。