抖动和工作集
3.2.3 留下的问题是”驻留集该多大”。这一节给出答案:太小会抖动,而工作集就是”够用”的度量。
机制
抖动
抖动(颠簸,thrashing):进程频繁发生缺页,绝大部分时间都花在页面调入调出上,真正用于执行的时间极少,导致 CPU 利用率不升反降。
产生的直接原因是:进程分到的页框数太少,装不下它当前正在活跃使用的那些页。
抖动的可怕之处在于它是正反馈,会自我加剧:
flowchart LR A["多道程序度↑"]:::n --> B["每个进程<br/>分到的页框↓"]:::warn B --> C["缺页率↑"]:::warn C --> D["进程大量阻塞<br/>等待调页"]:::bad D --> E["<b>CPU 空闲↑</b>"]:::bad E -->|"系统误判:<br/>CPU 闲着,<br/>应该多调进程!"| A classDef n fill:#dbeafe,stroke:#2563eb,color:#1e3a5f classDef warn fill:#fef3c7,stroke:#d97706,color:#78350f classDef bad fill:#fee2e2,stroke:#dc2626,color:#7f1d1d
这个循环的致命之处在于系统的误判:操作系统看到 CPU 利用率低,按常理应当增加多道程序度来喂饱 CPU。但在抖动状态下,这恰恰是最糟的操作——新进程进来会进一步瓜分页框,缺页更频繁,CPU 更空闲,于是又调入更多进程……系统一路加速冲向崩溃。
理解了这个正反馈,抖动题的所有选项都能自己判断:凡是”增加多道程序度”的措施一律错,凡是”让每个进程分到更多页框”的措施才对。
工作集
工作集:在某段时间间隔
它是局部性原理的量化:局部性说”程序在一小段时间内只访问很窄的地址范围”,工作集就是把那个”很窄的范围”具体地列出来。
工作集的实际用途只有一条:
只要让每个进程的驻留集大小 ≥ 它的工作集大小,就能避免抖动。
这就把”驻留集该分多大”这个模糊问题,变成了一个可测量的问题——统计一段时间内进程访问了哪些页即可。
基于此的工作集模型:系统周期性地统计各进程的工作集,据此调整其驻留集;若所有进程的工作集之和超过了可用页框总数,就挂起一部分进程(降低多道程序度),把页框让给其余进程。
抖动的解决措施
按”是否增加每个进程的页框数”这一条判据,有效措施只有两类:
① 减少进程数——挂起或撤销部分进程,把它们的页框让出来。这是最直接有效的手段。
② 增加物理内存——总页框变多,每个进程分到的自然变多。
而下面这些看似合理的措施全都无效:
- 增加对换区容量 ❌ —— 抖动是内存不够,不是外存不够
- 增加多道程序度 ❌ —— 火上浇油,直接加剧正反馈
- 提高某进程优先级 ❌ —— 见下方边界段
- 换更快的 CPU ❌ —— CPU 本来就闲着,不是瓶颈
边界
为什么”提高优先级”不能解决抖动
疑问点:抖动的有效措施中为何不含"提高进程优先级"
43.【2011 统考真题】当系统发生抖动时,可以采取的有效措施是( )。 I. 撤销部分进程 II. 增加磁盘交换区的容量 III. 提高用户进程的优先级 A. 仅 I B. 仅 II C. 仅 III D. I、II
答案 A:仅 I。
III 提高优先级为什么无效——因为它改变的是调度顺序,而不是内存分配。
抖动的病根是”每个进程分到的页框太少”,这是内存管理层面的问题。而优先级属于处理机调度层面,它只决定”谁先上 CPU”,完全不改变内存中页框的总量和分配格局。
被提高优先级的进程更频繁地被调度上 CPU,但它一跑起来照样缺页、照样阻塞——它缺的是页框,不是 CPU 时间。
更糟的是它可能加剧抖动:该进程运行机会变多,缺页请求也随之变多,磁盘 I/O 队列更拥挤,其他进程的调页请求被拖得更慢。
II 增加对换区容量为什么无效:抖动时磁盘交换区的利用率极高(忙不过来),但这不代表它容量不足。扩容解决的是”放不下”,而当前的问题是”来不及”。容量与速度是两回事。
判据总结:解决抖动只能从”让每个进程分到更多页框”入手。 凡是不改变页框分配的措施,一律无效。
从利用率数据判断瓶颈
疑问点:根据设备利用率数据选择改善措施
- 假定有一个请求分页存储管理系统,测得系统各相关设备的利用率为: CPU 的利用率为 10%,磁盘交换区的利用率为 99.7%,其他 I/O 设备的利用率为 5%。 下面( )措施将可能改善 CPU 的利用率。 I. 增大内存的容量 II. 增大磁盘交换区的容量 III. 减少多道程序的度数 IV. 增加多道程序的度数 V. 使用更快速的磁盘交换区 VI. 使用更快速的 CPU
直觉上这些优化似乎都有好处,如何判断?
答案:I、III、V。
这类题的通用做法是先看数据认瓶颈,而不是逐条评价措施的好坏。
三个数字已经把病情写在脸上了:
| 设备 | 利用率 | 说明 |
|---|---|---|
| CPU | 10% | 极低——它在等,不是在忙 |
| 磁盘交换区 | 99.7% | 已经饱和,这就是瓶颈 |
| 其他 I/O | 5% | 闲着,与本题无关 |
CPU 闲、交换区满 —— 这是抖动的典型体征。 大量进程阻塞在等待调页上,CPU 无事可做。
认清瓶颈之后逐项判断就很机械了:
| 措施 | 判断 | 理由 | |
|---|---|---|---|
| I | 增大内存容量 | ✅ | 每个进程分到更多页框 → 缺页减少 |
| II | 增大交换区容量 | ❌ | 瓶颈是速度不是容量;交换区忙不过来,不是放不下 |
| III | 减少多道程序度 | ✅ | 进程变少 → 每个分到更多页框(教科书解法) |
| IV | 增加多道程序度 | ❌ | 火上浇油,正是抖动正反馈的推手 |
| V | 更快的交换区 | ✅ | 直接加宽瓶颈——每次缺页处理更快,CPU 等待时间缩短 |
| VI | 更快的 CPU | ❌ | CPU 才用了 10%,它根本不是瓶颈;让闲着的东西更快毫无意义 |
“这些优化看起来都是好事”这个直觉,恰恰是这类题的陷阱所在。 优化措施本身没有绝对的好坏,只有针不针对瓶颈之分。VI 换更快的 CPU 在别的场景下当然是好事,但在这里纯属浪费——一个只用了 10% 的部件,再快也提升不了整体。
记住这条通用判据:先找利用率接近 100% 的那个部件,它就是瓶颈;只有作用于瓶颈的措施才有效。
抖动 vs 缺页率高
两者不是一回事。
- 缺页率高只是一个现象。程序刚启动时缺页率必然很高(所有页都不在内存),但这属于正常的冷启动,很快会降下来。
- 抖动是缺页高到形成正反馈、系统无法自行恢复的状态,特征是 CPU 利用率随多道程序度的提高反而下降。
判据:看 CPU 利用率的走向。 缺页高但 CPU 利用率正常 → 不是抖动;缺页高且 CPU 利用率随进程增多而下降 → 抖动。
工作集 vs 驻留集
| 工作集 | 驻留集 | |
|---|---|---|
| 含义 | 一段时间内实际访问过的页面集合 | 实际分配到的页框集合 |
| 性质 | 需求(应该给多少) | 供给(实际给了多少) |
| 谁决定 | 程序自身的行为 | 操作系统的分配策略 |
关系是:驻留集 ≥ 工作集 → 不抖动;驻留集 < 工作集 → 抖动。
一句话:工作集是”够用的标准”,驻留集是”实际给的量”。
抖动 vs 死锁 vs 饥饿
三者都表现为”系统卡住了”,但机制完全不同:
| 抖动 | 死锁 | 饥饿 | |
|---|---|---|---|
| 成因 | 内存不足,页框分配过少 | 循环等待资源 | 调度策略不公平 |
| 进程状态 | 反复在运行与阻塞间切换 | 永久阻塞 | 长期就绪但轮不到 |
| 系统整体 | CPU 利用率极低但仍在动 | 相关进程完全不动 | 其他进程正常 |
| 能否自行恢复 | 不能(正反馈) | 绝不能 | 理论上可能 |
最容易混的是抖动与死锁:抖动状态下进程一直在动(不停地调页),只是几乎没有有效进展;死锁则是彻底不动。
对照速查
| 抖动 | 内容 |
|---|---|
| 定义 | 频繁缺页,绝大部分时间用于调页,CPU 利用率反降 |
| 直接原因 | 进程分到的页框太少 |
| 关键机制 | 正反馈——CPU 闲 → 误判为该加进程 → 页框更少 → 更闲 |
| 有效措施 | ① 挂起/撤销部分进程 ② 增加物理内存 |
| 无效措施 | 增大对换区容量、增加多道程序度、提高优先级、换更快 CPU |
| 工作集 | 内容 |
|---|---|
| 定义 | 时间窗口 |
| 用途 | 驻留集 ≥ 工作集 ⟹ 不抖动 |
| 窗口太小 | 涵盖不全,仍会抖动 |
| 窗口太大 | 把不再用的页也算进来,浪费 |
| 瓶颈判断法 | 步骤 |
|---|---|
| ① | 找利用率接近 100% 的部件 → 它是瓶颈 |
| ② | 只有作用于瓶颈的措施才有效 |
| ③ | 利用率很低的部件,再优化也没用 |
考点
- 抖动的正反馈机制,以及系统为何会误判
- 有效措施只有”挂起进程”和”增加内存”(2011 真题)
- 提高优先级无效——改的是调度,不是内存分配
- 增大对换区容量无效——瓶颈是速度不是容量
- 工作集是需求,驻留集是供给;驻留集 ≥ 工作集则不抖动
- 看利用率找瓶颈:CPU 低 + 交换区高 = 抖动
- 抖动与死锁的区别:抖动一直在动,死锁彻底不动
链接
- 🏠 返回总览:操作系统第 3 章:内存管理总览
- ⬅️ 上一节:3.2.4 页面置换算法
- ➡️ 下一节:3.2.6 页框回收
- 🔗 驻留集与分配策略见 3.2.3 页框分配
- 📖 名词库:第 3 章名词库