在进程运行过程中,若其所要访问的页面不在内存,需要把它们调入内存,但内存已无空间时,就需要考虑将从内存中调出一页程序或数据送到磁盘的对换区中,这个过程需要一点的算法来确定,下面就是一些常见的页面调度算法。
1. 最佳置换算法
从名字我们就可以看出来,这种算法通常来说是一种理想化的算法,不可能知道被调出的页在以后的时间内都不会被访问。
最佳置换算法:其所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面,采用这种算法可以保证最低的缺页率,但这种算法是不实际的,因为我们无法知道一个进程在内存的若干个页面中,哪一个页面是未来最长时间不再被访问的。
2. 先进先出(FIFO)页面置换算法
先进先出页面置换算法,该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面给予淘汰,但是性能较差,因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况
3. 最近最久未使用(LRU - Least Recently Userd)页面置换算法
LRU置换算法是选择最近最久未使用的页面给予淘汰,该算法为每个页面赋予一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面给予淘汰
4. 最少使用(LFU - Least Frequently Userd)页面置换算法
该置换算法选择在最近时期使用最少的页面作为淘汰页,在对时间进行度量时,采用移位寄存器方式。每次访问某页时,便将该移位寄存器的最高位置置1,再每隔一段时间右移一次,这样,在最近一段时间使用最少的页面将是最小的页
5. Clock 置换算法
简单的 Clock 置换算法
当利用简单 Clock 算法,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置为1,置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,给予该页第二次驻留内存的机会,再按照 FIFO 算法检查下一个页面,
改进型的 Clock 置换算法
在将一个页面换出时,如果该页已被修改过,便将该页重新写回到磁盘,但如果该页未被修改过,则不必将它拷回磁盘。
在改进型 Clock 算法中,除需考虑页面的使用情况外,还须再增加一个因素 - 置换代价。这样,选择页面换出时,既要是未使用的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位 A 和修改位 M 可以组合成以下四种类型的页面:
- 类(A=0, M=0):表示该页最近即未被访问,又未被修改,是最佳淘汰页。
- 类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页
- 类(A=1,M=0):表示最近已被访问,但未被修改,该页可能会被再次访问
- 类(A=1,M=1):表示最近已被访问且已被修改,该页可能再被访问
改进版的算法1执行过程:
- 从指针所指示的当前位置开始,扫描循环队列,寻找 A=0 且 M=0 的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A
- 如果第一步失败,即查找一轮后未遇到第一类页面,则开始第二轮扫描,寻找 A=0 且 M=1 的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置为0
- 如果第二步也失败,则将指针返回到开始的位置,必将所有的访问位复0,然后重复第一步,即寻找 A=0 且 M=0 的第一类页面,如果仍失败,重复第二步,寻找 A=0 且 M=0
该算法与简单 Clock 算法比较,可减少磁盘的 I/O 操作数。