任务调度

在操作系统环境中,调度器只是决定在给定的时间点执行什么任务。通常,它是所有操作系统中最关键的组件之一。通常,通用操作系统和实时操作系统对调度决策有不同的偏好,因此针对这两种情况开发了多个调度器实现。在类别之间有这种区别是很重要的,因为设计目标完全不同。

在设计实时系统时,最合适的调度算法总是取决于具体情况。或许最简单但却有用的实时调度算法可以被认为是固定优先级的优先级调度算法,如实时调度原理 [6]所示。在这个调度方案中,每个任务在设计阶段都获得一个分配给它们的静态优先级。在系统操作期间,调度器只是保证当前任务始终具有最高的优先级。由于调度是抢占式的,这意味着即使正在执行某些任务的任务也可以被暂时中止,让另一个更高优先级的任务执行。

1. 实时调度原理 [6]

与前面提到的固定优先级的优先级调度算法相比,Linux调度器更复杂一些,但从根本上讲,它们处理实时任务的方式十分相似。Linux调度器实现了几种调度策略,可分为非实时调度组和实时调度组。普通应用程序通常使用其中一个非实时策略执行,并且它们的优先级始终低于使用任何实时策略运行的任务。Linux调度器支持三种不同的实时策略,它们可以分配给任何需要实时优先级的任务。

  • SCHED_FIFO:将执行使用此策略运行的任务,直到它完成并自动抢占,或者被一个优先级更高的任务抢占。
  • SCHED_RR:如果没有被高优先级任务抢占,任务在被抢占前只能在指定的时间片内以最高优先级运行。
  • SCHED_DEADLINE:是一种实现基于任务执行期限的调度算法的策略。

使用任何实时策略执行的所有任务都有一个静态实时优先级。对于SCHED_FIFOSCHED_RR策略,此优先级可以在1(低)和99(高)之间。具有SCHED_DEADLINE任务的有效优先级始终为100,具有最高的优先级。任何以较高优先级执行的任务都将总是优先于另一个具有较低优先级的任务。有了这些策略,就可以仔细设计一个实时系统的执行,以满足苛刻的定时要求。