操作系统L10
Page Replacement Algorithms 页面置换算法
- 页面错误(page fault)强制选择
- 哪一页必须被移除 remove
- 为到来的页制造空间 make room
- 即在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间
- 换出的页面
- 如果被修改过,必须将其写回磁盘以更新该页面在磁盘上的副本 saved
- 如果没有被修改过,直接覆盖即可 overwritten
- 最好不要选择经常使用的页面
- 很可能在很短时间内又被调入内存中
- 总览

Optimal Page Replacement Algorithm 最优页面置换算法
- 替换将在最远点引用的页面
- 最优但是不可能实现
Not Recently Used Page Replacement Algorithm 最近未使用页面置换算法
- 简称NRU
- 系统为每一页面设置了两个状态位
- 当页面被访问(读或写)时设置R位
- 当页面被写入(即修改)时设置M位
- 这些位包含早每个页表项中
- 当一个进程启动时,所有页面的R和M都设置为0
- 周期性的,R位会清零
- 页面被分为4类

- NRU算法随机地从类编号最小地非空类中挑选一个页面淘汰

FIFO Page Replacement Algorithm 先进先出页面置换算法
- 开销较小
- 由操作系统维护一个所有当前在内存中地页面的链表,最新进入的页面放在表尾,最早进入的页面放在表头
- 发生缺页中断时,淘汰表头的页面并把新调入的页面加到表尾
- 优点:易于实现
- 缺点:经常使用的页面可能会被清除
Second Chance Page Replacement Algorithm 第二次机会页面置换算法
- 在FIFO基础进行修改,检查最老页面的R位
- R位是0,页面既老又没有被实现,可以立刻置换掉
- R位是1,就将R位清0,并把该页面放到链表的尾端,修改它的装入时间使它像刚装入的一样

- 本质上是在寻找一个在最近的时钟间隔内没有被访问过的页面
The Clock Page Replacement Algorithm 时钟页面置换算法
- 把所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面

Least Recently Used (LRU) 最近最少使用页面置换算法
- 假设最近使用过的页面很快就会再次使用
- 丢弃最长时间未使用的页面
- 软件解决方案
- 必须保持一个页面的链表:最近使用在前面,在后面最少;每次内存引用更新这个列表
- 太贵了
可以使用硬件解决方案 - 为硬件配备 64 位计数器 - 在每条指令执行完后自动加1 - 计数器值存储在刚刚引用的页的页表条目中 - 每个页表项必须有一个足够容纳这个计数器值的域 - 发生缺页中断后,选择计数器值最低的页面 - 选择计数器值最低的页面 - 问题:页表非常大,变得更大 - 为具有n 个页框的机器维护一个n x n 位的矩阵 - 引用页框 K 时: - (i) 将第 K 行设置为全 1。 - (ii) 将 K 列设置为全 0。 - 实质上就是在被引用时, - 将自己那一行变为1,让自己变大 - 让自己所在所有行即对应的列置为0,让其他变小 - 二进制值最小的行是 LRU 页

用软件模拟LRU
- 只有非常少的计算机拥有这种硬件,需要一种能用软件实现的解决方案
- 一种可能的方案称为NFU(Not Frequently Used, 最不常用)算法
NFU
- 该算法将每个页面与一个软件计数器相关联,计数器的初值为0
- 每次时钟中断时,扫描所有页面时,将每个页面的R位(0/1)加到它的计数器上
- 计数器大体跟踪各个页面被访问的频繁程度
- 发生缺页中断时,则置换计数器值最小的页面
- 问题:从不忘记任何事情,所以很久以前的页面引用频率可能有最高的计数器
- 解决:修改为NFU with Aging
NFU with Aging 老化算法
- 在每次时钟中断时
- 计数器右移一位
- R 位添加到最左边的位
- 这样,我们可以对最近的 R 值给予更高的优先级

Working-Set Model 工作集页面置换算法
页面仅按需加载。 这种策略称为请求调页(demand paging)
在执行阶段,进程引用其页面的一小部分。 这称为参考位置(locality of reference)
进程当前使用的页面集称为其工作集(working set)
每隔几条指令就导致页面错误的程序被称为颠簸(thrashing)
分页系统在让进程运行之前将每个进程的工作集保存在内存中。 这种方法称为工作集模型(working set model)
- 工作集是随着时间变化的
在让进程运行之前加载页面称为预先调页(prepaging)

工作集算法

- 这个想法是检查最近的页面引用,这个想法是检查最近的页面引用。
- 进程的工作集是它在虚拟时间(进程实际使用的 CPU 时间量)的过去 \(\tau\) 秒内引用的页面集。
工作集时钟页面置换算法

Modeling Page Replacement Algorithms 建模页面替换算法
- Belady’s anomaly:页框越多,页面错误不总是越少。

- 建模LRU算法:
- 当一个页面被引用时,它总是被移动到内存中页面的顶部条目。
- 如果引用的页面已经在内存中,则其上方的所有页面都向下移动一个位置。 引用页面下方的页面不会移动


Stack Replacement Algorithms
- 如果 k 帧内存中的页面集始终是 (k+1) 帧内存中页面的子集,则页面替换算法称为堆栈替换算法
- M是内存数组的集合,处理完引用字符串中的每一项后,m是页框数,则M(m)⊆ M(m 1)
问题

虚拟地址空间大小:\(8 * 1024 = 2^{13}\)
内存空间:\(32\cdot1024=2^5\cdot2^{10}=2^{15}\)
页面和页框的大小是一样的



Demand paging 是按需要的加载,二分查找需要整个空间


最后顺序为:2 4 8 5
Check Points
- What is the drawback of FIFO?
- What is working set?
- What is thrashing?
- What is Belady’s anomaly ?
- What is demand paging?

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yeの博客!