抖动和工作集

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 增加对换区容量为什么无效:抖动时磁盘交换区的利用率极高(忙不过来),但这不代表它容量不足。扩容解决的是”放不下”,而当前的问题是”来不及”。容量与速度是两回事。

判据总结:解决抖动只能从”让每个进程分到更多页框”入手。 凡是不改变页框分配的措施,一律无效。

从利用率数据判断瓶颈

疑问点:根据设备利用率数据选择改善措施

  1. 假定有一个请求分页存储管理系统,测得系统各相关设备的利用率为: CPU 的利用率为 10%,磁盘交换区的利用率为 99.7%,其他 I/O 设备的利用率为 5%。 下面( )措施将可能改善 CPU 的利用率。 I. 增大内存的容量 II. 增大磁盘交换区的容量 III. 减少多道程序的度数 IV. 增加多道程序的度数 V. 使用更快速的磁盘交换区 VI. 使用更快速的 CPU

直觉上这些优化似乎都有好处,如何判断?

答案:I、III、V。

这类题的通用做法是先看数据认瓶颈,而不是逐条评价措施的好坏。

三个数字已经把病情写在脸上了:

设备利用率说明
CPU10%极低——它在等,不是在忙
磁盘交换区99.7%已经饱和,这就是瓶颈
其他 I/O5%闲着,与本题无关

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 低 + 交换区高 = 抖动
  • 抖动与死锁的区别:抖动一直在动,死锁彻底不动

链接