文章目录
8.1 处理器调度概念
8.1.1 调度的技术背景
在此前我们已经介绍了进程和线程机制, 它们可以使得CPU能够更加有效地展现并行处理的能力。
对于资源基本管理单位的进程来说,CPU资源的当前占用者切换是基本的并行思路。
但有如下两个问题:
- 如何从就绪队列中选出下一个运行(占用CPU)的进程
- 从多个CPU中选出就绪进程中当前准备使用的的CPU
这两个选择任务就交由调度算法来实现。
8.1.2 调度时机
调度程序除了解决上述提到的进程线程选择之外,还进行调度时机选择
内核在如下两种条件下运行调度程序:
- 进程从运行状态切换到等待状态
- 进程被终结了
对应下图的两个红箭头指示的状态转换过程
非抢占系统:当前进程主动放弃CPU时
可抢占系统:中断请求被服务例程响应完成时,或者被抢占(时间片用完;从等待切换到就绪)
8.2 调度准则
8.2.1 评定调度算法好坏的指标
从运行效率来说:
- CPU使用率:CPU处于忙状态的时间百分比
- 吞吐量:单位时间内完成的进程数量
从用户使用来说:
- 周转时间:进程从初始化到完成(包括等待)的时间
- 等待时间:进程在就绪队列中等待的时间
- 响应时间:从提交请求到产生响应所花费的总时间
调度算法的要求:希望“更快”的服务
对于“更快”我们有两个层面的描述:
- 传输文件时,我们希望高带宽,对应调度算法的高吞吐量
- 玩游戏时,我们希望实时响应,对应调度算法的低响应延迟
这两个因素是独立的。我们的设计也分别基于这两个方向。
8.2.2 调度策略的低时延目标
减少响应时间:及时处理用户的输入请求,尽快将输出反馈给用户
减少平均响应时间的波动:可预测性和稳定性比高差异低平均更好
低延迟调度改善了用户的交互体验
8.2.3 调度策略的吞吐量目标
增加吞吐量:减少开销并实现系统资源高效利用
减少等待时间:减少每个进程的等待时间
要点:
- 操作系统需要保证吞吐量不受用户交互影响
- 吞吐量是操作系统的计算带宽
8.2.4 调度的公平性目标
除上述两条对于单用户的使用设计目标外,对于多用户的使用公平性。
- 保证每个进程占用相同的CPU时间
- 保证每个进程的等待时间相同(因此,一个用户使用多个进程,其等待时间也相应增加)
公平性通常会牺牲一定程度的时延。
8.3 调度算法
8.3.1 就绪队列优先级
先来先服务(FCFS)
FIFO策略,相对简单。
但平均周转时间变长,如下图示例
另外这样没有考虑资源配置,所以有可能导致资源调用的时间层面不均,使得IO和CPU利用率较低。比如CPU密集型的进程队列和会导致IO闲置,反之亦然。
短进程优先(SPN)以及其他变种:SJF,SRT
为了解决FCFS的长周转时间问题,我们将预期执行时间进行排序,实现一个关于最小化周转时间的贪心算法。证明如下:
就绪队列按照预期的执行时间来排序。
- 可以询问用户,用户可能不知道;也有可能给出过于乐观的估计,比如用户觉得自己的工作能很快做完(“欺骗”),但发现卡死了,这时候可以手动中止这个运行时间较长的程序。
- 和之前页面置换算法中的思路类似,利用过去的情况来预测某个进程的执行时间。 τ n + 1 = α t n + ( 1 − α ) τ n \tau_{n+1}=\alpha t_n+(1-\alpha)\tau_n τn+1=αtn+(1−α)τn, τ i \tau_i τi为第 i i i次的估计值
考虑到抢占系统中有些进程可能执行过一部分,这时可以将剩余时间(SRT)作为排序标准。
最高响应比优先(HRRN)
是短进程优先算法的改进,防止预估时间较长的进程长时间被抢占出现饥饿现象
选择就绪队列中响应比R值最高的进程:
R
=
w
+
s
s
R=\frac{w+s}{s}
R=sw+s
其中w为等待时间,s为预估执行时间
这个算法关注了等待时间,防止了长进程频繁被抢占和无限期推迟。
8.3.2 时间控制
以上是从进程排列来考虑的调度算法,我们也可以从时间资源分配入手。
时间片轮转算法(RR)
时间片是CPU基本时间调度单位。
时间片轮转算法(Round-Robin)就是基于FCFS结构的轮换处理的朴素时间调度算法。
基于FCFS给出的进程队列,操作系统给队头交替分配相应的处理器资源。如果执行完退出,没有执行完回到队尾。
时间片长度的确定非常重要:
- RR算法相对于FCFS会导致额外的上下文切换
- 时间片太大
- 等待时间过长
- 极限情况退化成FCFS
- 时间片太小
- 反应迅速,但产生上下文切换的开销
- 大量上下文切换影响到系统吞吐量
时间片长度在经验上维持上下文切换开销处于1%以内
大体上讲,不同时间片的长度对于总周转时间的影响并不是非常明显。不同时间片长度的RR会介于FCFS和SPN之间
多级反馈队列算法(MFQ)
多级队列调度算法(MQ):就绪队列被划分为多个独立的子队列,每个队列内都可以采用不同调度策略,队列间可以固定优先级也可以轮转。
在MQ中加入一定的反馈更新机制,就成为多级反馈队列算法MFQ。
如果一个时间片内没有执行完,就向下调整优先级。
这种情况下CPU密集型的进程优先级下降得很快,IO密集型的进程优先级更高。
公平共享调度算法(Fair Share Scheduling FSS)
一些用户组比其他用户组更重要。
保证不重要的组无法垄断资源:
- 未使用的资源按比例分配
- 没有达到资源使用率目标的组获得更高的优先级。
从而保证每个进程所占资源和其价值相对协调。
8.3.3 算法小结
FCFS:不公平,周转时间较长
SPN:周转时间短,需要精确预测时间,可能导致饥饿
HRRN:基于SPN,不可抢占
RR:公平,但周转时间较长
MFQ:多种算法的集成,设计较为复杂
FSS:公平是第一要素
8.4 实时调度和多处理器调度
8.4.1 实时调度
实时操作系统不仅要求功能正确,还要约定的时间得以保证。
时间约束的及时性和可预测性比速度、平均性能更重要。
要保证时间能极大概率满足一个具体要求。
几个概念:
-
实时任务:对时限有要求的任务
-
周期实时任务:一系列相似的规律重复的实时任务。由周期、最大执行时间、使用率等决定。波动越小,使用率就可以越高。
-
硬实时和软实时:硬实时必须要满足时限,可以保证系统的确定性,否则会导致严重后果;而软实时只需尽量满足,无法达成时可以降低要求。
-
可调度性:一个操作系统可以满足任务的时限要求。
- 需要确定实时任务的执行顺序
- 进行动态或静态的优先级调度
这里给出两个理论上可调度的实时调度算法,不要求掌握。
- 速率单调调度算法RM:通过周期安排优先级,周期越短越早安排。
- 最早截止时间优先算法EDF:截止时间越早优先级越高。
8.4.2 多处理器调度
多个处理器组成一个多处理器系统,处理器之间共享负载。
对称处理器调度:
- 各处理器都有自己的调度机制
- 访问共享资源时再进行同步
静态进程分配:对一个处理器,从一开始就确定其就绪队列,但可能出现忙闲不均。
动态进程分配:所有处理器共享一个公共就绪队列,各个处理器负载均衡,但调度开销大
8.5 优先级倒置
优先级倒置是我们不希望发生的一种调度状态。在该种状态下,一个高优先级任务间接被一个低优先级任务所抢先。
https://blog.csdn.net/maimang1001/article/details/7343045
这往往出现在一个高优先级任务等待访问一个被低优先级任务正在使用的临界资源时。
同时,该低优先级任务被一个次高优先级的任务所抢先,从而无法及时地释放该临界资源。从而阻塞了高优先级任务。如下图。
注:临界资源指一次只能被一个进程占用的资源,这些资源是互斥体。
为了保证这个互斥体资源不被次高级进程抢走,常见地,我们有如下两种策略:
优先级继承协议:占用资源的低优先级进程,继承申请资源的高优先级进程的优先级。
以下图为例,T1为优先级最高的进程,T3为最低。
t4之后为什么让T3先执行,就是使用了优先级继承的策略,让已经处于互斥体中、占有临界区资源的进程先运行。
从图中可以看出,如果t4之后资源s被次高级的T2所抢占,那么T1和T3还需要等很长时间。
注意,只有在占有资源的低优先级进程被阻塞时,才提高占有资源进程的优先级。如上图中的t3到t4之间发生的。
另一种方法是优先级天花板协议:占用资源进程的优先级,和所有可能申请该资源的进程的最高优先级相同。
- 不管是否发生等待,都提升占用资源进程的优先级
- 当任务执行临界区时就不会被阻塞
8.6 练习题
若当前进程因时间片用完而让出处理机时,该进程应转变为_________状态。(就绪)
最高响应比优先算法的特点是________。(有利于短作业又兼顾到长作业)
在单处理器的多进程系统中,进程什么时候占用处理器和能占用多长时间,取决于_________。(进程自身和进程调度策略)
下面关于硬时限(hard deadlines)和软时限(soft deadlines)的描述正确的有________:
- 如果错过了硬时限,将会发生严重的后果
- 如果软时限没有被满足,系统也可以继续运行
- 硬时限可以保证系统的确定性