什么是调度
协调请求对于资源的使用,所以有资源的地方就需要调度
I/O (磁盘)、打印机、内存、网络包
▲ 用于限制系统中真正被短期调度的进程数量
当一个程序尝试运行时,操作系统并不一定会立即为其创建对应进程并设置为就绪。(如果这样,那如果大量进程在短时间内被创建,会造成调度决策需要考虑的进程数量增加,调度开销变大)。要不要立即处理创建进程的决策,由长期调度负责。
当长期调度为某个程序创建进程并设置状态为就绪后,交由短期调度管理。
▲ 长期调度可以根据当前系统中的CPU、I/O利用率的情况选取合适的计算密集型或I/O密集型进程,交由短期调度管理,有效控制资源利用率。
▲中期调度考虑内存,避免内存使用过多
▲ 实际是换页机制的一部分
当系统中的进程已经占用了大量内存,中期调度会挂起系统中被短期调度管理的进程。
▲ 负责进程在就绪状态、运行状态、阻塞状态之间转换
优点:简单直观
缺点:在长短任务混合的场景下对短任务不友好
缺点:
- 必须预知任务运行时间
- 其表现严重依赖于任务到达时间点
- 不公平
- 平均响应时间长
- 每次任务执行
- 一定时间后会被切换到下一任务
- 而非执行至终止
- 通过定时触发的时钟中断实现
缺点:在任务运行时间相似的场景下平均周转时间高
- 维护多个优先级队列
- 高优先级的任务优先执行
- 同优先级内使用Round Robin调度
适合静态的应用场景,任务信息(任务大致运行时间,资源使用情况)可以在执行前获知。根据任务信息,可以生成对应的调度模型,并计算出每种任务合适的优先级
什么样的任务应该有高优先级
- I/O绑定的任务
- 为了更高的资源利用率
- 用户主动设置的重要任务
- 时延要求极高(必须在短时间内完成)的任务
- 等待时间过长的任务
- 为了公平性
解决方案:优先级继承
优先级和份额都表示了任务在系统中的重要程度,但目的不同。
优先级:
优先级的数值仅仅是用于比较优先级高低而存在,无法反映单位时间内一个任务可以占用的CPU时间比例。
优先级调度是为了优化的周转时间、响应时间和资源利用率而设计。不同任务的优先级只能用于相互比较,表明任务执行的先后。
份额:
基于份额的公平共享调度是为了让每个任务都能使用它应该获得的系统资源。
权重 与 优先 的异同
权重:影响任务对CPU的占用比例
- 永远不会有任务饿死
优先级影响任务对CPU的使用顺序
- 可能产生饿死
随机的利弊
好处:简单
问题:
- 不精确——伪随机非真随机
- 各个任务对CPU时间的占比会有误差
为了让虚拟时间短的任务能够追赶虚拟时间长的任务,调度策略一般选择虚拟时间最少的任务
实时任务会有一个明确的截止时间,根据任务超过截止时间的后果,分类:
- 硬实时任务
- 必须在截止时间前完成
- 如交通工具:超过截止时间 -> 严重后果
- 软实时任务
- 可以偶尔超过截止时间完成
- 如视频播放,每一帧的渲染:超过截止时间 -> 画质差
根据被触发的时间,分类:
- 周期任务
- 到达系统时间遵循一定周期的任务
- 偶发任务
- 不会周期地到达系统
- 连续两个相同偶发任务到达系统的时间间隔有最小值,即系统不会在同一时刻处理两个相同的偶发任务
- 偶发任务通常是硬实时任务
- 如刹车
- 非周期任务
- 到达系统随机的任务
- 非周期任务通常是软实时任务
- 如用户按下键盘
▲ 如果存在一种调度策略,使所有任务可以在截止时间前完成,那么U一定小于等于1
▲ 静态优先级实时调度策略
▲ 在所有基于静态优先级的实时调度策略中,RM策略是最优的
▲ 但是当任务的U ≤ 1 时,RM策略也不一定可以满足任务的截止时间要求
▲ 1/T 大的任务优先级高
根据任务截止时间动态分配任务
▲ U ≤ 1的充分必要条件时 EDF可以在任务的截止时间前完成任务
▲ 但是在U>1,是会出现多米诺效应
多米诺效应:
因为一个任务错过截止时间而导致大量后续任务级联地错过截止时间
优点
- 设计实现简单
- 不会出现CPU资源浪费的情况
缺点
- 多个核共享全局运行队列 -> 同步开销
- 任务在多个CPU之间来回切换的开销(缓存载入、TLB刷新)
目的:尽可能让一组任务并行执行
适用:1. 关联任务 2. 任务间有依赖
例子:并行计算,编译
将关联任务设置为一组(一个组内的关联任务都需要同时运行),以组为单位调度任务在多个CPU核心上运行
当一个任务被全局调度器分配到给定的CPU核心上时,将一直被该核心的本地调度器管理,不会迁移到其他的CPU核心上执行
如:linux,chcore