操作系统:页面置换算法

  • 页面置换算法的功能

    • 当缺页中断发生时,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换。
  • 页面置换算法的目标

    • 尽可能的减少页面的换进换出次数(即缺页中断的次数)。
  • 最佳置换算法(OPT)

    • 当一个缺页中断发生时,对于保存在内存当中的每一个页面,计算在他的下一次访问之前,还需等待多长时间。从中选择等待时间最长的那个,作为被置换的页面。
    • 这只是一种理想情况,在实际系统中是无法实现的。因为操作系统无从知道每一个页面要等待多长时间以后才会再次被访问。
    • 可用作其他算法的性能评价的依据。
      image
  • 先进先出置换算法(FIFO)

    • 选择在内存中驻留时间最长的页面并置换之。具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短。当发生一个缺页中断时,把链首页面置换出去,并把新的页面添加到链表的末尾。
    • 性能较差,置换出去的页面有可能是经常要访问的页面,并且有Belady现象
      image
  • 最近最久未使用置换算法(LRU)

    • 当一个缺页中断发生时,选择最久未使用的页面,并置换之。
    • 它是对最有页面置换算法的一个近似,其依据是程序的局部性原理。即在最近一小段时间内,如果某些页面被频繁的访问,那么在将来的一小段时间内,它们还可能再一次被频繁的访问。
    • 反过来说,如果在过去某些页面长时间未被访问,那么在将来它们还可能会长时间地得不到访问。
      image
    • LRU算法需要记录各个页面使用时间地先后顺序。所以开销比较大,两种可能地实现方法:
      • 链表:维护一个页面链表,最近刚刚使用过地页面作为首节点,最久未使用地页面作为尾节点。每一次访问内存时,找到相应地页面,把他从链表中摘下来,再移动到链表首部,每次缺页中断发生时,置换链表末尾地页面。
      • 栈:当访问某页面时,将此页号压入栈顶,然后,考察栈中是否有与此页面相同地页号,若有,则抽出。当需要淘汰一个页面时,总是选择栈底地页面,它就是最久未被使用的。
  • 时钟置换算法(CLOCK)

    • LRU的近似,对FIFO的一种改进。
    • 需要用到页表项中的访问位,当一个页面被装入内存时,把该位初始化为0,然后如果这个页面被访问,则把该位置为1.
    • 把各个页面组织成环形链表,把指针指向最老的页面(最先进来)。
    • 当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,直到找到被淘汰的页面,然后把指针移动到它的下一格。(操作系统会定期将访问位置0)
      image
  • 改进的时钟置换算法
    image

    • 优先把只读的页置换出去,对于可写的页减少被置换出去的概率。
原文地址:https://www.cnblogs.com/xiaobaizzz/p/12266823.html