【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

0 前言

接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践

1 前提铺垫

与上一篇同。

2 STCF 原理

STCF(Shortest Time-to-Completion First)最短完成时间优先。

2.1 算法

还记得上一个算法SJF吗?它是非抢占式的,只能傻傻地等着长任务A完成,这显然是“懦弱”的,并且降低了系统的效率,因此,让我们给它添加一个抢占功能吧!

抢占什么呢?当然是A了,还是用上次的例子

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

A在0时刻到达并执行,B和C在10时刻到达。之前B和C只能等着A结束执行再按照B、C的顺序执行,现在,我们有抢占功能了!

在时刻10的时候,Scheduler(调度器)发现B和C的执行时间比A短,那么好,A你就不要再执行了,让B先来吧! 这里,我们也使用到了上下文切换机制,先保存了A执行的状态,等B、C执行完,再让A继续执行。

一个问题:究竟是识别A剩余执行时间,还是全部执行时间,又或者什么呢?A、B和C的执行时间,系统又怎样得知?这些我们以后再谈,并且这设计到了具体实现的层次,现在,我们的假设还是运行时间是已知的,并且是在抽象层次在谈论。

【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践
这样,看起来就比之前的SJF棒多了!起码它学会了“抢车位”。

现在,Average Turnaround Time = (10 + 30 + 130)/ 3 = 56.67,要知道,之前可是110。

不过,这个算法也会有一些问题,我们下面说一下。

2.2 缺点:长任务“饥饿”

试想一下,对于一个长任务,如果有远远不断地短任务进入,那么这个长任务可能永远不会被执行了……(它也太惨了……)

不仅如此,对于一个交互型程序来说,与用户交互的响应时间(我们下一讲说这个指标,简单来说,就是用户发送命令,到看见屏幕产生变化的时间,这应该很快才对)就会非常长,想象一下,你敲击键盘的字母A后,等待10s才看见屏幕上显示了A……这简直让人发疯!

说明:在原书中没有给出STCF算法的模拟,因此暂时没有实践内容,不过因为该算法与SJF的区别就在于抢占,因此比较容易理解。

2.3 关注点:顺序执行的打破

我们之前看到的进程,都是从一开始执行,就一直执行到完成才停止,这个过程并不需要上下文切换机制前面的篇章好像写错了……),而这一次,我们看到了任务A被分成了两段来执行,这时候就使用到了上下文切换机制了,被打断的A,必须要保存现场,然后下一次被执行的时候,恢复现场继续执行。

这也是我们第一次见到,多个任务不是顺序执行的,而是切换执行的,下一篇轮转算法,你将更清晰地体会到这一点!

3 核心思想

STCF与SJF本质是一样的,区别就是,前者是抢占式,后者是非抢占式的。

核心思想就是,让运行时间短的任务先执行

这样做的缺点也分析过,长任务可能一直得不到执行,后续我们会解决这个问题的。

4 预告:进程调度(3):RR(轮转) 算法 原理与实践

我们接下来会使用轮转算法解决交互式程序响应时间问题。这样能让用户获得很好的体验。