您的位置:首页 > 产品设计 > UI/UE

uITRON之任务状态和任务调度

2016-01-16 14:59 435 查看
任务状态

调度规则

PS:初学iTRON, 错误之处敬请谅解

任务状态

uITRON的任务状态分为5大类. 阻塞状态(Blocked State)分为3个子状态. 运行状态(RUNNING)和就绪状态(READY)通常称为可运行状态.

(a) RUNNING state(运行状态)

当一个task处于RUNNING状态时, 这个task就是当前正在执行的task. 当任务无关部分代码执行时, 刚才正在执行的task保留在RUNNING状态.

(b) READY state(就绪状态)

当一个task (A)处于READY状态时, 就表示这个task (A)已经准备执行, 但是因为有更高优先权的任务正在执行,所以此时这个task (A)还不能运行. 换句话说,一旦这个task (A)比其他可运行状态的task优先权高时就可以执行了.

(C) Blocked state(阻塞状态)

当一个task处于Blocked状态时, 这个task不能执行, 因为这个task可以执行的必要条件还没有成立. 这个task正在等它能继续运行的必要条件. 当一个task进入阻塞状态, 包含这个task执行环境的寄存器、程序指针被保存. 当这个task从阻塞状态恢复到继续运行, 程序计数器、寄存器被恢复到原来的数值. 阻塞状态分为三个子状态:

WATTING state(等待状态)

当一个task处于WATTING状态, task的执行因为service call的调用而阻塞. service call指定的条件必须成立后task才能继续执行.

SUSPENDED state(悬挂状态)

当一个task处于SUSPENDED状态时, 这个task就已经被其他task强制暂停. 在uITRON4.0规格中, task自己也可以悬挂自己.

WATTING-SUSPENDED state(等待挂起状态)

当一个task处于WATTING-SUSPENDED状态, 这个task就是在等待”等待和挂起”的两个条件. 如果一个task处于等待状态, 如果又有一个请求请求这个task进入挂起状态, 那么这个task就进入了等待挂起状态.

(d) DORMANT state(睡眠状态)

当一个task处于睡眠状态, 这个task还没有执行或者已经执行完毕. 当task处于睡眠状态, 上下文信息将不不会保存. 当一个task从睡眠状态激活, 它就从task的开始处执行. 当task开始处理时, 寄存器的内容是不保证的.

(e) NON-EXISTENT state(不存在状态)

这是task不存在于系统中的一个虚拟状态, 这可能是因为task没有创建或者因为task已经删掉了.

依赖于不同的实现, 这可能有其他的不属于上面描述的过渡状态(请看3.5.6章).

如果一个高于RUNNING状态的task进入READY状态, 那个低优先级的task将要进入READY状态并且那个高优先级的task将要被调度进入RUNNING状态. 这种情况下, 我们说那个进入运行状态的task抢占了原来处于运行状态的task. 甚至如果一个service call的功能描述”一个task进入就绪(READY)状态”, 根据它的优先级可能直接进入RUNNING状态.

task激活意味着一个task从DORMANT状态进入READY状态. 除了DORMANT状态和NON-EXISTENT状态的其他状态都被广泛的称为活跃状态. task结束意味着一个激活状态的task进入DORMANT状态.

从WATTING状态释放一个task意味着”如果一个task处于WATTING状态,它将会进入READY状态; 如果一个task处于WATTING-SUSPENDED状态,它将会进入SUSPENDED状态”. 继续一个已经挂起的task意味着”如果一个task处于SUSPENDED状体, 它将会进入READY状态且如果一个task处于WATTING-SUSPENDED状态它将会进入WATTING状态”.

下图显示了一个task过渡的典型实现. 根据实现, 可能有其他没有列出的过渡状态.



[补充信息]:

WATTING状态和SUSPENDED状态都是独立的. 因此, 一个”请求一个task进入SUSPENDED状态”的请求不影响一个task的释放条件. 换句话说, 不管task是在WATTING状态或者WATTING-SUSPENDED状态, 那个task的等待释放条件都不会改变. 因此, 如果一个task正在等一个资源时被挂起将会进入等待挂起状态, 这个task依然在获取在等待状态下相同的资源的条件.

[原理]:

因为一个task可以在同时处于WATTING状态(自身挂起)和SUSPENDED状态(被其他task挂起), 所以iTRON规格区分出这两个状态. 定义一个叫WAITING-SUSPENDED的重叠状态使得task状态的过渡更清晰和service call更简单. 因为处于等待状态的task不能调用service call, task就永远不会超过一个种类的等待状态, 例如, 在等待一个信号量资源. task也许被其他多个task挂起多次.

调度规则

在ITRON规格中, 基于优先级的抢占式任务调度是基于分配给task的优先级管理的. 如果有一些相同优先级的task, 调度管理是基于先来先服务(FCFS)的原理.

task调度的规则是定义在如下描述的

如果多个可运行的task存在, 那么高优先权的task将会处于RUNNING状态, 没有运行的task处于READY状态. 在具有不同优先级的task中, 具有高优先级的task具有高的优先权. 在具有相同优先级的task中, 越早进入可运行状态(WATTING或READY)的task具有越高的优先权. 无论如何, 在具有相同优先级的task之间的优先权可以因为调用一些service call而改变.

当一个具有最高优先权的task的优先权改变了, 一次分派将会立即发生, 处于RUNNING状态的task将会切换到另外一个task. 无论如何, 当系统处于不能发生分派的状态时, 处于运行状态的task的切换将会一直等待到派发允许.

[实现的信息]

在ITRON规格中, 只要有高优先权的task处于可运行状态, 那么处于低优先权的task是不允许执行的. 除非高优先权的task因为一些原因不能执行其他task才能执行, 比如进入等待状态. 在这个方面, ITRON规格中的调度规则与TTS(Time-Sharing System)是完全不同的, TTS试图尽可能相等的处理多个task. 无论如何, 在相同优先级的task之间的优先权可能会通过service call改变. 应用程序能通过service call实现轮番调度, 这是一种典型的TTS调度.







图3-2显示了在相同优先级的task中, 首先进入可运行状态的task具有最高的优先权. 图3-2 (a) 显示在Task A(priority 1)后面的task间的优先权 Task E(priority 3)和Task B, C和D(priority 2)并且已经按照这种顺序激活了. Task A 有最高的优先权且处于运行状态.

当Task A结束, 具有第二优先权的Task B进入到RUNNING状态(图 3-2(b)). 如果Task A重新激活了, Task B将会被抢占并且进入READY状态. 尽管如此, 自从Task B早于Task C和Task D进入可运行状态, 它将会在这些相同优先级的task中具有最高的优先权. 这意味着task间的优先权将会回到图3-2-(a)中.

当Task B从可运行状态进入等待状态, task间的优先权将会从图3-2(b) 变为 3-2(c), 这是因为task间的优先权是基于可运行的task决定的. 如果Task B从WATTING中释放, Task B的优先权将会是相同优先级的task中最低的, 因为Task B在Task C和Task D之后变为可运行状态. 这个状态就是图3-2(d).

总的来说, 如果一个task从就绪状态进入运行状态然后又回到就绪状态, 它将具有相同优先级的task中最高的优先权. 另一方面, 当一个task从运行状态进入等待状态, 然后又回到就绪状态, 这个task将会具有相同优先级task间的最低优先权.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uITRON