8.1背景
1、上下文切换:
- 切换CPU的当前任务,从一个进程/线程到另一个
- 保存当前进程/线程在PCB/TCP中的执行上下文(CPU状态)
- 读取下一个进程/线程的上下文
2、CPU调度
从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程
调度程序:挑选进程/线程的内核函数(通过一些调度策略)
什么时候进程调度?调度算法实现
问题:在进程/线程的生命周期中的什么时候进行调度?
3、内核运行调度程序的条件(满足一条即可)
1)一个进程从运行状态切换到等待状态
2)一个进程被终结了
4、是否可以抢占
不可抢占:
- 调度程序必须等待事情结束
可以抢占:(常用,针对用户态的)
- 调度程序在中断被响应后执行
- 当前的进程从运行切换到就绪,或者一个进程从等待切换到就绪
- 当前运行的进程可以被换出
抢占使得系统程序更加的灵活和高效。
8.2调度原则
根据什么原则去选择一个进程去执行,这个就是调度的原则
1、执行模型
程序在CPU突发和I/O中交替
- 每个调度决定都是关于在下一个CPU突发时将哪个动作交给CPU
- 在时间分片机制下,线程可能在结束当前CPU突发前被迫放弃CPU
2、评价的指标
1)CPU利用率:CPU处于忙碌状态所占时间的百分比
- cpu利用率越高,可以认为当前系统的效率比较好。进程调度进行得好。
2)吞吐量:在单位时间内完成的进程数量
- 吞吐量越高,说明进程的效率越好。当然希望当操作系统跑一堆进程时,吞吐率都很高。
3)周转时间:一个进程从初始化到结束,包括所有等待时间所花费的时间。
- 周转时间越断越好。
4)等待时间:进程在就绪队列中的总时间
- 指的是出于就绪态的时间越短,就越快被cpu执行
5)响应时间:从一个请求被提交到产生第一次响应所花费的总时间
- 同样也是越短越好
以上可以对cpu调度的指标有一个分析。
人们通常都需要“更快”的服务
什么是更快:
- 传输文件时的高带宽
- 玩游戏时的低延迟
- 这两个因素是独立的
和水管类比:
- 低延迟:喝水的时候想要一代开水龙头水就流出来
- 高带宽:给游泳池充水时希望从水龙头里同时流出大量的水,并且不介意是否存在延迟
3、算法需达到的效果
1)减少响应时间
及时处理用户的输出并且尽快将输出提供给用户
2)减少平均响应时间的波动
在交互系统中,可虞可预测性比高差异低平均更重要
3)增加吞吐量–两个方面
减少开销(操作系统开销,上下文切换)
系统资源的高效利用(CPU,I/O设备)
4)减少等待时间
减少每个进程的等待时间
其实很难满足以上的全部效果,只能泽中或者在特定场合中选择某种特定效果。
4、公平性
公平的定义:
- 保证每个进程都占用相同的cpu时间
- 保证每个进程都等待相同的时间
- 公平通常会增加平均响应时间
8.3调度算法
调度算法有三类:
1)通常操作系统设计的基本调度算法
2)嵌入式设备实时的调度算法
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 (公平共享调度)
二、先来先服务调度(FCFS)
如图所示,如果前面的进程越长,后面的进程等待的时间就越长,从而会影响整个系统的周转时间。
优点:
简单
缺点:
1)平均等待时间波动较大,平均的周转时间也会比较大
2)花费时间少的任务可能排在花费时间长的任务后面,没有考虑抢占
3)可能导致I/O和CPU之间的重叠处理(cpu密集型进程会导致I/O设备闲置时,I/O密集型进程也在等待)
三、短任务优先算法
当一个更短时间进程来了之后,有两种策略:
1)不理,将这个时间更短的程序排在前面,但是继续执行本来在执行的进程,这种是非抢占性的。(SPN)
2)将这个时间更短的程序与正在执行的程序剩余所需要执行的时间进行比较,如果跟多,这打断正在执行的程序,这种是可抢占的。(SRT)
优点:
平均等待时间最短
缺点:
1)可能导致饥饿
- 连续的短任务流会使长任务饥饿
- 短时间可用时的任何长任务的CPU时间都会增加平均等待时间
2)需要预知未来
- 怎么预估下一个CPU突发的持续时间
- 简单的解决方法:询问用户
- 如果用户欺骗就杀死进程
- 如果用户不知道就采用预估方法
根据过去,预测未来,大致的预测方法如下:
结果大致的相同
四、最高响应比优先算法
在SPN调度的基础上改进
R值越高表示等待的时间越长,就会优先的调度这种进程。
优点:
充分的考虑到了进程的等待时间,所有之前的饥饿现象会得到有效的化解。
缺点:
1)不可抢占
2)依然需要知道执行的时间是多长,所以还是要预估
五、轮循算法
各个cpu轮流占用cpu去执行,在叫做量子(或时间切片)的离散单元中分配处理器,时间片结束后,切换到下一个准备好的进程。
每一个进程都有机会去被cpu执行
例子:
可见,轮流算法的平均等待时间是比较大的。
特点:
1)会比较到的切换时间,进程上下文的切换,确保公平
2)时间片太大(有可能退化为先来先服务)
- 等待时间过长
- 极限情况退化成FCFS
3)时间片太小(切换过于频繁)
- 吞吐量由于大量的上下文切换开销收到影响
目标:
- 选择一个合适的时间量子
- 经验规则:维持上下文切换开销处于1%以内,这样的情况下99%的时间都是在
进程的执行过程中
与先来先服务算法 进行比较:
六、多级反馈队列
首先完成高优先级的进程,待其完成了所以的任务之后,再去完成第优先级的进程,这样通过分层不同级别的队列,可以实现调度的区分,使得调度的策略更加的合适。
而且进程在不同阶段的特点是不同的,所以调度算法可以考虑到进程各阶段的特点来调整其在队列中的级别。这个就是多级反馈队列可以体现。
特点:
1)时间量子大小随优先级级别增加而增加
2)如果任务在当前的时间量子中没有完成,则降到下一个优先级
3)能够区分进程在动态执行过程中动态的调整进程优先级,使得IO密集型的任务可以很快的执行,而CPU密集型的任务放在优先级较低位置。
七、公平共享调度
FFS控制用户对系统资源的访问
- 一些用户组比其他组更重要
- 保证不重要的组无法垄断资源
- 未使用的资源按照每个组所分配的资源比例来分配
- 没有达到资源使用率目标的组获得更高的优先级
八、小结
1)FCFS先来先服务
- 不公平,平均等待时间较差
2)SPN/SRT段进程优先
- 不公平,但是平均等待时间最小
- 需要精确预测计算时间
- 可能导致饥饿
3)HRRN最好响应比优先
- 基于SPN调度改进(考虑了等待时间)
- 不可抢占
4)Round Robin轮循
- 公平,但是平均等待时间较差
- 每一个进程有固定的时间片,但是上下文开销较大
5)MLFQ舵机反馈对列
- 和SPN类似
- 动态调整进程优先级
6)公平共享调度
- 公平是第一要素
8.4实时调度
面向的是实时的系统,更多的是工业控制(火车,机床等等)
1、定义
正确性依赖于其时间和功能两个方面的一种操作系统
2、性能指标
1)时间约束的及时性(deadlines)
2)速度和平均性能相对不重要
3、主要特征
时间约束的可预测性
4、分类
1)强实时系统
需要在保证的时间内完成重要的任务,必须完成
2)弱实时系统
要求重要的进程的优先级更高,尽量完成,并非必须
Released :让进程处于就绪态的时间
Execution time:执行时间
Absolute deadline:绝对的截止时间,任务的执行不可以操作这个时间
Relative deadline:相对截止时间,因为任务是间隔的,一段时间完成一个任务
(周期是5,执行的时间就是蓝色的区域)
5、特点
硬时限:
- 如果错过了最后的期限,可能会发生灾难性或非常严重的后果
- 必须验证:在最坏的情况下也能够满足时限
- 保证确定性
软时限:
- 理想情况下,时限应该被最大满足。如果有时限没有被满足,那么就相应地降低要求
- 尽量大努力去保证
表示一个实时系统是否能够满足deadline要求
- 决定实时任务执行的顺序
- 静态优先级调度
- 动态优先级调度
6、实时系统中的两类调度算法:
1)RM(Rate Monotonic)速率单调调度
- 最接静态优先级调度
- 通过周期安排优先级
- 周期越短优先级越高
- 执行周期最短的任务
2)EDF(Earliest Deadline First)最早期限调度
- 最佳的动态优先级调度
- Deadline越早优先级越高
- 执行Deadline最早的任务
8.5多处理器调度与优先级反转
一、多处理器调度
1、多处理器的cpu调度更加复杂
- 多个相同的单处理器组成一个多处理器
- 负载平衡状态
2、对称多处理器(SMP)
- 每个处理器运行自己的调度程序
- 需要在调度程序中同步
二、优先级反转
出现的原因:
T1的执行时间受制于T2的执行时间,因为T2抢占了T3的cpu时间去执行,而T1的执行有必须等待T3处理完共享内容,所以T1的执行时间被T2延长了。从而导致T1不能及时的完成其任务,导致系统处于不稳定状态而重启。
特点:
可以发生在任何基于优先级的可抢占的调度机制中。
当系统内的环境强制性使高优先级任务等待低优先级任务时发生。
解决方法:
1、优先级继承(将问题发生时,提升T3的优先级)
低优先级继承高优先级任务的优先级依赖于他们共享的资源
2、天花板优先级
1)“资源”的优先级和“所有可以锁定该资源的任务中优先级最高的那个任务”的优先级相同。
2)除非优先级高于系统中所有被锁定的资源的优先级上限,否则任务尝试执行临界区的时候会被阻塞
3)持有最高优先级上限信号量锁的任务,会继承被该锁所阻塞的任务的优先级