《Operating System:Three Easy Pieces》阅读笔记<四>——调度策略

164 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

image.png

调度策略

我们已经了解了操作系统调度资源的底层策略,如进程的运行等。但是如果要想理解更高级的调度策略(scheduling policies),那么首先要明确我们要解决的是什么问题:早期计算机的调度策略是怎样的?调度策略的关键假设评估指标是什么?怎样建立一个调度策略的基本框架

我们抽象出一个概念:工作负载(workload)来描述操作系统的所处理的任务也就是调度进程,用作业(job)来描述进程,并且我们假设在操作系统中

  1. 每个作业运行相同的时间。
  2. 所有的作业同时出现。
  3. 一旦启动,每个作业就会一直运行到完成。(这个假设看上去更靠谱一些,但还是假设)
  4. 所有的作业只使用CPU(它们不执行I/O)。
  5. 每个作业的运行时是已知的。(这个最离谱,但是这是本次讨论的大前提)

提出假设的原因是我们如果想从零开始构建一个调度策略,首先就要考虑最简单的情况,也就是以上假设都成立的情况(当然这不可能),另外,我们需要一些评估指标来告诉我们设计的调度策略合不合理,这里我们提出两个指标:

  • turnaround time = 进程完成时间 - 进程出现时间(对系统友好)
  • response time = 进程响应时间 - 进程出现时间(对用户友好)

准备工作都完成了,我们开始正式讨论调度策略的构建。假如系统钟工作负载都遵循以上的假设,那么操作系统就可以用十分简单的调度策略来安排CPU资源的使用如FIFO策略(假设①成立)

FIFO是First In, First Out的缩写,顾名思义,操作系统把每个进程都安排运行,先来先服务,问题是显而易见的,假设①不成立的话,如果一个进程占用时间太长,那么后面的进程被无限延后,这将导致系统极其难用。

还有稍微升级一些的策略:SJF策略(假设②成立)

SJF是Shortest Job First的缩写,基本上就是针对FIFO的缺点,把运行时间最短的放到前面进行,假设②不成立的话,如果有进程在A运行的中间才开始,就要被迫等到A结束才能执行,导致这基本上和FIFO没有区别

假如我们以turnaround time作为评价体系(考虑系统),那么在假设5成立的情况下,我们应当使用STCF调度策略,它的基本思想就是:每当有程序进入运行状态,在当前所有进程中总运行时间最短的对cpu资源进行抢占,以此近似最优化turnaround time。

STCF是Shortest Time-to-Completion First的缩写,和上面描述的一样,它可以解决前两个策略的问题,它的问题是对用户不友好,试想一下假如A进程是一个用户界面程序,那么用户会明显的感觉到程序的卡顿

假如我们以response time作为评价体系(考虑用户),那么在假设5成立的情况下,我们应当使用RR调度策略,它的基本思想就是:选取一个cpu时间的n倍作为基本时间片,然后每隔一个时间片就切换一次进程,这样确保每个进程从开始到结束都有相对良好的响应速度。注意,时间片的选取对响应时间的影响至关重要。但是并不是时间片越短越好,因为上下文切换的时间成本会因此指数级上升。

RR是Round Robin的缩写,Robin在英语里有侠盗的意思,在这里就是指“好”的抢占

我们注意到,假如进程有IO任务,那么在它进行IO时,进程处于等待(ready)状态,很浪费CPU资源,CPU可以使用overlap策略对IO时间片用其它进程进行抢占。这样可以利用时间片切换进程的特性来使IO对CPU的影响降到很低。

overlap很重要,这一朴素的思想因其实用性一直沿用至今,之后我们也会在各种地方看到它

总结

这节所学的是调度策略是设计思想,实际操作系统的调度策略十分强大,同时非常复杂。早期调度策略非常简单以至于没有实用性,在假设5成立的情况下,我们可以采用STCF、RR、overlap结合的策略来对进程进行调度,但是RR会大大增加turnaround time,而STCF会增加response time,怎样对他们进行trade-off是构建调度策略的基本框架的关键。