7.1 什么是CPU调度呢?
假设系统内此时有三个进程需要执行,进程1因为时间片到了或者被阻塞了,那么接下来需要从就绪态的进程2和进程3中选择一个执行,到底选择哪一个?这个选择就叫作调度。如下图所示
7.2 CPU调度(进程调度)的直观想法
FIFO?
- 谁先进入,先调度谁:简单,公平 银行、食堂
- 一个只简短询问的业务怎么办?等待五小时,办事五分钟似乎不太合适
Priority(优先级)?
- 任务短可以适当优先
- 这人的询问时间越来越长怎么办
- 如果一个银行业务长是因为客户需要填一张很长的表怎么办?
7.3设计调度算法的原则
我们的算法设计目标?
- 面对银行客户:银行调度算法的设计目标是让用户满意,比如等待时间短
- 面对进程:CPU调度的目标应该是让进程满意,比如响应快,周转时间短
让进程满意的三大指标
- 周转时间(任务从进入到结束)短,即尽快结束任务
- 响应时间(任务从进入到开始执行)短,这样用户的操作能尽快响应
- 系统内耗时间少:系统内耗指不在具体执行任务的时间,比如进程切换时保存中断现场这些操作。内耗时间短,才能使CPU吞吐量大(完成的任务量)
总的原则是:系统专注于任务执行,又能合理调配任务
如何做到合理调配任务?先看不同指标之间的关联
- 吞吐量与响应时间之间的矛盾:响应时间小——》切换次数多——》系统内耗大——》吞吐量小
- 前台任务和后台任务关注点不同:前台任务如打字,放PPT等更关注响应时间,后台任务如图像压缩,数据解码等更关注周转时间
- I/O约束型任务和CPU约束型任务特点不同
如上图所示,CPU约束型任务指CPU占用时间长的任务,如程序编译,矩阵运算这些计算任务,开始了就一直执行不停。I/O约束型任务指CPU占用时间短的高发任务,如读数据,保存数据。
很显然,如果优先CPU约束型任务,那么I/O约束型要等待很长时间,直到CPU约束性执行完,而如果优先I/O约束型任务,那么只需简单操作,如开始读后就阻塞该任务,马上切到CPU约束型任务,等读完了再切回I/O约束性任务,相当于实现并行。
因此CPU调度策略需要在各种指标之间折中和综合,同时又要求尽量简单。
7.4几种典型的CPU调度算法思想
-
队列模型
即先到达先服务,这样保证了公平,但存在什么问题呢?
按先到达先服务策略执行,那么平均周转时间为40.2(忽略0.001z等到达时间,认为同时到达)
假如我们把P2和P3顺序对换,那么P1及P4、P5周转时间不变。原本P2周转时间为39,P3为42.兑换后,P3为13,P2为42。总的周转时间减少了36,那么平均周转时间也就下降了。
也就是说先到达先服务的调度算法简单公平,但周转时间长 -
SJF:短作业优先
可以证明:按照上图所示的按任务时间长短升序排列的平均周转周期最短 -
RR:时间片轮转调度算法
先进先出和短任务优先都没有考虑响应时间。那么排在最后的任务将会一直等待很长时间。
我们给每个任务分配时间片,轮流执行,这样每个任务都能尽可能快响应。
此处设计时间片大小仍需要折中考虑:
时间片大:平均响应时间长;时间片短:切换频繁,内耗大造成吞吐量小 -
优先级调度
前台任务和后台任务同时存在怎么办?前面说了前台任务关注响应时间,后台任务关注周转时间。现有word和visual stdio编译两个任务存在。那么需要让这两种任务都合理执行,就得同时考虑响应时间和周转时间
直观想法:将前台任务定义为轮转调度队列,将后台任务定义为短任务优先调度队列。并且将前台任务优先级设为高优先级,只要有前台任务存在时就不调度后台任务
插入一个小故事:1973年关闭的MIT的IBM7094时,发现一个进程在1967年提交但一直未运行
如果不断有前台任务执行,那么后台任务一直得不到执行。
因此实用的调度算法应该是:首先考虑用户体验,不能等待太久,因此以轮转调度为核心,同时考虑优先级调度和短任务优先调度,保证后台任务也会得到执行,折中平衡。