作业调度算法终极对比:FCFS vs RR vs HRRN,谁才是平衡效率与公平的最佳选择?

1. 作业调度算法介绍

在操作系统中,作业调度(Job Scheduling) 是指在作业进入系统后,根据一定的策略决定哪些作业进入内存,并分配 CPU 资源进行执行。常见的作业调度算法主要有以下几种:

(1)先来先服务(FCFS, First-Come, First-Served)

  • 原理:按照作业到达的先后顺序进行调度,先到先执行。

  • 特点

    • 优点:公平、实现简单
    • 缺点不利于短作业,因为长作业可能会占用 CPU 很长时间,导致短作业不得不等待(“短作业饥饿”)。
  • 适用场景

    • 适用于对响应时间要求不高的批处理系统。
  • 示例
    假设有 3 个作业,到达时间执行时间如下:

    作业 到达时间 执行时间
    A 0 3
    B 2 6
    C 4 4

    按照 FCFS 调度顺序

    1. A 先执行 3 秒(0 ~ 3)
    2. B 在 3 秒后才可以执行,运行 6 秒(3 ~ 9)
    3. C 在 9 秒后才可以执行,运行 4 秒(9 ~ 13)

    平均等待时间

    • A:0 秒
    • B:3 - 2 = 1 秒
    • C:9 - 4 = 5 秒

    平均等待时间 = (0+1+5) / 3 = 2 秒


(2)轮转调度(Round Robin, RR)

  • 原理:为每个作业分配一个时间片(如 2ms),然后按照时间片轮流执行,超时后切换到下一个作业。

  • 特点

    • 优点公平对待所有作业,不会因为长作业而饿死短作业。
    • 缺点:若时间片过小,切换开销(上下文切换)增大,影响性能。
  • 适用场景

    • 适用于交互式系统,如时间共享操作系统(Linux/Windows)。
  • 示例
    假设有 3 个作业,执行时间如下:

    作业 到达时间 执行时间
    A 0 5
    B 1 6
    C 2 4

    设定时间片为 2,调度顺序如下:

    时间片1:A(0~2)
    时间片2:B(2~4)
    时间片3:C(4~6)
    时间片4:A(6~7) (A 执行完)
    时间片5:B(7~9)
    时间片6:C(9~10) (C 执行完)
    时间片7:B(10~11) (B 执行完)
    

平均等待时间的计算步骤如下:

步骤1:确定每个作业的完成时间
作业A:0~2(首次执行),6~7(完成)。总执行时间3秒,完成时间7秒。
作业B:2~4(首次执行),7~9(第二次执行),10~11(完成)。总执行时间6秒,完成时间11秒。
作业C:4~6(首次执行),9~10(完成)。总执行时间4秒,完成时间10秒。

步骤2:计算周转时间
周转时间 = 完成时间 - 到达时间
• A: 7 - 0 = 7秒
• B: 11 - 2 = 9秒
• C: 10 - 4 = 6秒

步骤3:计算等待时间
等待时间 = 周转时间 - 执行时间
• A: 7 - 3 = 4秒
• B: 9 - 6 = 3秒
• C: 6 - 4 = 2秒

步骤4:计算平均等待时间
• 平均等待时间 = (4 + 3 + 2) / 3 = 3秒

详细分析:FCFS 与 RR 调度算法的等待时间差异


1. FCFS(先来先服务)调度算法

调度规则:按作业到达顺序执行,非抢占式,一旦开始执行直到完成。
示例计算

作业 到达时间 执行时间 开始时间 完成时间 等待时间
A 0 3 0 3 0
B 2 6 3 9 1
C 4 4 9 13 5

等待时间 = 开始时间 - 到达时间
平均等待时间 = (0 + 1 + 5) / 3 = 2 秒(正确)


2. RR(轮转调度)调度算法

调度规则:每个作业每次运行一个时间片(如 2 秒),被抢占后重新排队,抢占式
示例计算(时间片为 2):

时间片 执行作业 时间段 剩余执行时间
1 A 0~2 A: 3→1
2 B 2~4 B: 6→4
3 C 4~6 C: 4→2
4 A 6~7 A: 1→0(完成)
5 B 7~9 B: 4→2
6 C 9~10 C: 2→0(完成)
7 B 10~11 B: 2→0(完成)

各作业的等待时间
A

  • 到达时间 0,首次立即执行(0~2),无需等待。
  • 剩余 1 秒需在时间片 4(6~7)执行,等待时间 = 6 - 0 - 2 = 4 秒(总等待时间)。

B

  • 到达时间 2,首次执行在时间片 2(2~4),等待时间 = 2 - 2 = 0 秒
  • 剩余 4 秒需在时间片 5(7~9)执行,等待时间 += 7 - 4 = 3 秒
  • 剩余 2 秒需在时间片 7(10~11)执行,等待时间 += 10 - 9 = 1 秒
  • 总等待时间 = 0 + 3 + 1 = 4 秒

C

  • 到达时间 4,首次执行在时间片 3(4~6),等待时间 = 4 - 4 = 0 秒
  • 剩余 2 秒需在时间片 6(9~10)执行,等待时间 += 9 - 6 = 3 秒
  • 总等待时间 = 0 + 3 = 3 秒

平均等待时间 = (4 + 4 + 3) / 3 ≈ 3.67 秒


3. 为什么 RR 的等待时间高于 FCFS?

抢占导致多次等待:在 RR 中,作业被多次中断并重新排队,每次中断后需等待其他作业运行,导致总等待时间增加。
• 例如,B 在 FCFS 中只需等待 1 秒,但在 RR 中需等待 4 秒。
短作业优势减弱:RR 对长作业更公平,但短作业(如 C)也可能因多次中断而等待更久。
时间片大小影响:时间片越小,抢占越频繁,等待时间可能进一步增加。


4. 关键区别总结
调度算法 抢占性 等待时间计算方式 适用场景
FCFS 非抢占 开始时间 - 到达时间 长作业优先,简单场景
RR 抢占 所有等待时间片的总和(作业在就绪队列中的总时间) 需要公平性,交互式系统(如分时系统)

(3)最高响应比优先(HRRN, Highest Response Ratio Next)

  • 原理:每次调度时,计算作业的响应比响应比最高的作业优先执行

  • 响应比公式
    响应比 = 等待时间 + 运行时间 运行时间 响应比 = \frac{等待时间 + 运行时间}{运行时间} 响应比=运行时间等待时间+运行时间

  • 特点

    • 短作业有较高响应比,优先执行,有利于短作业。
    • 长作业等待时间增加后,响应比也会变高,最终可以执行,避免饥饿问题。
  • 适用场景

    • 适用于兼顾短作业与长作业的系统
  • 示例
    假设有 3 个作业:

作业 到达时间 执行时间
A 0 3
B 1 6
C 1 4

步骤1:调度过程分析

HRRN 是非抢占式算法,每次选择响应比最高的作业执行。
响应比公式
响应比 = 等待时间 + 执行时间 执行时间 \text{响应比} = \frac{\text{等待时间} + \text{执行时间}}{\text{执行时间}} 响应比=执行时间等待时间+执行时间
其中,等待时间 = 当前时刻 - 到达时间。


详细调度流程
  1. 时刻 0
    • 只有 A 到达,直接执行。
    A 运行到时刻 3 完成

  2. 时刻 3
    • A 已完成,检查就绪队列中的作业:
    B 到达时间 1,已等待时间 = 3 - 1 = 2 秒。
    C 到达时间 1,已等待时间 = 3 - 1 = 2 秒。
    计算响应比
    ◦ B 的响应比 = 2 + 6 6 = 8 6 ≈ 1.33 \frac{2 + 6}{6} = \frac{8}{6} ≈ 1.33 62+6=681.33
    ◦ C 的响应比 = 2 + 4 4 = 6 4 = 1.5 \frac{2 + 4}{4} = \frac{6}{4} = 1.5 42+4=46=1.5
    选择响应比更高的 C 执行
    C 运行到时刻 7 完成(3 + 4)。

  3. 时刻 7
    • C 已完成,剩余作业 B。
    B 开始执行,运行到时刻 13 完成(7 + 6)。


步骤2:计算等待时间

作业 A
到达时间 0,立即执行,无等待。
等待时间 = 0 \text{等待时间} = 0 等待时间=0

作业 C
到达时间 1,开始执行时间 3,等待时间 = 3 - 1 = 2 秒。
等待时间 = 2 \text{等待时间} = 2 等待时间=2

作业 B
到达时间 1,开始执行时间 7,等待时间 = 7 - 1 = 6 秒。
等待时间 = 6 \text{等待时间} = 6 等待时间=6


步骤3:计算平均等待时间

平均等待时间 = 0   ( A ) + 6   ( B ) + 2   ( C ) 3 = 8 3 ≈ 2.67   秒 \text{平均等待时间} = \frac{0 \, (\text{A}) + 6 \, (\text{B}) + 2 \, (\text{C})}{3} = \frac{8}{3} ≈ 2.67 \, \text{秒} 平均等待时间=30(A)+6(B)+2(C)=382.67


对比 FCFS 算法

作业 到达时间 执行时间
A 0 3
B 1 6
C 1 4

若按 FCFS 调度顺序(A → B → C):
B 完成时间 = 3(A 完成) + 6 = 9
C 完成时间 = 9 + 4 = 13
等待时间
• A: 0
• B: 3 - 1 = 2
• C: 9 - 1 = 8
平均等待时间 = 0 + 2 + 8 3 ≈ 3.33   秒 \frac{0 + 2 + 8}{3} ≈ 3.33 \, \text{秒} 30+2+83.33


关键结论

  1. HRRN 的优势
    通过选择响应比更高的作业(C 优先于 B),HRRN 减少了短作业的等待时间,使平均等待时间(2.67 秒)低于 FCFS(3.33 秒)。

  2. 响应比的作用
    响应比公式通过 “等待时间 + 执行时间” 平衡了长作业和短作业的优先级,避免长作业饥饿。

  3. 设计示例的意义
    当多个作业同时到达时,HRRN 可动态调整优先级,优化平均等待时间。


(4)均衡调度

这个选项比较少见,可能指的是多级反馈队列调度(MLFQ, Multi-Level Feedback Queue)

  • 原理:根据进程执行情况动态调整优先级,短作业优先执行,长作业被降级。
  • 特点
    • 短作业可以迅速完成,长作业最终也会执行。
    • 适用于多任务系统

2. 题目解答

“一种既有利于短小作业又兼顾到长作业的作业调度算法”,最佳答案是:
C. 最高响应比优先(HRRN)

  • HRRN 使短作业优先执行
  • 长作业随着等待时间增加,最终也会执行
  • 避免短作业饥饿,也不会导致长作业无限等待

3. 额外补充

(1) 为什么 HRRN 能够兼顾短作业和长作业?

HRRN 计算响应比
响应比 = 等待时间 + 运行时间 运行时间 \text{响应比} = \frac{\text{等待时间} + \text{运行时间}}{\text{运行时间}} 响应比=运行时间等待时间+运行时间

  • 短作业 0 + 短时间 短时间 = 1 \frac{0+\text{短时间}}{\text{短时间}} = 1 短时间0+短时间=1,一般优先级高
  • 长作业:等待时间增长后, 等待时间 + 长时间 长时间 \frac{\text{等待时间} + \text{长时间}}{\text{长时间}} 长时间等待时间+长时间 逐渐变大,最终也会被调度

因此,HRRN 既保证了短作业优先,也不会让长作业一直等待


(2) 总结

调度算法 短作业友好 长作业友好 适用场景
FCFS ❌ (短作业可能等待长作业) ✅ (长作业可正常执行) 批处理系统
RR ✅ (每个作业都能执行) ❌ (长作业可能受时间片影响) 时间共享系统
HRRN ✅ (短作业优先) ✅ (长作业等待时间增加,最终执行) 最优选择
MLFQ ✅ (短作业优先) ✅ (长作业慢慢降级,但仍可执行) 多任务系统

最佳选择:C. 最高响应比优先(HRRN)