操作系统(5)虚拟存储--页面置换算法:局部置换算法、全局置换算法

版权声明:版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lililuni/article/details/83685463

1:页面置换算法的相关概念

  1. 功能和目标
    置换算法并不是针对一个进程,而是一系列进程
    ==1==
  2. 页面锁定
    有些页面是不能把它放到外存里的
    ==2==
  3. 置换算法的评价方法
    通过记录进程访问内存的页面轨迹来模拟页面置换行为,记录产生缺页的次数
    ==3==
  4. 页面置换算法分类
    局部:在内存中,给每个进程分配的页面总数是不会变化的。
    全局:置换页面的选择范围是所有可换出的物理界面
    ==4==

2:局部置换算法

1.最优、先进先出、最近最久未使用算法

  1. 最优算法(OPT optimal):不可实现
    基本思路:置换在未来最长时间不访问的页面
    ==5==
    ==6==
    算法示例:

    在1-4时刻,访问都是可以正常访问的,在时刻5,需要访问e页面,这时候根据最优算法调出d页面,产生一次缺页,然后6-9时刻也是可以正常访问的,在时刻10时,也产生一次缺页。

    ==7==


  1. 先进先出算法(FIFO):最简单
    思路:选择在内存驻留时间最长的页面进行置换
    ==8==
    算法示例:

    在时刻5,最先进来的页面是a,所以将e替换a,同时,逻辑链表变成了bcde

    ==9==


  1. 最近最久未使用算法(LRU Least Recently Used):开销大
    思路:选择最长时间没有被引用的页面进行置换
    ==10==
    算法示例:

    在时刻5时,最久未被引用的是c,替换c。

    ==11==
    可能实现方法:
    ==12==
    示例:

    在时刻5,置换栈底的页面c,同时将压入栈顶。在时刻6,将栈中的b移到栈顶(开销)

    ==13==


2.时钟置换算法和最不常用算法

这两个算法实际上是对FIFO和LRU的一些简化

  1. 时钟置换算法(Clock)(LRU和FIFO的折中)
    • 思路:仅对页面的访问情况进行大致统计
    • 数据结构:
      ==14==
    • 算法:
      ==15==
    • 示例:
      • 先将各页面组成一个环形链表
        ==16==
      • 当访问页号1时,将页号1的访问位置1,如果再次访问页号1,则访问为仍是1.
        ==17==
      • 当缺页的时候,就从指针出开始顺时针寻找访问位为0的(在这过程中,将访问位为1的清零),在下图就是找到了页号4,将页号4置换出去
        ==18==
    • 改进的时钟算法
      ==19==
      ==20==

      在上图中,第二行时,修改位为1表示该页被修改过,这时候就修改位置0,同时将修改存入外存。第三行和第4行的处理方式和时钟算法一致。


  1. 最不常用算法(LFU,Least Frequently Used)
    • 思路:缺页时,置换访问次数最少的页面
    • 实现:
      ==21==
    • 特征:算法开销大,开始时频繁使用,但以后不使用的页面很难置换(可以采用计数定期右移解决)。
    • 示例:
      ==22==

3.Belady现象和局部置换算法的比较

  1. Belady现象:FIFO有,LRU没有,

    1. 现象解释:局部置换算法给每个进程分配的物理页面数是一定的,当缺页次数过高时,就需要增加分配物理页面数,但此时并不一定会降低缺页次数(主要是置换算法采用的是FIFO算法等)。
    2. 原因:FIFO算法的置换特征与进程访问内存的动态特征是有矛盾的,被它置换出去的页面并不一定是进程近期不会访问的。

    示例:
    ==23==
    ==24==

  2. LRU、FIFO、Clock的比较
    ==25==
    ==26==


3:全局置换算法

1.工作集置换算法

在局部算法里面并没有考虑各个进程之间的访存差异,全局置换算法为进程分配可变数目的物理页面。常驻集是指进程在运行时,当前时刻实际驻留在内存当中的页面集合。而工作集是进行再运行过程所固有的特征。置换算法的工作就是在进程的工作集的前提下,确定常驻集的大小以及相应页面。

  1. 工作集置换算法相关概念

    1. 要解决的问题:
      ==27==
    2. cpu利用率与并发进程数之间的关系
      ==28==
    3. 工作集
      当前时间t到过去一段时间它所访问的逻辑页面的集合。有了工作集,就能知道一个进程在某个时刻所需要的页面数,进而通过操作系统进行合理分配。
      ==29==
      ==30==
      如果全局置换算法能近似的按照上面这条曲线来,那么效率就提高了很多。
    4. 常驻集
      常驻集是指进程在运行时,当前时刻实际驻留在内存当中的页面集合。而工作集是进行再运行过程所固有的特征。置换算法的工作就是在工作集的前提下,确定常驻集的大小。
      ==31==

  2. 工作集置换算法
    换成不在工作集中的页面(不一定是在缺页的时候),在实现方法可以看出复杂的是在访存时,怎么换出不在工作集的页面。
    ==32==
    示例:

    1. 在时间0时,假定了t=-1和t=-2时的几个页面,意义在于可以判断在时刻1时,过去的时间里是有几个页面超出了工作集。
    2. 时刻1,访问第一个页面c,发生缺页,按工作集置换算法,直接把页面c补进来
    3. 时刻2,c进行访存时,因为窗口大小为4,所以t=-2时所对应的页面e不在工作集,就将e换出。
    4. 时刻3,正常访问。
    5. 时刻4,访问b页面时,类似时刻1的将b补进来,同时将t=0时刻对应的a页面移出,后面的类似处理

    ==33==


2.缺页率置换算法

  1. 缺页率以及影响因素
    ==34==
  2. 缺页率置换算法(相比工作集算法,降低了开销)
    ==35==
  3. 算法实现
    ==36==
  4. 示例
    1. 时刻1,出现缺页,之间补页面
    2. 时刻2,正常访问,时刻3也是正常访问
    3. 时刻4,访问b时出现缺页,把b补进来,此时缺页时间间隔是3,大于窗口大小2,将两个缺页之间没有访问的页面剔除出去,也就是剔除a、e。后面类似,在时刻6时,缺页间隔为2,不进行剔除。
      ==37==

3.抖动和负载控制

  1. 抖动问题
    系统中的进程数目很多
    ==38==
  2. 负载控制
    希望内存的大小恰好是当前所有进程的工作集的总和。同时,当缺页间隔时间大于缺页异常处理时间时,处理器就来得及处理缺页,如果是小于的话,就满负荷运行了,处理不过来了。所以找到一个负载均衡点,使得两者恰好相等。
    ==39==

猜你喜欢

转载自blog.csdn.net/lililuni/article/details/83685463
今日推荐