第九章 处理机调度
9.1 处理机调度概念:
-
进程切换就是CPU资源当前占用者的切换,通过进程切换实现CPU的时分复用。进程切换时需要保存当前进程在PCB中的执行上下文,同时恢复下一个进程的执行上下文。
-
处理机调度就是要实现从进程就绪队列中挑选下一个占用CPU运行的进程;如果存在多个可用CPU,还要从中挑选就绪进程可用的CPU资源。因此其中要关注两个内容:调度策略与调度时机。
-
调度程序:挑选就绪进程的内核函数
- 调度策略,依据什么原则挑选进程/线程
- 调度时机,什么时候进行调度
内核运行调度程序的条件:
-
有进程从运行状态切换到等待状态(非抢占);
-
有进程退出(非抢占);
以上两种是非抢占系统:当前进程主动放弃CPU时
可抢占系统: -
中断请求被服务例程响应完成时
-
当前进程被抢占
- 正在运行的进程时间片用完(抢占);
- 进程由等待转换到就绪(抢占)
9.2 调度准则
调度策略
- 确定如何从就绪队列中选择下一个执行进程
调度策略要解决的问题
- 挑选就绪队列中的哪一个进程
- 通过什么样的准则来选择
调度算法
- 在调度程序中实现的调度策略
比较调度算法的准则:
- 哪一个策略/算法较好?
处理机资源的使用模式:
- 进程一般是在CPU计算与I/O操作间交替执行。调度策略需要选取合适的时间片大小,由于进程使用CPU进行计算的单次时间往往是较短的,时间片的选择应尽量不要打断单次计算。
- 对调度算法优劣判断的准则:1、CPU使用率,(CPU处于忙状态的时间百分比)使用率应该尽量高;2、吞吐量,单位时间内完成的进程数量;3、周转时间,进程从初始化到结束(包括等待)的总时间,这是用户关心的;4、进程在就绪队列中的总时间,应该尽量降低;5、响应时间,从提交请求到产生响应的时间应该尽量短。
调度算法的要求:
- 希望更快的服务
上述目标有些是相互制约的,因此一个合理的调度算法应该统筹兼顾。下面对具体的调度算法进行介绍。
9.3 调度算法
FCFS:先来先服务,first come,first served;
SPN(SJF) SRT: 短进程优先(短作业优先)短剩余时间优先,shortest process next(shortest job first) shortest remaining time;
HRRN:最高响应比优先,highest response ratio next;
Round robin,轮循,使用时间切片和抢占来轮流执行任务;
Multilevel feedback queues,多级反馈队列,多级反馈队列,优先级队列中的轮循;
fair share scheduling, 公平共享调度;
1.先来先服务算法(FCFS)
- 依据进程进入就绪状态的先后顺序排列
- 进程进入等待或结束状态时,就绪队列中的下一个进程占用CPU
优点:简单;
缺点:
- 平均等待时间波动较大(没有抢占);
- 花费时间少的任务可能排在花费时间长的任务后面;
- I/O资源和CPU资源的利用率低
- 可能导致I/O和CPU之间的重叠处理(CPU密集型进程会导致I/O设备闲置时,I/O密集型进程也在等待)。
**2.短进程优先算法(SPN),**按照进程需要的执行时间选择
- 选择就绪队列中执行时间最短进程占用CPU进行运行状态
- 就绪队列按预期的执行时间来排序
2.1 短剩余时间优先算法(SRT)
- SPN算法的可抢占改进
优点:SPN算法的平均周转时间最少;(下图是一个例子,可以发现SRT的进程平均周转时间会短一些)
缺点:
- 可能导致饥饿(连续的短进程流会使长进程无法获得CPU资源)
- 需要预知未来
- 其中一个简单的解决办法:询问用户;
- 如果用户欺骗就杀死进程;
- 但是用户不知道怎么办
就需要用历史的执行时间来预估未来的执行时间
**3.最高响应比优先算法,**按照就绪队列内的等待时间长短选择
- 选择就绪队列中响应比R值最高的进程
4.时间片轮转算法(RR,Round-Robin),按照先来先服务,但每个进程执行时间不超过时间片长度,超出会被抢占。经验规则是维持上下文切换开销处于1%以内,大小通常在10ms左右。
- 时间片
- 分配处理机资源的基本时间单元
- 分配处理机资源的基本时间单元
举例说明:
(1)优点:公平;
(2)缺点:
- 额外的上下文切换花销;
- 如果时间片太大,则等待时间过长,极限情况下退化成FCFS;
- 如果时间片太小,虽反应迅速,但是开销大;吞吐量由于大量的上下文切换开销而受到影响;
(3)时间片长度选择目标 - 选择一个合适的时间片长度;
- 经验规则:维持上下文切换开销处于1%以内。
5.多级反馈队列算法,维护多个就绪进程队列,对不同队列可以使用不同调度策略
- 就绪队列被分成多个独立的子队列
- 如:前台(交互),后台(批处理)
每个队列可以有自己的调度策略,比如说前台队列可以是RR,后台队列可以是FCFS;
- 如:前台(交互),后台(批处理)
有一点要注意,就是调度必须在队列间进行,比如说,
- 固定优先级,例如先处理前台进程,后处理后台,但是可能会造成饥饿;
- 时间片轮转,每个队列都得到一个确定的能够调度其进程的CPU总时间,例如,80%给前台,20%给后台
多级反馈队列算法(MLFQ)
- 进程可在不同队列间移动的多级队列算法
- 对于I/O密集型任务,放在高优先级队列,这里的时间片比较短;
对于CPU密集型任务,防止低优先级队列,这里的时间片比较长。
(我们希望交互性好,占用资源多的可以放在后面)
公平共享调度(FFS,Fair Share Scheduling)
- 控制用户对系统资源的访问
- 站在用户的角度实现公平共享CPU资源。因为有的用户可能开的进程多,有的用户进程少。
- 它考虑了以下情况:
- 一些用户组比其他用户组更重要;
- 保证不重要的组无法垄断资源;
- 未使用的资源按照每个组所分配的资源的比例来分配;
- 没有达到资源使用目标的组获得更高的优先级。
6,传统调度算法总结
实际上这些调度算法和实际的调度算法是有很多区别的(复杂的多),但是基本的特征是类似的。
(1)FCFS先来先服务
->不公平,等待时间较长;
(2)SPN/SRT短进程优先
->不公平,但是平均等待时间最小;
->需要精确预测计算机时间;
->可能导致饥饿;
(3)HRRN最高响应比优先
->基于SPN调度的改进;
->不可抢占;
(4)Round Robin轮转
->公平,但是平均等待时间较长;
(5)MLFQ多级反馈队列
->多种算法的集成
->根据CPU和I/O状态动态调整;和SPN类似;
(6)Fair-share scheduling公平共享调度
->公平是第一要素。
9.4 实时调度
(1)实时操作系统
- 定义:正确性依赖于其时间和功能两方面的一种操作系统;
- 性能指标:时间约束的及时性(deadlines);速度和平均性能相对不重要;
- 主要特性:时间约束的可预测性; 强实时系统:需要在保证的时间内完成重要的任务,必须完成;
弱实时系统:要求重要的进程的优先级更高,尽量完成,并非必须;
一些术语,
- 任务(工作单元job):一次计算,一次文件读取,一次信息传递等;
- 任务属性:完成任务所需资源;定时参数。
released表示任务请求
周期任务:一系列相似的任务
- 任务有规律地重复;
- 周期p = inter-release time (0 < p);(两个红箭头内)
- 执行时间E = 最大执行时间(0< e < p);(蓝色区域)
- 使用率U = e / p;
硬时限:
->如果错过了最后期限,可能会发生灾难性或非常严重的后果;
->必须验证:在最坏的情况下也能够满足时限吗?
->保证确定性;
软时限:
->理想情况下,时限应该被最大满足。如果有时限没有被满足,那么就相应地降低要求;
->尽最大努力去保证任务时限;
(2)可调度性
- 表示一个实时操作系统能够满足任务时限要求
- 需要确定实时任务执行的顺序;
- 静态优先级调度:运行之前优先级就是确定的;
- 动态优先级调度:优先级在运行中是动态变化的;
(3)调度算法
- RM(Rate Monotonic)速率单调调度
静态调度算法
->通过周期安排优先级
->周期越短,优先级越高
->先执行周期最短的任务 - EDF(Earliest Deadline First)最早截止时间优先调度
动态调度算法
->截止时间越早,优先级越高
->先执行截止时间最早的任务
9.5 多处理器调度
多处理器的CPU调度更加复杂(多个相同的单处理器组成一个多处理器;它的优点是负载共享);
还有对称多处理器(SMP)(每个处理器运行自己的调度程序;需要在调度程序中同步);
对称多处理器的进程分配:
9.6 优先级反置
- 操作系统中出现高优先级进程长时间等待低优先级进程所占用资源的现象
优先级反转可以发生在任何基于优先级的可抢占的调度机制;
以上情况可以有以下两种方法:
(1)优先级继承
- 低优先级任务继承高优先级任务的优先级,这个依赖于他们共享的资源。此时T3的优先级会动态的得到提升,此时T2无法抢占T3。
临界区:每个进程都有一段代码,称为该进程的临界区,进程在临界区内执行时,可能会修改公共变量,更新表,读写文件等。
临界区问题:设计一个协议协作进程。当一个进程在临界区内执行时,其他进程不允许在其各自的临界区内同时执行。因此该协议应保证一个进程在进入其临界区前,进行请求许可。在进程的代码中,实现这一请求的代码段被称为进入区,在临界区之后可以有退出区,而退出区之后的为剩余区
(2)优先级天花板:
- “拥有资源”的进程的优先级和所有可能申请该资源的进程的最高优先级相同(T3拥有T1的资源,所以它的优先级提升到T1);
- 不管是否发生等待,都提升占用资源进程的优先级
- 优先级高于系统中所有被锁定的资源的优先级上限,任务执行临界区时就不会被阻塞
除非当前进程的优先级高于系统中所有被锁定的资源的优先级的上线,否则任务尝试执行临界区的时候会被阻塞;
持有最高优先级上限信号量锁的任务,会继承被该锁所阻塞的任务的优先级。