1.调度
调度就是OS对时间片的分配方法
判断调度算法好坏的标准:
1.平均周转时间(就是把周转时间取平均数)
周转时间=进程的完成时间-进程的到达时间
2.平均响应时间
相应时间=OS第一次运行进程的时间-进程的到达时间
5个理想化假设:
1.每一个进程运行相同的时间
2.所有进程几乎同时到达
3.一旦开始,每个进程一直运行直到完成
4.所有的进程都只使用CPU,不发起I/O操作
5.每个进程的运行时间是已知的
2.先进先出(FIFO)调度算法
先进先出调度(First In First Out或FIFO)有时也叫先到先服务(First Come First Served或FCFS)。
我们一起看一个简单的例子。想象一下,3个工作A、B和C在大致相同的时间(t时间=0)到达系统。因为FIFO必须将某个工作放在前面,所以我们假设当它们都同时到达时,A比B早一点点,然后B比C早到达一点点。假设每个工作运行10s。这些工作的平均周转时间(average turnaround time)是多少?
从下图可以看出,A在10s时完成,B在20s时完成,C在30s时完成。因此,这3个任务的平均周转时间就是(10+20+30)/3=20。计算周转时间就这么简单。
在上面5个假设都成立的条件下,FIFO调度算法是最优的。最优的意思的:平均周转时间最少。
平均周转时间最少的原因是以上面为例子:
第1个被调度的进程,周转时间>=10秒
第2个被调度的进程,周转时间>=20秒
第3个被调度的进程,周转时间>=30秒
......
3.SJF调度算法
在4个假设都成立的条件下:1.所有进程几乎同时到达;2.一旦开始,每个进程一直运行直到完成;3.所有的进程都只使用CPU,不发起I/O操作;4.每个进程的运行时间是已知的,SJF调度算法是最优的。最优的意思是:平均周转时间最少。平均周转时间最少的原因是:
越短的进程越先运行,其他进程等待的时间就越短。
4.STCF调度算法
每当有新的进程到达时,就把新进程的运行时间和老进程剩下的运行时间排序,越小的越先调度。
在上面2个假设条件:1.所有的进程都只使用CPU,不发起I/O操作;2.每个进程的运行时间是已知的成立的条件下,STCF调度算法是最优的。最优的意思是:平均周转时间最少。平均周转时间最少的原因:
每当有新进程到达时,就对新的进程和老进程的剩下运行时间采用SJF的调度方式进行调度。
上面的调度算法,按照响应时间来判断都不好。
什么样的调度算法的平均相应时间比较好?
5.RR调度算法
RR调度算法的平均响应时间比较好。比较好的原因:RR调度算法把CPU的时间分为一个个时间片,然后进程轮转着使用CPU的时间片。
6.MLFQ调度算法(非常重要,现在的调度算法一定是有借鉴这个算法)
目的:在进程真实运行环境中,努力做到同时减少周转时间和响应时间。
方法:利用历史信息,来预测进程未来的行为
思路:利用多级队列(不同队列不同优先级),多级队列和历史信息来模拟SJF调度算法
模拟方法:如果MLFQ利用历史信息,预测到一个进程是需要CPU时间比较多的进程,就把这个进程放到后面运行;(下规则4a)
如果MLFQ利用历史信息,预测到一个进程是需要CPU时间比较少的进程,就把这个进程放到前面运行。(下规则4b)
MLFQ把新进程放入最高优先级队列。(下规则3)
规则1.高优先级队列中的进程先运行。
规则2.同一个优先级队列中的进程轮转进行。
规则3.新进程放入最高优先级队列。
规则4a.如果一个进程在使用自己的时间片的过程中,没有发起I/O操作,MLFQ就预测这是一个需要CPU时间比较多的进程,就把这个进程放到下一个优先级队列中。
规则4b.如果一个进程在使用自己的时间片的过程中发起了I/O操作,MLFQ就预测这是一个需要CPU时间比较少的进程,就保持进程的优先级不变。
采用规则1、2、3、4a、4b的MLFQ算法的缺点:
1.预测未来不可能完全准确;
2.可以欺骗MLQT调度算法:在每个时间片结束之前,发起I/O操作;
3.最高优先级队列中2.中类型的进程多了后,低优先级队列中的进程就没有办法被调度到CPU上去执行。
缺点2、3的解决方法:
给每一个进程一个时间配额,当进程用完时间配额后(不管怎么用的),就把进程放到下一个优先级队列中。同一个优先级队列的进程时间配额是一样的,但是不同优先级队列的进程的时间配额不一样。一般来说,高优先级队列的进程的时间配额少,低优先级队列的进程的时间配额多。
缺点1的解决方法:
每隔一段时间,MLFQ把所有的进程全部重新放入最高优先级队列中。
MLFQ调度算法:
规则1.高优先级队列中的进程先运行。
规则2.同一个优先级队列中的进程轮转进行。
规则3.新进程放入最高优先级队列。
规则4.给每一个进程一个时间配额,当进程用完时间配额后,就放入下一个优先级队列;
规则5.每隔一段时间,把所有的进程全部重新放入最高优先级队列中