SJF算法(Shortest Job First)
定义:
SJF(最短作业优先)是一种调度算法,执行时间最短的作业(任务)优先执行。它有两种形式:
- 非抢占式SJF:一旦任务开始执行,就一直执行直到完成,不会被其他任务打断。
- 抢占式SJF(也叫 SRTF,Shortest Remaining Time First):如果新的任务的剩余时间比当前正在执行的任务还短,当前任务会被中断,新的任务会先执行。
SJF的核心思想是 优先执行运行时间短的任务,这样可以减少任务的等待时间和系统的平均周转时间。
特点:
- 非抢占式:任务一旦开始执行,不会被中断,直到完成。
- 效率较高:最短作业优先能够最小化平均等待时间(在理想情况下)。
- 难以实现:在实际应用中,很难准确知道每个任务的执行时间,因此需要事先估算或假设任务的执行时间。
优缺点:
-
优点:
- 最小化平均等待时间:由于短任务会先执行,减少了长任务对短任务的延迟,使得平均等待时间相对较低。
- 提高系统吞吐量:短任务优先执行,提高了系统的整体吞吐量。
-
缺点:
- 难以预知任务执行时间:在实际应用中,往往很难准确预测任务的执行时间。
- 可能导致长任务饥饿:长任务可能长时间无法执行,因为系统会优先处理短任务,导致长任务的等待时间过长(即“饥饿现象”)。
- 不适合动态任务负载:如果任务的执行时间不是预先已知的,SJF 的效果可能会较差。
适用场景:
适用于任务执行时间已知或能大致预测的系统,例如批处理系统或者任务执行时间固定的环境。但在动态负载下,使用SJF可能会存在困难。
SJF算法例题
假设有4个任务,它们的到达时间和服务时间(执行时间)如下:
任务 | 到达时间 (Arrival Time) | 服务时间 (Burst Time) |
---|---|---|
P1 | 0 | 6 |
P2 | 1 | 8 |
P3 | 2 | 7 |
P4 | 3 | 3 |
步骤 1:按服务时间(Burst Time)排序
由于SJF优先执行服务时间(执行时间)最短的任务,因此我们首先需要确定任务的执行顺序。假设所有任务都在同一时刻到达并开始排队,首先会选择服务时间最短的任务执行。
- 到达时间和服务时间的关系:
- P1 到达时没有其他任务,服务时间为 6。
- P2 在 P1 执行时到达,服务时间为 8。
- P3 在 P1 执行时到达,服务时间为 7。
- P4 在 P1 执行时到达,服务时间为 3。
执行顺序根据任务的服务时间从短到长为:P4 → P1 → P3 → P2。
步骤 2:计算完成时间、周转时间和等待时间
- P4:到达时间为 3,执行时间为 3。完成时间 = 3 + 3 = 6
- P1:到达时间为 0,执行时间为 6。完成时间 = 6 + 6 = 12
- P3:到达时间为 2,执行时间为 7。完成时间 = 12 + 7 = 19
- P2:到达时间为 1,执行时间为 8。完成时间 = 19 + 8 = 27
步骤 3:计算周转时间 (Turnaround Time) 和等待时间 (Waiting Time)
- P4:
- 周转时间 = 完成时间 - 到达时间 = 6 - 3 = 3
- 等待时间 = 周转时间 - 服务时间 = 3 - 3 = 0
- P1:
- 周转时间 = 完成时间 - 到达时间 = 12 - 0 = 12
- 等待时间 = 周转时间 - 服务时间 = 12 - 6 = 6
- P3:
- 周转时间 = 完成时间 - 到达时间 = 19 - 2 = 17
- 等待时间 = 周转时间 - 服务时间 = 17 - 7 = 10
- P2:
- 周转时间 = 完成时间 - 到达时间 = 27 - 1 = 26
- 等待时间 = 周转时间 - 服务时间 = 26 - 8 = 18
总结表格:
任务 | 到达时间 | 服务时间 | 完成时间 | 周转时间 | 等待时间 |
---|---|---|---|---|---|
P4 | 3 | 3 | 6 | 3 | 0 |
P1 | 0 | 6 | 12 | 12 | 6 |
P3 | 2 | 7 | 19 | 17 | 10 |
P2 | 1 | 8 | 27 | 26 | 18 |
平均等待时间:
平均等待时间=0+6+10+184=8.5\text{平均等待时间} = \frac{0 + 6 + 10 + 18}{4} = 8.5
平均周转时间:
平均周转时间=3+12+17+264=14.5\text{平均周转时间} = \frac{3 + 12 + 17 + 26}{4} = 14.5
分析:
在这个例子中,SJF算法通过优先执行最短任务来减少了系统的平均等待时间和平均周转时间。具体表现为:
- P4 是最短任务,首先执行,减少了后续任务的等待时间。
- 长任务的等待时间较长:例如,P2 是服务时间最长的任务,它的等待时间(18)和周转时间(26)相对较长,反映了 “饥饿”现象,即长任务由于总是被短任务阻塞,导致它们的执行被推迟。
SJF的优缺点也可以从这个例子中看出:
- 优点:最小化了平均等待时间和平均周转时间,优化了系统的性能。
- 缺点:长任务的等待时间较长,可能会导致“饥饿”现象,影响系统的公平性。
总结:
SJF 算法通过优先执行短任务减少了等待时间,但在实际应用中,由于任务的执行时间通常难以预知,使用 SJF 可能会遇到困难。为了避免长任务饥饿,可以采用 带优先级调度 或 多级反馈队列 等更复杂的调度策略。