进程调度:介绍
本文主要介绍一些基础的调度策略。
调度指标
以下算法的性能指标只考虑周转时间。
周转时间 = 完成时间 - 到达时间
先进先出(FIFO)
这个算法的思路很简单,先来的先执行,并且易于实现。就好比有三个任务A,B,C,他们到来的顺序是B,A,C,那么就按照他们到来的顺序进行执行。
存在的问题:如果先来的任务执行了很长时间,会导致后边的任务等待很久才可以执行,这样会导致系统的周转时间变的很长。
最短任务优先(SJF)
该算法会先运行短任务,然后运行次短任务,依次下去。如果任务同时到达,该算法较FIFO算法可以很好的解决平均周转时间长的问题。
但是如果任务不同时到达,那么执行时间长的任务比短时任务先到达,还是会导致短任务需要等待。
最短完成时间优先(STCF)
上面两种算法都是非抢占式的。
而最短完成时间优先可以理解为一种抢占式的最短任务优先算法。
该算法下,没当有任务进入系统,会判断当前正在执行任务的剩余时间和新任务的时间,哪个短就执行哪个。
新的性能指标
从现在开始,性能不仅考虑周转时间,还要考虑响应时间。
响应时间 = 首次运行 - 到达时间。
轮转
在加入新的性能指标后,上述算法就会出现问题,因为会导致长任务的响应时间特别长。
轮转的思想是,每一个任务执行一个时间片,然后切换到队列中的下一个任务,而不是一个任务一直执行,直到完毕。
该算法需要考虑时间片长短的问题,太短会导致频繁切换而导致性能下降,而太长,则会导致周转时间和响应时间太长,所以需要权衡考虑。
结合I/O
现在假设任务都需要进行I/O操作,那么轮转这种设计方法就会体现出它的优势。
如果不进行轮转,先到来的任务占用处理器资源,然后又进行了I/O操作,那么会导致一个任务占用处理器资源却不使用,而是进行I/O操作,导致其他任务也无法执行,这是对处理器的浪费。
而轮转却能很好的解决该问题,因为任务在执行I/O操作时,可以让出处理器,让其他任务使用。
无法预知
上面的讨论都是建立在操作系统知道任务需要处理多长时间,而事实情况是,执行时间是无法估计的,所以像SJF或者STCF这种算法,几乎无法实现。
参考
《操作系统导论》