uITRON之任务状态和任务调度

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间的最低优先权.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值