1、任务状态及转换
AliOS Things是一款支持单处理器上运行多个任务的实时操作系统。对于多任务系统,在单个处理器上任意时刻只能有一个任务在运行,其他任务均处于非运行状态。所以这里可以简单的认为任务有两种状态:运行和非运行,如图1。
图1 任务状态和转换的顶层模型
当任务处于运行状态时,处理器被用来执行该任务的代码;当任务处于非运行状态时,其运行上下文被保存,并在下一次进入运行状态时被恢复执行。当任务恢复执行时,它会从上一次离开运行状态之前要执行的指令开始执行。那任务什么时候又是为什么发生非运行状态与运行状态之间的切换,主要依据系统的调度策略、可引起调度的系统事件以及特定的函数调用。
实时操作系统任务调度依赖于任务优先级,对于那些实时性要求比较高的任务被赋予高的优先级,一旦高优先级的任务准备就绪,系统就会将正在运行的低优先级任务换出,然后将处理器的执行权交给高优先级任务。而对于那些因为某种原因暂时不需要执行而处于非运行状态的任务,只有等到特定事件的发生才会被再次调度执行。所以可以将任务的非运行状态划分为两个子状态:就绪和挂起,如图2。
图2 任务状态和转换的基础模型
如图2所示,只有当任务处于就绪状态时,才能被系统调度进入运行状态;而处于运行状态的任务可以通过两种方式退出运行:挂起或被抢占。当任务执行完成或者因为某种原因不能继续运行(如等待一定时间段的延迟)则进入一种暂时停止运行的状态即挂起状态。当任务进入挂起状态,它释放处理器资源给其他任务。任务可以因为完成相应操作或自身程序产生信号来主动放弃处理器;任务也会因其他任务抢占、时间到期或系统事件被系统强制换出而被动的放弃处理器资源,任务放弃处理器资源的原因可以参见图3。
图3 任务挂起的原因
注意,对于工作还未完成被其他任务抢占被强行放弃处理器的任务,不会被挂起而是处于就绪状态,等待被系统再次调度。
结合上述任务挂起的原因分析可以得出任务状态的通用模型如图4所示,其中任务从挂起状态进入就绪状态的条件,包括事件、时间间隔到期、事件和时间间隔到期的组合。
图4 任务状态和转换的通用模型