1、全抢占式调度
完全抢占式调度是指当前正在运行的任务可以根据操作系统预先设定的触发条件的出现,在任何指令下重新调度。当优先级更高的任务准备就绪时,完全抢占式调度将使正在运行的任务进入就绪状态。保存任务上下文,以便被抢占的任务可以在它被抢占的位置继续执行。
完全抢占式调度的延迟时间与低优先级任务的运行时间无关。某些限制与节省上下文所需的(RAM)内存空间的增加,以及任务之间同步所需特性的复杂性的增强有关。由于理论上每个任务都可以在任何位置重新调度,因此与其他任务联合使用的数据访问应该是同步的。
如下图,优先级低的T2任务不延迟优先级高的T1任务的调度。
在完全抢占式系统的情况下,用户应该不断期望正在运行的任务被抢占。如果任务片段不被抢占,可以通过系统服务GetResource临时阻塞调度器来实现。
综上所述,在以下所有情况下都要进行重新调度:
- 任务成功终止
- 通过显式激活后继任务成功终止任务
- 任务级任务激活
- 如果发生了进入等待状态的转换,则调用显式等待
- 将事件设置为任务级别的等待任务
- 任务级资源释放
- 从中断级返回到任务级
在中断服务过程中,不进行重调度
使用“全抢占式调度”调度策略的应用不需要系统服务Schedule,其他调度策略使用该系统服务。为了使可移植的应用程序能够在不同的调度策略下编写,用户可以在他/她承担正确的CPU分配的位置,通过系统服务Schedule强制重新调度。
2、非抢占式调度
如果任务切换只通过显式定义的系统服务(显式重新调度点)中的一个执行,那么调度策略被描述为非抢占。
非抢占式调度对任务可能的时间要求施加了特殊的限制。具体地说,运行中的低优先级任务的不可抢占部分将高优先级任务的开始延迟到下一个重调度点。
优先级较低的T2任务将优先级较高的T1任务延迟到下一个重调度点(此时T2任务终止)。
在不可抢占任务的情况下,重新调度将在下面这些case下进行:
- 任务成功终止
- 通过显式激活后继任务成功终止任务
- 显式调用scheduler
- 转换到等待状态发生
非抢占式系统的实现可能规定导致重调度的操作系统服务只能在最高的任务程序级别(而不是在任务子函数中)被调用。
3、Tasks
操作系统允许任务通过定义任务组来组合优先调度和非优先调度的各个方面。对于与组内最高优先级相同或更低优先级的任务,组内任务的行为类似于不可抢占的任务;重调度只会在上述描述的重调度点发生。对于优先级高于组内最高优先级的任务,组内任务的行为类似于可抢占任务。
非抢占任务是内部资源概念最常见的用法;它们是具有特殊内部资源的任务,分配的任务优先级最高。
4、混合抢占式调度
如果可抢占任务和不可抢占任务在同一系统上混合使用,产生的策略称为“混合抢占”调度。在这种情况下,调度策略取决于正在运行的任务的抢占属性。如果正在运行的任务是非抢占式的,则执行非抢占式调度。如果正在运行的任务是可抢占的,则执行抢占调度。
非抢占任务的定义在完全抢占的操作系统中是有意义的
- 如果任务的执行时间与任务切换的时间相同
- 如果RAM被用来提供空间来保存任务上下文
- 如果任务不被抢占。
许多应用程序只包含几个执行时间较长的并行任务,对于这些任务,完全抢占式的调度会比较方便,而许多执行时间较短的任务,非抢占式的调度会更有效。
对于这种配置,混合抢占式调度策略是一种折中。
5、选择调度策略
通过配置任务优先级和将可抢占性作为任务属性来确定任务的执行顺序。
任务类型(basic or extended)独立于任务的调度类型(preemptable or non preemptable)。因此,一个全抢占式系统可能含有basic tasks,非抢占式系统含有exetended tasks。
如果操作系统服务正在运行,抢占和上下文切换可能被延迟直到服务完成。