SJF算法(Shortest Job First)

定义:

SJF(最短作业优先)是一种调度算法,执行时间最短的作业(任务)优先执行。它有两种形式:

  • 非抢占式SJF: 一旦任务开始执行,就一直执行直到完成,不会被其他任务打断。

  • 抢占式SJF(也叫 SRTF,Shortest Remaining Time First): 如果新任务的剩余时间比当前正在执行的任务还短,当前任务会被中断,新的任务会先执行。

核心思想: 优先执行运行时间短的任务,这样可以减少任务的等待时间和系统的平均周转时间。

特点:

  • 非抢占式: 任务一旦开始执行,不会被中断,直到完成。(注:此处特性描述对应的是非抢占式SJF)

  • 效率较高: 最短作业优先能够最小化平均等待时间(在理想情况下)。

  • 难以实现: 在实际应用中,很难准确知道每个任务的执行时间,因此需要事先估算或假设任务的执行时间。

优缺点:

  • 优点:

    • 最小化平均等待时间: 由于短任务会先执行,减少了长任务对短任务的延迟,使得平均等待时间相对较低。

    • 提高系统吞吐量: 短任务优先执行,提高了系统的整体吞吐量。

  • 缺点:

    • 难以预知任务执行时间: 在实际应用中,往往很难准确预测任务的执行时间(这是 SJF 最大的痛点)。

    • 可能导致长任务饥饿: 长任务可能长时间无法执行,因为系统会优先处理短任务,导致长任务的等待时间过长(即“饥饿现象”)。

    • 不适合动态任务负载: 如果任务的执行时间不是预先已知的,SJF 的效果可能会较差。

适用场景:
适用于任务执行时间已知或能大致预测的系统,例如批处理系统或者任务执行时间固定的环境。但在动态负载下,使用SJF可能会存在困难。

SJF算法例题

假设有4个任务,它们的到达时间和服务时间(执行时间)如下:

任务到达时间 (Arrival Time)服务时间 (Burst Time)
P106
P218
P327
P433

步骤 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

表格总结

任务到达时间服务时间完成时间周转时间等待时间
P433630
P10612126
P327191710
P218272618

平均等待时间:
平均等待时间=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 可能会遇到困难。为了避免长任务饥饿,可以采用 带优先级调度 或 多级反馈队列 等更复杂的调度策略。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐