请求分页系统的核心问题是选择合适的页面置换算法,否则系统可能会产生“抖动”(即颠簸)。所谓抖动是指刚被换出的页很快又被访问,需重新调入,导致系统频繁地更换页面,以致一个进程在运行中把大部分时间花费在完成页面置换的工作上。
1)最佳置换算法
2)先进先出(FIFO)置换算法
该算法总是淘汰最先进入主存的页面,即选择在主存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入主存的页面按先后次序链接成一个队列,并设置一个指针即可。该算法是一种最直观但性能差的算法,并且有BELADY异常现象,即分配的物理块增加时,却也次数反而增加。
例:对页面的访问序列0、1、2、3、0、1、4、0、1、2、3和4,分配的物理块分别为3块和4块,计算缺页次数。
① 分配的物理块为3块时,采用先进先出算法的内存分配情况:
访问页面012301401234物012301444233理
01230111422块
0123000144缺页×××××××
××
② 分配的物理块为4块时,采用先进先出算法的内存分配情况如下图所示:
访问页面012301401234物012333401234理
01222340123块
0111234012
000123401缺页××××
××××××
3)最近最久未使用置换算法LRU(Least Recently Used)
该算法是选择最近最久未使用的页面予以淘汰,系统在每一个页面设置一个访问字段,用以记录这个页面自上次被访问依赖所经历的时间T,当要淘汰一个页面时,选择T最大的页面。但在实现时需要硬件的支持(寄存器或栈)。
访问页面07657473547456576076物00657473547456576076理
7065747354745657607块
776554735574465760缺页××××
×
××××
×
×
×
4)最近未用置换算法NUR(Not Used Recently)
该算法将最近一段时间未引用过的页面换出。这是一种LRU的近似算法。该算法为每一个页面设置一位访问位,将主存中的所有页面都通过链接指针链成一个循环队列。当某页被访问时,其访问位置“1”。在选择一页淘汰时,检查其访问位,如果是“0”,则选择该页换出;若为“1”,则重新置为“0”,暂不换出该页,在循环队列中检查下一个页面,直到访问置换时将未使用过的页面换出去。
1)最佳置换算法
这是一种理想化的算法,性能最好,但是难以实现,该算法选择那些永不使用或者在最长时间内不再被访问的页面并将它们置换出去。但是要确定哪一个页面是未来最长时间内不再被访问是很难估计的,所以该算法通常用来评价其他算法。
算法是这样工作的:在页面失效发生时,有些页面在内存中,其中有一个页面(包含紧接着的下一条指令的那个页面)将很快被访问,其他页面则可能要到10,100或1000条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数进行标记。最优页面置换算法只是简单滴规定,标记最大的页面应该被淘汰,如果一个页面在800万条指令内不会被使用,另外一个页面在600万条指令内不会被使用,则淘汰前一个,从而把因需要调入这个页面而发生的页面失效推到将来,越久越好。
2)先进先出(FIFO)置换算法
该算法总是淘汰最先进入主存的页面,即选择在主存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入主存的页面按先后次序链接成一个队列,并设置一个指针即可。该算法是一种最直观但性能差的算法,并且有BELADY异常现象,即分配的物理块增加时,却也次数反而增加。
例:对页面的访问序列0、1、2、3、0、1、4、0、1、2、3和4,分配的物理块分别为3块和4块,计算缺页次数。
① 分配的物理块为3块时,采用先进先出算法的内存分配情况:
访问页面012301401234物012301444233理
01230111422块
0123000144缺页×××××××
××
② 分配的物理块为4块时,采用先进先出算法的内存分配情况如下图所示:
访问页面012301401234物012333401234理
01222340123块
0111234012
000123401缺页××××
××××××
3)最近最久未使用置换算法LRU(Least Recently Used)
该算法是选择最近最久未使用的页面予以淘汰,系统在每一个页面设置一个访问字段,用以记录这个页面自上次被访问依赖所经历的时间T,当要淘汰一个页面时,选择T最大的页面。但在实现时需要硬件的支持(寄存器或栈)。
访问页面07657473547456576076物00657473547456576076理
7065747354745657607块
776554735574465760缺页××××
×
××××
×
×
×
4)最近未用置换算法NUR(Not Used Recently)
该算法将最近一段时间未引用过的页面换出。这是一种LRU的近似算法。该算法为每一个页面设置一位访问位,将主存中的所有页面都通过链接指针链成一个循环队列。当某页被访问时,其访问位置“1”。在选择一页淘汰时,检查其访问位,如果是“0”,则选择该页换出;若为“1”,则重新置为“0”,暂不换出该页,在循环队列中检查下一个页面,直到访问置换时将未使用过的页面换出去。