Skip to content

调度算法对比模拟器使用指南

调度算法的规则不难记,难的是把规则落到一张甘特图上:一段等待少算了、一个抢占时机搞混了,后面的指标就全错。

这个模拟器让你用同一组进程同时跑多种算法,甘特图和指标并排展示,差异一目了然:

知识点你会在模拟器哪里看到
各算法甘特图画法甘特图面板
周转时间 / 等待时间计算指标表格
抢占 vs 非抢占的区别SJF vs RR 甘特图
各算法是否导致饥饿修改优先级后观察
时间片大小对性能的影响调整时间片后对比

跑完一轮对比大约 5 分钟。之后再手算,你会知道自己该画什么、算到哪里。

加载可视化中...

第一步:输入进程数据

默认数据

模拟器预置了一组经典进程:

PID到达时间执行时间优先级
P1083
P2141
P3224
P4312

这组数据的设计意图:P1 先到但执行最长(FCFS 偏爱它,SJF 讨厌它),P4 最晚到但最短(SJF 偏爱它)。不同算法对这组数据的处理差异非常典型。

修改数据

  • 点击每行的数字可以直接编辑
  • 点击底部「+ 添加进程」可以增加行
  • 点击每行右侧的删除按钮移除进程
  • 时间片:RR 算法专用参数,默认 2,范围 1-20

自行验算

自己手算完一组进程的甘特图之后,把同一组数据输入模拟器、选同一个算法跑一遍——甘特图和指标对不上的地方,就是你算错的地方。

第二步:选择算法并运行

勾选你要对比的算法(可以多选),然后点击蓝色「运行对比」按钮:

算法全称抢占需要预知执行时间
FCFS先来先服务非抢占不需要
SJF短作业优先非抢占需要
RR时间片轮转抢占不需要
优先级优先级调度可配置不需要
HRRN高响应比优先非抢占需要

建议第一次全选

把五种算法全勾上,一次跑完。甘特图上下排列,谁快谁慢、谁公平谁饿人,视觉上直接对比。

第三步:看懂输出

甘特图(核心)

每种算法一张甘特图。横轴是时间,彩色条是进程在 CPU 上运行的时间段。

你应该重点看的三件事:

1. 进程条的长度和位置

FCFS 里 P1 占据 0-8 的整个区间(一口气跑完),P2、P3、P4 全在等。而 RR 里每个进程只占一个时间片(默认 2 个时间单位),然后就被切走——彩色条交替出现。

2. 同一个进程在不同算法里的"命运"

P3 只需要 2 个时间单位:

  • FCFS 里它在 P1、P2 后面排队,到时间 12 才开始
  • SJF 里它很早就被选中(因为最短)
  • 这就是"护航效应"的直观体现——FCFS 里短进程被长进程挡住

3. 甘特图的总长度

所有算法的总完成时间其实一样,但这句话有个前提值得说清:前提是算法不让 CPU 白闲着(只要有就绪进程就一定在跑,这里五种算法都满足)。此时"CPU 什么时候空闲"只由到达时刻和总工作量决定,与"选谁"无关,所以总完成时间是不变量。变的是每个进程的完成时间,它直接决定周转时间——这才是各算法的差别所在。

甘特图的标准画法

手画甘特图的画法就是模拟器展示的样子:

  • 横轴标时间刻度
  • 每个时间段画对应进程的色块
  • 色块上方标进程名,下方标起止时间

指标表格

甘特图下方是每个进程的详细指标:

指标公式说明
周转时间完成时间 - 到达时间进程从到达到完成的总时间
等待时间周转时间 - 执行时间进程花在排队上的时间

表格最后一行是平均值(高亮显示)。

手算验证方法

  1. 从甘特图读出每个进程的完成时间
  2. 减去到达时间 = 周转时间
  3. 减去执行时间 = 等待时间
  4. 求平均
  5. 和模拟器的数字对照——不一致说明你哪步算错了

汇总对比表

最底部的汇总表把所有算法的平均周转时间和平均等待时间放在一起:

算法平均周转时间平均等待时间
FCFS最大最大
SJF最小最小
.........

这张表直接回答了"哪个算法平均性能最好"——默认数据下通常是 SJF。

关键实验:调参数看差异

实验 1:时间片大小的影响

  1. 只勾选 RR
  2. 时间片设为 1 → 跑一次
  3. 时间片设为 4 → 再跑一次
  4. 对比甘特图:时间片=1 时切换极频繁,时间片=4 时 P1 一口气跑 4 个单位

时间片太小 vs 太大

  • 太小(如 1):切换频繁,上下文切换开销大(模拟器不展示切换开销,此时 CPU 利用率 = q/(q+δ))
  • 太大(如 100):退化成 FCFS,失去轮转的公平性
  • 经验值:时间片应该让大多数进程在一个片内完成,常取 2 或 4
  • 这条公式的推导、"太大"的定量边界(q ≥ 最长服务时间)以及响应时间上界 n(q+δ),见 时间片轮转调度

实验 2:短进程被长进程挡住(护航效应)

  1. 勾选 FCFS 和 SJF
  2. 默认数据:P1(执行 8)先到,P4(执行 1)最后到
  3. 看 FCFS 里 P4 的等待时间 vs SJF 里 P4 的等待时间
  4. FCFS 里 P4 等了很久(被 P1 挡住),SJF 里很快就执行了

这就是为什么 FCFS 的平均等待时间通常最大。

实验 3:饥饿现象

  1. 添加多个短进程(执行时间 1-2),让它们不断到达
  2. 勾选 SJF
  3. 观察长进程 P1 的完成时间——如果短进程不停到达,P1 可能被反复推迟

SJF/SRTF 的饥饿

SJF 总是优先执行短进程。如果短进程源源不断,长进程永远得不到服务——这就是饥饿。HRRN 通过响应比公式(等待时间越长、响应比越高)解决了这个问题。在模拟器里勾选 SJF + HRRN 对比,看长进程的等待时间差异。

调度算法全景对比

算法抢占饥饿优点缺点适用场景
FCFS非抢占不会简单公平护航效应批处理
SJF非抢占平均等待最优(仅限同时到达无法预知服务时间短作业为主
SRTF抢占平均周转最优频繁抢占
RR抢占不会响应快、公平切换开销分时/交互
优先级两者皆可会(静态)灵活优先级反转通用
HRRN非抢占不会兼顾长短作业计算开销批处理

关键结论速查

  • 平均等待时间最短:SJF——但这条有前提,必须所有进程同时到达;到达时刻不同时它不再最优(默认数据就是反例,SRTF 能比它更短)。抢占式的 SRTF 才是无前提最优的,理由见 SJF 短作业优先调度
  • 不会饥饿的算法:FCFS、RR、HRRN
  • 可能饥饿的算法:SJF、SRTF、优先级调度(静态)
  • 适合交互系统:RR、MLFQ
  • 需要预知服务时间:SJF、SRTF、HRRN
  • 不需要预知服务时间:FCFS、RR、优先级调度
  • 抢占式在新进程到达时就检查要不要换人,非抢占式只在当前进程完成(或阻塞)时才调度
  • 周转时间 = 完成时间 − 到达时间等待时间 = 周转时间 − 执行时间
  • HRRN 响应比 =(等待时间 + 执行时间)/ 执行时间,等得越久越靠前

推荐使用流程

第一轮:建立直觉(3 分钟)

  1. 用默认数据,全选 5 种算法,点「运行对比」
  2. 从上到下看 5 张甘特图——FCFS 最"整齐"但 P1 霸占 CPU,RR 最"碎"但公平
  3. 看汇总表的平均周转时间,记住谁最大谁最小

第二轮:玩参数(5 分钟)

  1. 改时间片 1 → 2 → 4,看 RR 甘特图怎么变
  2. 把 P1 执行时间改成 20,再跑 FCFS + SJF——护航效应更明显
  3. 加几个短进程,看 SJF 下长进程的等待时间

第三轮:验算手算结果(按需)

  1. 把自己算过的那组进程数据输入模拟器
  2. 选对应算法跑出结果
  3. 和手算对照——甘特图不一样就是画错了,指标不一样就是算错了
  4. 定位具体错在哪一步(通常是抢占时机或到达顺序搞混了)

前面的调度讨论都假设单个 CPU。当系统有多个处理器时,调度会出现新的问题。下一篇看多处理机调度。