缺页中断与页面置换算法

1 缺页中断:
  进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存加载该页到内存的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。
2 页面置换算法:
  页式虚拟存储器实现的一个难点是设计页面调度(置换)算法,即将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就要按某种策略来废弃某个页面,将其所占据的物理页释放出来,好的算法,让缺页率降低。常见的有先进先出调度算法(FIFO),最近最少调度算法(LFU,根据时间判断),最近最不常用调度算法(LRU,根据使用频率判断),最佳置换算法(OPT)
3 页面置换与缺页中断次数的计算:
 3.1 先进先出置换算法(FIFO):
  FIFO是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。 假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。
  三个物理块先后加载的数据如下图所示:

缺页中断与页面置换算法_第1张图片

  进程运行时,先将7, 0, 1三个页面依次装入内存(初次加载也会激发缺页中断)。进程访问页面2时,把最早进入内存的页面7换出。然后访问页面3时,再把2, 0, 1中最先进入内存的页换出。由上图可以看出,利用FIFO算法时进行了 12次页面置换,效果不是特别好。
  FIFO算法还会产生当所分配的物理块数增大而页故障数不减反增的异常现象,这是由 Belady于1969年发现,故称为Belady异常,如下图所示。只有FIFO算法可能出现Belady 异常,而LRU和OPT算法永远不会出现Belady异常。
缺页中断与页面置换算法_第2张图片

  注意:内存的页面中“最老“的页面,会被新的网页直接覆盖,而不是“最老“的页面先出队,然后新的网页从队尾入队。
 3.2 最近最久未使用(LRU)算法:
  这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。
  再对上面的实例釆用LRU算法进行页面置换,如下图所示。进程第一次对页面2访问时,将最近最久未被访问的页面7置换出去。然后访问页面3时,将最近最久未使用的页面1换出。
缺页中断与页面置换算法_第3张图片

  LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类的算法。理论上可以证明,堆栈类算法不可能出现Belady异常。FIFO算法基于队列实现,不是堆栈类算法。
 3.3 最佳置换算法(OPT):
  从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
  进程要访问页面2时,产生缺页中断,根据最佳置换算法,选择第18次访问才需调入的页面7予以淘汰。然后,访问页面0时,因为已在内存中所以不必产生缺页中断。访问页面3时又会根据最佳置换算法将页面1淘汰……依此类推,如下图所示,从图中可以看出釆用最佳置换算法时的情况。
  可以看到,发生缺页中断的次数为9,页面置换的次数为6。
缺页中断与页面置换算法_第4张图片

  实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。


  参考文献:
  http://www.cnblogs.com/zhangbaochong/p/5827167.html
  http://blog.csdn.net/cjl5678/article/details/9010353

你可能感兴趣的:(内存管理与优化)