调度器简要说明
概述
对于简单的超级循环结构,它的主要优点为:
- 简单,易于理解
- 几乎不占用系统存储器或CPU资源
然而,“没有投入也就没有回报”,超级循环占用很少的存储器和处理器资源是因为它几乎不为开发人员提供什么功能,同时这种结构,很难在精确的时间间隔内执行任务X,正如我们所看到的,这种限制是一个很大的缺点。
解决这个问题的更好方案是使用基于定时器的中断,在一定的时间内调用函数,基于定时器的中断和中断服务函数。
什么是调度器
可以从两种角度来看调度器:
- 一方面,调度器可以看作是一个简单的操作系统,允许以周期或者单次方式来调用任务。
- 从底层的角度来看,调度器可以看作一个有许多不同任务共享的定时器中断服务程序。
调度器,应该是 RTOS 的灵魂。如果没有调度器,RTOS 就不能算作实时操作系统,只能算作是一个只能像流水线一样执行任务的系统,没有分出 “轻重缓急”。而有了调度器,就能让操作系统根据线程的优先级来处理问题。简单来说,调度器就是使用相关的调度算法来决定当前需要指定的任务。
调度器的分类
调度器大致分为两大类:
- 合作式调度器
- 抢占式调度器
以下是两种调度器的特性:
合作式调度器
合作式调度器
- 合作式调度器提供了一种单任务的系统结构
操作:
- 任务在特定的时刻被调度运行(以周期性或单次方式)
- 当任务需要运行时,被添加到等待队列
- 当CPU空闲时,运行等待任务中的下一个(如果有的话)
- 任务运行直到完成,然后由调度器来控制实现
实现:
- 这种调度器很简单,用少量代码即可实现
- 该调度器必须一次只为一个任务分配存储器
- 该调度器通常完全由高级语言(比如“C”)实现
- 该调度器不是一种独立的系统,它是开发人员的代码的一部分
性能:
- 设计阶段需要小心以快速响应外部事件
可靠性和安全性:
- 合作式调度简单、可预测、可靠并且安全
抢占式调度器
抢占式调度器
- 抢占式调度器提供了一种多任务的系统结构
操作:
- 任务在特定的时刻被调度运行(以周期性或单次方式)
- 当任务需要运行时,被添加到等待队列
- 等待的任务(如果有的话)运行一段固定的时间,如果没有完成,将被暂停并放回到等待队列。然后下一个等待任务将运行一段固定的时间,诸如此类等等
实现:
- 这种调度器相对复杂,因为必须实现诸如信号灯这样的特性,用来在“并行处理的”任务试图访问共用的资源时避免冲突
- 该调度器必须为抢占任务的所有中间状态分配存储器
- 该调度器通常将(至少是部分的)由汇编语言编写
- 该调度器通常作为一个独立的系统被创建
性能:
- 对外部事件的响应速度快
可靠性和安全性:
- 与合作式调度相比,通常认为其更不可预测,并且可靠性较低
混合式调度器
混合式调度器,合作式调度器变种
- 混合式调度器提供了有限的多任务功能
操作:
- 支持多个合作式调度的任务
- 支持一个抢占式任务(可以中断合作式任务)
实现:
- 这种调度器很简单,用少量代码即可实现
- 该调度器必须一次为两个任务分配存储器
- 该调度器通常完全由高级语言(比如“C”)实现
- 该调度器不是一种独立的系统,它是开发人员的代码的一部分
性能:
- 对外部事件的响应速度快
可靠性和安全性:
- 只要小心设计,可以和单纯的合作式调度器一样可靠
调度器安全性介绍
合作式调度器不但可靠而且可预测的主要原因是在任一时刻只有一个任务是活动的。这个任务运行直到完成,然后由调度器来控制。与此相对,在完全的抢占式系统的情况下,有多个活动任务。在这样的系统中,假设有一个任务正在从端口读取时,调度器执行了“上下文切换”,使另一个任务访问同一个端口。在这种情况下,如果不采取措施阻止这种操作,数据将可能丢失或被破坏。
这个问题往往出现在多任务处理平台中的所谓”关键段“,这种关键段是那种一旦开始就必须不中断的运行直至完成的代码区。如修改和读取变量,与外设相关的接口,调用公用函数的代码。
在合作式系统中,这些问题不会出现,因为任何时刻都只有一个任务是活动的。而在抢占式系统中,处理这样的关键代码段主要有两种可行的方法:
- 在进入关键段之前通过禁止调度器来“暂停”调度,关闭中断响应,当离开关键段的时候重新打开调度器。
- 使用锁(或者信号量)来实现类似的效果,访问的时候就加锁,其他任务等待解锁再进行访问。
调度器选择
合作式调度器是由任务主动地放弃 CPU 控制权来实现的调度。这种调度器可以在每个任务之间提供一定的协调和均衡,并避免把太多的资源分配给一个单一任务。它的主要优势是,在所有任务协作良好的情况下,可以提供更高的系统性能,并且可以减少任务之间的竞争与数据冲突,因为任务只有在完成本来需要完成的任务后才会主动让出CPU控制权,因而它对于低延迟,对CPU资源能接受一定损失和对分布式实时任务往往更受欢迎。
抢占式调度器则是基于特定的中断优先级和任务优先级的,而不是由任务主动放弃 CPU 控制权。因此这种调度器可以在任务中断发生时即刻暂停当前任务,转而执行更高优先级的任务。它的主要优势是能保证高优先级任务的及时处理,它通常用于多个任务同时被执行,并且需要在规定时间内处理高优先级任务的应用场景,如自动驾驶汽车以及机场控制塔等领域。
两种调度器各有优劣,因此在不同的应用场景中需要根据实际需要进行选择。例如,当需要实时控制的任务需要协作完成时,合作式调度器更为适用,而当需要快速响应并处理多个高优先级任务时,抢占式调度器更为适用。
总之,合作式调度器更适合具有协作特性的应用程序,而抢占式调度器则更适合对时间敏感的任务,如对单一任务处理的稳定性要求高、需要实时响应的领域。实时操作系统的调度器是根据实际需求和应用场景来选择,优势和限制各不相同,在实际应用中需要进行权衡和选择。
参考:
《时间触发嵌入式系统设计模式 8051系列微控制器开发可靠应用》
chatGPT