目录
在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置换算法。页面置换算法的好坏,将直接影响系统的性能。
一个好的页面置换算法,应做到减少页面置换的频率。尽量将以后不会用到的或较长时间不会使用的页面给置换出。
下面介绍几种常用的页面置换算法。
一、最佳置换算法OPT
理论上的算法,所选择的被淘汰的页面将是永远不用的,或许是在最长未来时间内不再被访问的页面。由于人们无法预知哪个页面在未来最长时间内不被访问,因此该算法无法实现,但通常用来评价其他算法。
可以保证最少的缺页率。
二、先进先出置换算法FIFO
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
只在FIFO算法中出现 belady现象:物理块增加,缺页率升高。
三、最近最久未使用置换算法LRU
该算法以过去预测未来,选择之前最长时间未使用的页面置换。但是由于利用“过去”作为“未来”的近似这一做法并非完全可靠,因此有时会造成缺页率非常高,导致效率会非常低。
缺页率
缺页率指的是访问页面失败次数除以进程页面访问总次数。
设访问成功次次数为S,访问失败次数为F,访问总次数A=S+F,缺页率f=F/A。
例题
假定系统为某进程分配了三个物理块,并按以下页面号引用。
4,3,2,1,4,3,5,4,3,2,1,5
·假设物理块初始为空,计算缺页次数和缺页率。
OPT
OPT | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
页1 | 4 | 3 | 2 | 1 | 1 | 1 | 5 | 5 | 5 | 2 | 1 | 1 |
页2 | 4 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 5 | 5 | 5 | |
页3 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | ||
缺页显示 | √ | √ | √ | √ | √ | √ | √ |
共缺页中断7次,缺页率为7/12*100%=58.3%
FIFO
FIFO | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
页1 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 5 | 5 | 2 | 1 | 1 |
页2 | 4 | 3 | 2 | 1 | 4 | 3 | 3 | 3 | 5 | 2 | 2 | |
页3 | 4 | 3 | 2 | 1 | 4 | 4 | 4 | 3 | 5 | 5 | ||
缺页显示 | √ | √ | √ | √ | √ | √ | √ | √ | √ |
共缺页中断9次,缺页率为9/12*100%=75%
LRU
LRU | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
页1 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
页2 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | |
页3 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | ||
缺页显示 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
共缺页中断10次,缺页率为10/12*100%=83.3%
一些其他的页面置换方式:
Clock(循环)置换算法
因LRU要较多硬件支持,故应用中常采用LRU近似算法。
简单 Clock置换算法
只需为每页设置一位访问位,再将内存中所有页面都用连接指针链接成一循环队列。当某页被访问时,置访问位为1。
检查页的访问位,为0换出;为1重置0 ,暂不换出。再按FIFO算法检查下一页面,若到末页访问位仍为1时,返回队首,循环往复。
改进型Clock置换算法
换出时,若页面被修改过,须写回到磁盘;若未被修改,则不必拷回磁盘。
此算法,除考虑页面使用情况外,还考虑置换代价。即未使用过,未修改过为最佳对象。
可通过访问位A和修改位M查看∶
1类(A=0,M=0):最佳淘汰页。√2类(A=0,M=1):次佳淘汰页。
√3类(A=1,M=0):该页可能再被访问。4类(A=1,M=1):最可能再被访问。
最少使用置换算法LFU
在内存中的每个页面设置一个移位寄存器,记录该页面被访问的频率。
该置换算法选择在最近时期使用最少的页面作为淘汰页。
页面缓冲算法PBA
页面缓中算法(PBA)则既可改善分页系统的性能,又可采用一种较简单的置换策略。VAX/VMS操作系统便是使用页面缓冲算法。它采用了前述的可变分配和局部置换方式,置换算法采用的是FIFO。
该算法规定将一个被淘汰的页放入两个链表中的一个,即如果页面未被修改,就将它直接放入空闲链表中;否则,便放入已修改页面的链表中。