0、前置知识
0.1 调度性能指标
周转时间:周转时间 = 完成时间 - 到达时间
响应时间:响应时间 = 首次运行时间 - 到达时间
0.2 上下文切换
当一个进程停止时,他的寄存器将被保存在这个内存位置。通过恢复这些寄存器(将他们的值放回实际的物理寄存器中),操作系统可以恢复运行该进程。这种技术叫做上下文切换。
1、进程调度算法简单介绍
1.1 先进先出(FIFO)
先进先出(First In First Out)调度是我们可以实现的最基本的算法,有时也被称为先到先服务(First Come First Served或FCFS)。
优点:简单,易于实现。
举个例子看看为什么FIFO不好:假设A(100s)、B(10s)、C(10s)三个工作几乎同时来到系统,A稍微比B早一点,B稍微比C早一点,那么,一定要等到A完成后,B才有机会运行。所以系统平均周转时间为:
(100+110+120)/ 3 = 110 s
这个问题通常被称作护航效应,简单来说,就是一些耗时较少的潜在资源消费者被排在重量级资源消费者之后。
那么如何解决这个问题呢?咱们接着往下看:
1.2 最短任务优先(SJF)
最短任务优先(Shortest Job First)很好地解决了这个问题。它的策略为:先运行最短的任务,然后运行次短的任务。
当在只考虑平均周转时间的情况下,SJF显然比FIFO要好的多,同样是上面的例子,平均周转时间为:
(10+20+100)/ 3 = 50 s
事实上,考虑到所有工作同时到达的假设,我们几乎可以证明SJF确实是最优的调度算法。然而,当我们考虑实际:工作可以随时到达,这又会出现什么情况呢?
我们再用一个例子来说明:假设 A 在 t = 0 时到达,且需要运行 100s。而 B 和 C 在 t = 10 到达,且各需要运行 10s。用SJF,平均周转时间为:
(100 + (90+10)+ (100+10))/ 3 = 103.33
可以看到,SJF遭遇了同样的护航问题。