一、处理机调度概念
进程切换(上下文切换):切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文
CPU调度:从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个线程/进程
调度程序:挑选进程/线程的内核函数(通过一切调度策略)使得效率最高,满足用户需求
在进程/线程的生命周期中的什么时候进行调度?
- 从一个状态变为另一个状态,特别是和运行(running)相关的状态。
- 内核运行调度程序的条件:进程从运行状态切换到等待状态or终结了(done)
- 不可抢占调度,调度必须等待事件/进程结束,早期OS。
- 现在多为可以抢占的进程,OS决定在何时打断进程,调度程序在中断被响应后执行,当前进程从运行切换到就绪,或者一个进程从等待切换到就绪,可以被换出。
针对的是用户态的进程。
进程在内核中通过系统调用执行,因为系统调用返回时是到发起这个调用的进程继续执行,所以内核中不会切换,抢占。只要进程在系统调用时不存在从运行态到阻塞态的变化,OS可以确保返回正常。
二、调度准则
1、处理机资源的使用模式
CPU的占用率是波状,CPU大量运算是高峰,而读写I/O时是平稳的低值。每个调度决定都是关于下一个CPU突发时将哪个工作交给CPU,在时间分片下,线程可能在结束当前CPU突发前被迫放弃CPU。
程序在CPU突发和I/O中交替,CPU占用率高说明是在充分地使用CPU。
2、比较调度算法的准则
- CPU使用率:CPU处于忙状态的时间百分比
- 吞吐量:单位时间内完成的进程数量
- 周转时间:一个进程从初始化到结束包括(所有等待时间)所花费的总时间,周转时间=等待时间+服务时间
- 等待时间:进程在就绪队列中的总时间,进程从就绪态到运行态的时间。
- 响应时间:一个请求被提交到第一次响应所花费的总时间
2、吞吐量与延迟
要求:希望更快的服务。什么是更快?
- 高带宽:吞吐量高 (传输文件)
- 低延迟:响应时间快(玩游戏)
3、调度算法的响应时间目标
- 减少响应时间:及时处理用户的输入请求,尽快发馈给用户
- 减少平均响应时间的波动:交互系统中,可预测性比高差异低平均更重要
- 低延迟调度改善用户的交互体验
- 响应时间是操作系统的计算延迟
4、调度策略的吞吐量目标
- 增加吞吐量:减少开销(操作系统开销,上下文切换) 、系统资源的高效利用(CPU,I/O设备)
- 减少等待时间
- 操作系统需要保证吞吐量不受用户交互的影响
5、处理机调度的公平性目标
- 公平的定义:保证每个进程占用相同的CPU时间;保证每个进程的等待时间相同
- 公平通常会增加平均响应时间
三、先来先服务、短进程优先和最高响应比优先调度算法
1、FCFS first come first served先来先服务算法
依据进程进入就绪状态的先后顺序排列
如果前面的进程运行的时间长,后面的进程就只能等着,导致周转时间慢。如果进程阻塞了,队列中的下一个会得到CPU
优点:简单
缺点:平均等待时间波动大,花费时间少的可能反而排在后面,可能导致CPU和I/O之间的重叠处理,没考虑抢占,CPU密集的进程导致I/O闲置时,I/O密集型进程也在等。
2、短进程优先算法
选择就绪队列中执行时间最短进程占用CPU进入运行状态,就绪队列按预期的执行时间来排序;
短进程优先算法具有最优平均周转时间
- 不可抢占:SJF、SPN
- 可抢占:ready queue中的第一个进程正在运行时,来了一个比它的预测完成时间还短的进程,SPT
优点:最小的平均等待时间和周转时间
缺点:可能导致长任务饥饿,不能保证公平;需要预知未来下一个进程的时间,比如询问用户,如果用户欺骗就杀死进程。
短进程优先算法的执行时间预估:根据执行历史看将来CPU突发的持续时间,递归展开
3、最高响应比优先算法(HRRN)
选择就绪队列中响应比R值最高的进程
- R=(w+s)/s
- w:等待时间(waiting time)
- s:执行时间(service time)
在短进程优先算法的基础上改进;不可抢占;关注进程的等待时间;防止无限期推迟。
四、时间轮转、多级反馈队列、公平共享调度算法和ucore调度框架
1、时间片轮换算法(RR)
时间片:分配处理机资源的基本时间单元
算法思路:用时间切片和抢占来轮流执行,强调了公平。在量子切片/时间切片的离散单元中分配处理器,时间片结束时切换到下一个准备好的进程
时间片长度
- 开销: 额外的上下文切换;
- 时间片太大则等待时间过长会退化成FCFS,
- 太小反应迅速但吞吐量由于大量的上下文切换开销受影响 ;
- 选择一个合适的时间片,经验是维持上下文切换开销处于1%以内,现在LINUX是千分之一秒
2、多级队列调度算法(MQ)
就绪队列分为多个相对独立的队列,每个队列拥有自己的调度策略。
队列间的调度:
- 固定优先级:先高优先级,再处理低优先级,可能导致饥饿
- 时间切片轮转:每个队列都得到一个确定的,调度其进程的CPU总时间,如80%给前台,20%给后台
3、多级反馈队列算法(MLFQ)
- 时间片大小随优先级增加而增加
- 若当前时间量子中没有完成就给当前任务则降到下一个优先级
进程调度先是I/O密集型,CPU密集型随着不断消耗时间片就下降到低的优先级,保证I/O密集型任务停留在高优先级
等待时间越长,优先级越高,服务时间越长优先级越低 ,能动态地根据进程的特征调整队列和调度
4、公平共享调度(FSS)
在用户级别实现公平共享
FFS 一些用户组比其他组更重要,保证不重要的组无法垄断资源,未使用的资源按照每个组所分配的资源的比例来分配,没有达到资源使用率目标的组获得更高的优先级
5、评价调度方法
确定性建模,对确定的工作量计算每个算法的表现
队列模型:用来处理随机工作负载的数学方法
实现/模拟:建立一个允许算法运行实际数据的系统,最灵活,一般性
五、实时调度和多处理器调度
1、实时调度
- 定义:正确性依赖于其时间和功能两方面的一种OS
- 性能指标:时间约束的及时性(deadlines),速度和平均性能相对不重要,
- 重点是时间约束的可预测性。
- 实时任务:任务/工作单元(一次计算,一次文件读取,一次信息传递等等)
- 任务属性:取得进展所需要的资源和实时参数
- 任务请求时间(release time):进程处于就绪态的时间
- 相对截止时间(relative deadline): 任务是间隔时间段完成,每个任务有个特定的时间,要在特定的时间段内完成
- 绝对截止时间(absolute deadline):最终的结束时间
周期任务:一系列相似的任务,有规律的重复
- 周期p=任务请求时间间隔 (0 < p)
- 执行时间e=最大执行时间,最大执行时间< p
- 使用率/利用率:U=e/p
2、类别
- 硬实时系统/强实时系统:如果某个任务没完成有严重后果,比须验证,在最坏情况下能够满足时限
- 软实时系统/弱实时系统:重要的进程优先级更高,要尽量完成,如看视频,帧数没控制好会掉帧。
3、实时调度算法
- 速率单调调度算法(RM):通过周期安排优先级,周期越短优先级越高,执行周期最短的任务;
- 最早截止时间优化算法(EDF):截止时间越早优先级越高,执行截止时间最早的任务
对于实时系统来说,有两种调度策略,一是静态调度策略,一个是动态调度策略。静态调度策略是指按照进程执行时间长短进行调度,执行时间短的先执行。动态调度策略是按照进程截止时间进行调度,截止时间越早的先执行。
4、多处理器调度
- 要考虑:1,任务来了,放在哪个CPU上执行?2,怎么考虑公平性?load balance负载平衡
- 多处理器的CPU调度更加复杂,多个相同的单处理器组成一个多处理器,优点是负载共享。对称多处理器(SMP),每个处理器运行自己的调度程序,需要在调度程序中同步
多处理机是指由多个处理机组成一个多处理机系统,处理机之间可以实现负载共享。其中每个处理器有自己的调度程序,调度程序对共享资源的访问需要进行同步。多处理机调度策略中最重要的一点是一个进程应该分配给哪一个处理机。静态进程分配是进程从开始到结束都分配到一个固定的处理机上执行,之后就是在每个处理机上的单处理机调度算法,但这会导致处理机利用率不均。动态进程分配则是一个进程可以分配到任意空闲处理机执行,所有处理机共享一个就绪队列,调度开销较大,但负载均衡。
六、优先级反置
优先级反置是指高优先级进程要请求的资源被低优先级进程占用而被阻塞,此时中优先级进程反而抢占了CPU导致高优先级进程始终无法运行。针对这一现象有两种解决方案:一是优先级继承,导致高优先级进程阻塞的低优先级进程会暂时继承高优先级进程的优先级,避免被中间优先级进程抢占;二是优先级天花板协议,占有资源的进程和所有可能申请该资源的进程的优先级比较,设置成其中最高优先级对应的优先级,这样就不会有进程阻止他使用这个资源,可能会出现优先级滥用的情况。