Appearance
虚拟存储性能与改进
考情分析
抖动(颠簸)是高频选择题考点,EAT 计算在计算题中出现过。🔥🔥 中高频。
页面置换算法的选择直接影响缺页率,而缺页率哪怕只有 0.1% 也能让有效访存时间暴增 40 倍。当系统整体缺页率失控时,会发生什么?
抖动(Thrashing)
抖动(也叫颠簸):进程频繁地换入换出页面,大部分时间都花在页面调度上,几乎无法推进实际计算。就像一个人桌子太小,放上这本书就得撤掉那本,结果全部时间都花在搬书上,根本没空看书。
抖动的产生
这是一个恶性循环:CPU 利用率越低 → OS 引入更多进程 → 每个进程的页框更少 → 缺页更严重 → CPU 利用率更低。
CPU 利用率与多道程度的关系
CPU利用率
↑
| ╱‾‾╲
| ╱ ╲
| ╱ ╲
| ╱ ╲ ← 抖动开始
|╱ ╲____
+------------------------→ 多道程度存在一个最优多道程度,超过这个点后 CPU 利用率急剧下降。
产生抖动的根本原因
所有进程的工作集之和 > 可用物理内存。
预防和解决抖动
方法一:工作集策略
监控每个进程的工作集大小,确保分配的页框数 ≥ 工作集大小。
- 若
> 可用内存 → 挂起某些进程(降低多道程度) - 被挂起进程的页框释放给其他进程
方法二:缺页频率(PFF)策略
直接监控进程的缺页率来调整页框分配:
| 缺页率情况 | 操作 |
|---|---|
| 缺页率 > 上限 | 给进程增加页框 |
| 缺页率 < 下限 | 回收部分页框 |
| 无法增加且缺页率仍高 | 挂起该进程 |
缺页率
↑
| ╲
| ╲‾‾‾‾‾‾ 上限
| ╲
| ╲__ 下限
| ╲___
+----------------→ 页框数方法三:控制多道程度
通过 L=S 准则来判断系统是否处于合理状态:
- L:缺页的平均间隔时间
- S:处理一次缺页的平均时间
- L ≈ S 时,磁盘和 CPU 都能充分利用
- L >> S:磁盘空闲,可增加多道程度
- L << S:磁盘忙不过来,应降低多道程度
影响缺页率的因素
| 因素 | 影响 |
|---|---|
| 页面大小 | 页面越大 → 缺页率越低(但内部碎片增大) |
| 分配的页框数 | 页框越多 → 缺页率越低 |
| 页面置换算法 | OPT > LRU > CLOCK > FIFO |
| 程序的局部性 | 局部性越好 → 缺页率越低 |
程序局部性的影响
同样的数组访问,按行优先和按列优先的缺页率可能差异巨大:
c
// 按行优先 —— 局部性好,缺页少
for (int i = 0; i < 1024; i++)
for (int j = 0; j < 1024; j++)
a[i][j] = 0;
// 按列优先 —— 局部性差,缺页多
for (int j = 0; j < 1024; j++)
for (int i = 0; i < 1024; i++)
a[i][j] = 0;C 语言数组按行存储,按行遍历时连续页面会被反复利用(空间局部性好)。按列遍历则每次访问跳到不同页面,缺页率大幅上升。
有效访存时间回顾
其中
- 缺页中断处理时间
- 将页面从磁盘读入内存的时间(主要开销)
- 重新启动指令的时间
典型值:
考研高频考点
- 🔥🔥🔥 抖动(颠簸)的定义与产生原因
- 🔥🔥🔥 抖动的根本原因:工作集之和 > 可用物理内存
- 🔥🔥 工作集策略预防抖动
- 🔥🔥 缺页频率(PFF)策略
- 🔥🔥 程序局部性对缺页率的影响(行优先 vs 列优先)
- 🔥 影响缺页率的四个因素
- 🔥 L=S 准则
到这里,内存管理章节就全部结束了。下一章进入文件系统——数据在磁盘上如何组织、如何存取。