3.4实时调度
3.4.1实现实时调度的基本条件
1、提供必要的信息
- 就绪时间:该任务成为就绪状态的时间。
- 开始截止时间或完成截止时间:只需知道一个。
- 处理时间:从开始执行到完成所需时间。
- 资源要求:任务执行时所需的一组资源。
- 优先级:根据任务性质赋予不同优先级。
2、系统处理能力强
假如系统中有m个周期性的硬实时任务,处理时间为Ci,周期时间表示为Pi;
- 则单机系统中必须满足条件:
∑( Ci / Pi )≤1 - 多处理机系统:
∑( Ci / Pi )≤N
3、采用抢占式调度机制
- 硬实时任务: 广泛采用抢占机制。
- 小的实时系统: 可采用非抢占调度机制(简化调度程序和对任务调度时所花费的系统开销)。
4、具有快速切换机制
- 对外部中断的快速响应能力。
- 快速的任务分派能力。
3.4.2实时调度算法的分类
可以按照不同方式对实时调度算法加以分类:
- 按照实时任务性质:
- 针对硬实时任务的调度算法
- 针对软实时任务的调度算法
- 按照调度方式:
- 非抢占式
- 抢占式
1、非抢占调度算法
-
非抢占式轮转调度算法:适用于要求不太严格的场合!
-
非抢占式优先调度算法:适用于要求较为严格的场合!
2、抢占式调度算法
-
基于时钟的抢占式优先权调度算法:
- 某高优先级任务到达后并不立即抢占,而等下一个时钟中断时抢占。
- 某高优先级任务到达后并不立即抢占,而等下一个时钟中断时抢占。
-
立即抢占的优先权调度算法:
- 一旦出现外部中断,只要当前任务未处于临界区,就立即抢占处理机。
- 一旦出现外部中断,只要当前任务未处于临界区,就立即抢占处理机。
3.4.3最早截至时间优先算法EDF(Earliest Deadline First)
- 该算法是根据任务的截止时间确定任务的优先级;
- 具有最早截止时间的任务排在队列的前面。
1.非抢占式调度方式用于非周期性实时任务
2.抢占式用于周期性实时任务
- 假如在一个实时系统中,有两个周期性实时任务A和B;
- 任务A要求每20ms执行一次,执行时间为10ms;
- 任务B要求每50ms执行一次,执行时间为25ms。
- 计算是否可调度
10/20+25/50=1, 可调度!
- 采用最早截至时间优先调度过程
与固定优先级算法对比:
3.4.4最低松弛度优先LLF(Least Laxity First)算法
- 最短空闲时间优先;
- 用松弛度来表示任务紧急程度;
- 松弛度=完成截止时间-运行时间-当前时间;
- 例如,任务A在200ms时必须完成,本身运行时间100ms,则必须在100ms之前调度执行,A任务的紧急(松弛)程度为100ms;
任务B在400ms时必须完成,需运行150ms,其松弛程度为250ms。
- 例如,任务A在200ms时必须完成,本身运行时间100ms,则必须在100ms之前调度执行,A任务的紧急(松弛)程度为100ms;
- 该算法主要用于可抢占调度方式中。
- 假如在一个实时系统中,有两个周期性实时任务A,B,任务A要求每20ms执行一次,执行时间为10ms;任务B要求每50ms执行一次,执行时间为25ms;
由此可得知AB任务每次必须完成的时间分别为A1、A2、A3…和B1、B2、B3…如下图:
采用最低松弛度优先
3.4.5优先级倒置
1.优先级倒置的形成
- ★ “优先级倒置”的现象
高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。 - ★例子
- 有三个完全独立的进程P1、P2和P3,P1的优先级最高,P2次之,P3最低。
- P1和P3通过共享的一个临界资源进行交互。下面是一段代码:
P1: …P(mutex); CS-1; V(mutex);…
P2: … program2…;
P3: …P(mutex); CS-3; V(mutex) ;…
2.优先级倒置的解决方法
一种简单的解决方法-中断禁止:
- 假如进程P3在进入临界区后,P3所占用的处理机就不允许被抢占。
- 如果系统中的临界区都较短且不多,该方法是可行的。
- 反之,如果P3临界区非常长,则高优先级进程P1仍会等待很长的时间,其效果是无法令人满意的。
- 还要防止P3在临界区出现死循环。
一个比较实用的解决方法-优先级继承
- 当高优先级进程P1要进入临界区使用临界资源R时,如果已有一个低优先级进程P3正在使用该资源;
- 此时一方面P1被阻塞,另一方面由P3继承P1的优先级,并一直保持到P3退出临界区。