1. 作业调度算法介绍
在操作系统中,作业调度(Job Scheduling) 是指在作业进入系统后,根据一定的策略决定哪些作业进入内存,并分配 CPU 资源进行执行。常见的作业调度算法主要有以下几种:
(1)先来先服务(FCFS, First-Come, First-Served)
-
原理:按照作业到达的先后顺序进行调度,先到先执行。
-
特点:
- 优点:公平、实现简单
- 缺点:不利于短作业,因为长作业可能会占用 CPU 很长时间,导致短作业不得不等待(“短作业饥饿”)。
-
适用场景:
- 适用于对响应时间要求不高的批处理系统。
-
示例
假设有 3 个作业,到达时间和执行时间如下:作业 到达时间 执行时间 A 0 3 B 2 6 C 4 4 按照 FCFS 调度顺序:
- A 先执行 3 秒(0 ~ 3)
- B 在 3 秒后才可以执行,运行 6 秒(3 ~ 9)
- 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{执行时间}} 响应比=执行时间等待时间+执行时间
其中,等待时间 = 当前时刻 - 到达时间。
详细调度流程
-
时刻 0:
• 只有 A 到达,直接执行。
• A 运行到时刻 3 完成。 -
时刻 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=68≈1.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)。 -
时刻 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)=38≈2.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+8≈3.33秒
关键结论
-
HRRN 的优势:
通过选择响应比更高的作业(C 优先于 B),HRRN 减少了短作业的等待时间,使平均等待时间(2.67 秒)低于 FCFS(3.33 秒)。 -
响应比的作用:
响应比公式通过 “等待时间 + 执行时间” 平衡了长作业和短作业的优先级,避免长作业饥饿。 -
设计示例的意义:
当多个作业同时到达时,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)