【操作系统笔记3】虚拟内存---页面置换算法

功能: 当系统发生缺页中断时,需要调入新的页面。当页面内存满了时,需要选择内存当中哪个物理页面被置换。

目标:尽可能减少页面的换进换出次数(即缺页中断的次数)

页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键的应用程序,实现方法就是添加lock-bit。

  1. 最优页面置换算法 (根据页面下一次访问等待时长来淘汰)
    当一个缺页中断发生时,对于保存在内存中的每一个逻辑页面,计算它的下一次访问之前,还需要等待多长时间,从中选择一个等待时间最长的页面,作为被置换页面

  2. 先进先出算法 (First In First Out, FIFO)(根绝页面内存驻留时间来淘汰)
    选择在内存中驻留时间最长的页面并淘汰。
    具体就是系统维护了一个链表,用来记录所有位于内存当中的逻辑页面。
    从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面主流时间最短。
    当发生缺页中断时,把链表首页淘汰出局,并把新的页面添加到链表末尾。

    效果:性能较差,调出的页面极有可能是经常要访问的页面,并且有Belady现象。FIFO 很少单独使用。
    Belady 现象(科学家名字): 在采用FIFIO算法时,有时会出现分配的物理页面增加,缺页率反而提高的异常现象。

  3. 最近最久未使用算法(Least Recently Used, LRU)(根据过去最久未被访问的页面来淘汰)
    当产生缺页中断时,选择最久未使用的哪个页面淘汰,根据过去来推测未来。
    根据局部性原理来反推。
    反过来说:如果在过去某些页面长时间未被访问,那么在将来,他们还可能会长时间地得不到访问。

    LRU算法需要记录各个页面使用时间的先后顺序,缺点:结果不错,但开销比较大,每次都需要查找链表或者栈页面。
    两种可能实现方法为:
    ①系统维护一个页面链表,将刚刚使用的页面放在链表首结点,最久未被使用的页面放在链表末尾,每次淘汰链表末尾页面。
    ②设置一个活动页面栈,当访问某页时,将次页号压入栈顶,然后考察栈内是否有与此页面相同的页号,若有则抽出。当需要淘汰页面时,总是选择栈底的页面淘汰,它时最久未被使用的页面。

  4. 页面时钟置换算法(clock 算法)(根据页面在内存驻留时间 + 最近访问bit 同步决定淘汰页)
    在FIFO 的基础上,增加访问位,
    当发生缺页中断时,考察指针指向最老的页面,若它的访问位为0,则直接淘汰;
    若访问位为1,则把该位置置为0,同步指针往后移动一格。如此下去找到淘汰的页面,然后把指针移动到它的下一个。

  5. 二次机会法(根据页面在内存驻留时间 + 最近访问bit + 脏页判断dirty bit写时置位 同步决定淘汰页)
    当CPU淘汰只读的页时,直接将淘汰也丢弃就可以了;
    而当某页被CPU写入了时,此时最近访问的bit 和 脏页bit 都会被置1, 当CPU 淘汰此页时需要将该页数据重新写入硬盘,需要花巨大的代价。
    二次机会法: 修改clock 算法,使它允许脏页总是在一次时钟扫描中保留下来。

used bit dirty bit CPU操作
0 0 CPU直接释放该页
0 1 CPU指针将 dirty bit 清零,继续往下判断
1 0 CPU指针将 used bit 清零,继续往下判断
1 1 CPU指针将 used bit 清零,dirty bit 保持为1,继续往下走

  1. 最不常用算法(Least Frequetly Used ,LFU) (根据访问次数进行淘汰)
    当产生缺页中断时,选择访问次数最少的页面,并且淘汰。

  2. 工作集模型(根据时间来决定淘汰页面,淘汰超出时间的页面,即便不缺页也会淘汰页面,每次运行都会判断)
    工作集: 一个进程当前正在使用的逻辑页面的集合。
    用二元函数 W(t, Δ) 表示工作集

常驻集: 指当前时刻,进程实际驻留在内存当中的页面集合。


  1. 缺页率页面置换算法(运行过程中动态调整常驻集大小,缺页率高时分配较多的物理页面,发生缺页中断时才判断)
    可变分配策略:常驻集大小可变,每个进程感慨是运行时,先根绝程序大小分配一定数目的物理页面,然后再进程运行过程中,再动态的调整常驻集的大小。

    缺页率 = 缺页次数 / 内存访问次数 或者 缺页的平均时间间隔的倒数
    影响缺页率的因素: 页面置换算法、分配给进程的物理页面数、页面本身的大小、程序编写方法(是否符合局部性原理)

    如下图,设置页面大小为2,也就是
    上一次中断 和 当前中断页面大小如果大于2,此时系统认为程序不需要这么多页面,此时就会修改常驻页面大小,清除两次中断期间没有用到的页面。
    如果上一次中断 和当前中断 页面小于等于2, 系统认为物理也不够用,此时就会新增常驻页面大小,新增缺失的页面。
    【操作系统笔记3】虚拟内存---页面置换算法_第1张图片

  2. 抖动问题
    分配给一个进程的物理页面太少,不能包含整个工作集,进程就会造成很多的缺页中断,需要频繁的再内存与外存之间替换页面,从而使进程的运行速度变得很慢,这个状态成为 抖动。

产生抖动的原因:随着驻留内存的进程数据增加,分配给每一个进程的物理页面不断减少,缺页率不断上升。所以OS要选择一个适当的进程数目和进程需要的帧数,以便再并发水平和缺页率之间达到一个平衡。

调整MPL尽量保证: 平均缺页时间 mean time between page faults(MTBF) = 页缺失服务时间 page fault service time( PFST )

你可能感兴趣的:(01--计算机操作系统)