操作系统笔记:(四) 页面置换算法

本篇文章简要总结虚拟存储中的页面置换算法,结构组织如下:

  • 相关概念
  • 局部置换算法
  • 全局置换算法

相关概念

设计目标

  • 减少页面 swap in/out 次数
  • 把未来不在访问或者短期内不在访问的页调出

页面锁定

有些页是不用调出的

  • 描述必须常驻内存中的逻辑页
  • OS 的关键部分
  • 要求响应速度的 code/data
  • 页表项中的锁定页(lock bit)

评价方法

  • 记录访存的页面轨迹(编号)
  • 模拟/记录缺页次数

分类

  • 局部置换算法: 仅限当前进程的页
  • 全局置换算法: OS管理的所有页

局部置换算法

OPT(最优置换算法)

idea: 未来最长时间不访问的页(理想情况)
操作系统笔记:(四) 页面置换算法_第1张图片

implement: 缺页时找到未来最长时间不访问的页,换出

特点

  • 无法实现
  • 最理想的策略
  • 作为其他算法的评测依据

FIFO 先进先出

操作系统笔记:(四) 页面置换算法_第2张图片

字面意思

特点:

  • 实现简单
  • 性能较差
  • 容易产生belady 现象

LRU(Least Recently Used algorithm)

idea: 缺页时用最近最少使用的页替换掉它

操作系统笔记:(四) 页面置换算法_第3张图片

implement

  1. 为每个页表增加一个时钟域记录每次访问时间,缺页时换掉时间最小的
  2. 实现 进来一个新的页,就重新压栈,缺页时仅却出栈顶元素就好,不过当页已在栈中时,仍然耗时很大,具体地,若访问的页在栈顶需要将其摞到栈首.

操作系统笔记:(四) 页面置换算法_第4张图片

特点:

  • 实现难
  • 时间开销大

clock 算法(时钟置换算法)

这是一种近似的LRU 算法,是对 FIFO 和LRU的折中

implement:

Data Structure:

  • 在页表项中增加引用位,标记当前这一页是否被引用
  • 将页面组织成环形链表
  • pointer指向最先调入的页面

Algorithm:

  • 访问页,在页表项记录下页面访问情况
  • 缺页,从指针指向的页面开始,若遇见引用位为0的页面,就将其换出,并置访问位为1;若引用位为1,将其置1,可以发现这样最终总会找到一个适当的页
    操作系统笔记:(四) 页面置换算法_第5张图片

增强的clock 算法

将引用位和修改位作为一个序对来考虑,那么会有四种类型

  • 00 最近未使用也没有修改,用于置换的最佳页
  • 01 最近未使用但是修改过,不是很好,需要将其写回磁盘
  • 10 最近使用过,但是未修改,很快可能又被使用
  • 11 最近使用过且修改过,不好

这种方法给修改过的页更高的级别,可能需要多找几圈,但是降低了I/O操作
操作系统笔记:(四) 页面置换算法_第6张图片

belady 现象

分配的物理页面增加,缺页率反而上升

FIFO : 存在belady现象,这个例子很好找到
LRU:不存在,(多增加页面后,每次换出的页面相同???,PS:个人想法)
clock: 存在,(e.g.: 带填坑)

全局置换算法

就是操作系统考虑当前所有进程页面的分配,将不常用的页交换出去,给其他进程多一点空间,由于进程在生命周期内的内存需求是变化的。

主要有两种,一种是工作集,一种是缺页率

工作集

  • 工作集: w(t,Δ) ,当前时间 t ,往前移 Δ 时间所访问过的页面集合
  • 常驻集: I 当前时刻 t 为止进程实际驻留在内存中的集合

缺页率与工作集的关系

  • |I||w| 缺页较少, 反之缺页较多

工作集的想法是每次缺页时换出不在 W 中的页面,但实现较难

缺页率

idea 这个算法的思想是说,当算法缺页率大于其上限的时候将多分配页面,低与下限的时候少分配页面

implement:

设定一个 T 作为容忍的忍受缺页时间

记录 tlast (上次缺页时间), tcur (当前缺页时间),每次缺页时:

  • tcurtlast>T 将不在 T 时间类的页面换出,反之放入.

你可能感兴趣的:(system&software,engineer)