【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践

本文深入探讨了SJF(Shortest Job First)调度算法的工作原理及其应用实例,展示了该算法如何通过优先执行较短的任务来优化平均周转时间,并讨论了其在非抢占式调度中的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 前言

接上一篇文章:进程调度(1):FIFO(先进先出)算法 原理与实践

1 前提铺垫

请参考上一篇文章的前提铺垫部分,本文与之完全一致。

2 SJF 原理

SJF(Shortest Job First)短任务优先,也就说,对于Ready的多个进程,先执行最短的内一个。

2.1 算法

这种算法在我们的《算法与数据结构》中也是常见的,对于多个即将执行的任务,每一次都选择最短的先执行,执行完之后再执行次短的,以此类推,这样一来,每个任务的周转时间都是最小的,平均周转时间也就是最小的。

单纯从平均周转时间这个性能指标来说,这个算法还是不错的!

2.1.1 实例1

我们先来看一个实例,例如有4个任务(放宽每个任务时间都一样的假设)

  • A:10
  • B:1
  • C:4
  • D:100

假定4个任务同时到达,根据SJF的原则,我们的执行顺序应该是

B
C
A
D

对应的Average Turnaround Time = (1 + 5 + 15 + 115) / 4 = 34 (平均周转时间是34s)
在这里插入图片描述

2.1.2 实例1的模拟

我们直接将后面部分要将的实践搬到这里一部分,让你有一个直观的感受:

ARG policy SJF
ARG jlist 10,1,4,100

Here is the job list, with the run time of each job: 
  Job 0 ( length = 10.0 )
  Job 1 ( length = 1.0 )
  Job 2 ( length = 4.0 )
  Job 3 ( length = 100.0 )


** Solutions **

Execution trace:
  [ time   0 ] Run job 1 for 1.00 secs ( DONE at 1.00 )
  [ time   1 ] Run job 2 for 4.00 secs ( DONE at 5.00 )
  [ time   5 ] Run job 0 for 10.00 secs ( DONE at 15.00 )
  [ time  15 ] Run job 3 for 100.00 secs ( DONE at 115.00 )

Final statistics:
  Job   1 -- Response: 0.00  Turnaround 1.00  Wait 0.00
  Job   2 -- Response: 1.00  Turnaround 5.00  Wait 1.00
  Job   0 -- Response: 5.00  Turnaround 15.00  Wait 5.00
  Job   3 -- Response: 15.00  Turnaround 115.00  Wait 15.00

  Average -- Response: 5.25  Turnaround 34.00  Wait 5.25

具体含义在上一篇文章已经解释过了,不再细说。

这样来看,SJF在这种情况下,的确是最优的,从数学角度来说也是最优的!

但是,如果我们放宽任务同时到达的条件,事情可能又比较糟糕了……

2.2 缺点:非抢占式调度

什么是非抢占式调度呢?我们先来看一个假设:

假设任务A在CPU执行,任务B到达了,并且B的运行时间比A小,但是A在B到达之前已经在执行了,B就只能等着A执行完再执行,尽管B比A的运行时间少。

这就是非抢占式调度,后来者即便比正在运行的进程时间短,也不能抢占它的位置来运行自己

这样的话,会造成什么问题呢?我们来看一个实例

  • A:100
  • B:10
  • C:20

三个进程,A先到达(0时刻到达),随后B、C到达(B、C同时在时刻10到达)。

程序的执行情况

A
B
C

对于后来的B和C,虽然远比A运行时间小,但是由于SJF的非抢占,它们只能等着A执行完,然后再执行B,再执行C(因为B比C时间少)。
在这里插入图片描述
这显然是糟糕的,此时,Average Turnaround Time = (100 + 110 + 120) / 3 = 110。看起来,又退化到了FIFO算法……

显然,非抢占式调度也不是很好。所以人们又提出了新的算法……是的,当旧算法出现问题,自然会催生新算法诞生,人类的科技就是这样一步步变得越来越强大和复杂。

3 SJF 实践

你可以充分阅读README.md文档,然后自己尝试一些数字并计算,之后再参考答案。

值得说明的是,模拟程序并不是很完美,默认是多任务同时到达,并且没有提供修改选项。

4 重要思想

对于同时到达的任务,采取花费时间少的优先执行,这能够让我们的Average Turnaround Time这一性能指标达到最优。但是不同时到达的任务,可能不太好用,因为它“不会抢地盘”,只会“傻等着”,后续我们也会介绍解决方案。

后续我们会介绍更多的性能指标,你就会发现,仅仅只有平均周转时间最优,是远远不够的。

5 预告:进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

基于SJF的非抢占式调度的缺点,STCF做了改进,实现了抢占式调度

下一篇链接:进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XV_

感谢您的认可,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值