免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1827 | 回复: 0
打印 上一主题 下一主题

[新手入门] 嵌入式操作系统(译文) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-09 17:58 |只看该作者 |倒序浏览
译文:
任务模型
这一部分描述在一个实时操作系统中任务的编模方式
在一个RTOS中,一个课题被分成几个部分,每一个部分根据他们对实时性的需求被执行。每一个部分可以被当作一个任务,如图三所示
因为实时的需要,这些任务需要并发处理。一个序列性的处理方法不能满足他们对实时性的需求。然而,如果没有RTOS,并发的任务处理将会需要多CPU。然而,在RTOS当中,只要CPU能力足够满足应用需要,我们就只需要一颗CPU来进行并发的任务处理。
为了处理好任务之间对处理器需求的兑争关系,我们用task-state模型定义在系统运行期间内任何一个时间点的任务状态。它同时也描述了什么时候因为什么原因哪一个任务的状态发生了变化(任务状态变迁)。任何RTOSf都会定义这样一个task-state模型。
示例,OSEK/VDX OS的task-state模型如图4所示。对每一个任务而言,这个模型定义了三个主要的状态和一个可选的状态。
我们在图4中看到任务有如下4种状态:
Suspended 这是系统启动后的默认状态。在这种状态下,任务为inactive。通过RTOS的激活,任务状态可以过渡为Ready.
Ready 任务在这种状态下是活动的并且等待进入Running状态。我们用RTOS的scheduler来决定在什么时候将处于Ready的任务过渡到Running状态,我们也用Scheduler来决定是否将任务变回到Ready状态,这取决于RTOS固有的算法以及其他任务的状态。
Runnig- 在这种状态下任务得到了CPU时间来执行它的指令。在同一个时间点,只有一个任务能够处于这种状态。我们用RTOS的一个Function来将这种状态下的任务变回Suspended状态,这样任务就停止执行并且deactivated.我们用另一个RTOS的Function来这种状态下的任务变到Waiting状态,这时任务同样停止了执行,但是保持活动状态。
Waiting – 在这种状态下的任务在event(RTOS的另外一个service)进行等待。如果这个event被设置了的话,任务就变回Ready状态。这是OSEK/VDX OS中任务的一个可选状态。
任务调度
为了有效地协同不同任务在竞争处理器时的关系,我们用scheduler来决定处理器在什么时候执行什么任务。
Scheduler在处理任务之间关系时,有两种策略:preemptive(和cooperative。在一个preemptive系统中,一个任务在它的执行时间里被赋予了优先权,这意味着scheduler能够根据系统所处的阶段将处理器分配给其他的任务。对于需要长执行时间的任务来说,赋予优先权是一个非常好的方法;重要性更高的任务将比重要性低的任务更有效地利用处理器。
在一个cooperative系统中,每一个任务在它的执行时间里独占CPU。除非任务自动放弃对处理器的控制,否则任务间的切换不会出现。
有两种基本的调度方式:静态调度(根据时间来进行调度),和动态调度(根据事件来调度)。在静态调度方式下,提前定义了任务的执行顺序。在动态调度的方式下,一个任务在运行其间是否被执行由系统状态来决定。Scheduler(调度器)根据当前的任务状态进行调整。在动态调度方式下,只有当存在实际需要时(出现一个外部事件),处理器才执行任务,处理器的能力将得到更有效的利用(这与静态调度方式无关)。
可能的调度方式
有许多不同的任务调度方法。在这部分中我们将看到三个通常用到: priority control(优先权控制法),time slice(时间片法),FIFO(first in first out,先来先出法?)。多种方法可以组合到一个操作系统中。
在一个priority-controlled scheduler(优先权控制调度器)中,OS根据每一个任务的重要程度赋予它一个优先级。开发者可以利用优先级来控制一个任务执行的速度和频率。这意味着拥有更高优先权的任务将被更快的执行完毕。可能有这样一种实施方式,所有任务位于不同优先级的队列中(在同一个队列中的任务拥有同样的优先权)。
当所有拥有更高优先权的队例为空(被调度执行完毕),特定队例中位于前面的任务将被调度执行。在同一个优先权队列内部,任务同样需要调度。因为优先权相等,需要某种其他的机制来决定不同任务的先后调度顺序。比如说FIFO(先来先出)或者其他技巧。具有代表意义的是,优先权控制法一般与动态调度结合在一起,执行顺序非静态;和preemptive调度结合以允许拥有更高优先权的任务优先执行。
Time slice(时间片法,also known as ROUND ROBIN)是另外一种调度方法。一个小的时间单元,我们称之为时间片或时间量,被定义用来执行任务。一个最简单的情况就是所有的时间片拥有同样的时间长度,不过他们也可以拥有不同的长度。所有将被执行的任务列成一个环形的队列,新激活的任务被添加到这个环形队列的尾部。
CPU调度器浏览整个队列,为每一个任务分配时间片。对于任务而言,时间片末端点是一个期限,任务将被终止或暂时停止,在队列结束该任务的下一个时间片继续执行直至结束。如果任务在时间片结束前完成,那么它将会主动释放掉处理器。
在这两种情况中,CPU调度器将处理器分配给队列中的下一个任务。当同时出现多个拥有同样优先级的任务竞争使用CPU时,经常要用到时间片法。时间片法是最简单的,也是应用得最广的CPU调度算法之一,但是这种调度方法并没有以一种最有效的方法来利用CPU能力。因为当一个任务在时间片末端点之前结束的话,在下一个任务执行之前,CPU总是处理空闲状态。
FIFO(firsr come first server,先来先服务)排序法是最基本的队列调度原则。在FIFO排序法中,所有的任务被平等的置于一个队列中。他们按照在队列中的顺序被执行。在复杂程度较低或对顺序性要求较高的系统中,这是一种非常简单而合适的调度机制。
OSEK/VDX OS的一个基于优先权和动态调度的例子如下所示:
软件开发人员通过任务优先权和事先选择好的调度机制来决定任务的执行顺序。只被激活的任务才进行Ready状态并且进入拥有一定优先权的队列。图5说明了在调度器根据优先权以及激活顺序定义好了执行顺序以后,一个处理器是如何执行这一系列任务的。(在OSEK/VDX OS中,任务既可能是preemptive,也可能是cooperative的,这取决于任务自身的设置)
RTOS基础:同步资源访问
RTOS通常会定义一个资源管理方法以协调不同任务对资源的访问。我们这里所说的资源,包括硬件资源,比如内存,I/O端口,和软件资源,比如全局函数的全局变量。
在RTOS中,资源对所有任务而言都是可以访问的,但是显而易见的,我们必须注意不同的任务不能在访问同一种资源时产生冲突。在preemptive系统中,任务可以在访问资源时抢先。当这种情况发生时,其他任务可能同时在访问同样的资源,这样,一种不一致的状态就出现了,因为其他任务还没有完成对资源的访问。
在preemptive系统中,资源管理器通过同步任务以阻止这种情况下对资源的并发访问。
就像任务调度一样,RTOS拥有一些资源控制协议。在这一部分中,我们讨论三个比较常见的:旗语协议(semaphore),优先权限制协议,最高锁定者优先权协议
旗语协议
通过旗语标记的方法,某一个任务在使用某资源时就会对该资源设置一个标记,表示该资源正在使用。只有某一资源没有被其他任务占用时,它才可能被某任务获得。在一个简单有效的控制系统中,它不会出现我们已经知道的某一些典型问题。旗语协议的问题就是优先权颠倒,以及死锁。
优先权颠倒就是一个更高优先权的任务没有在它应当运行时执行,相反,执行了一个一个较低优先权的任务。图6演 示了优先权颠倒的问题:当一个拥有更高优先权的任务(任务3)不得不等待被抢先运行拥有较低优先权的任务1占有的资源时,这种优先权颠倒的情况就发生了。
某一个优先权介于任务1 和任务3 之间任务在这其间有机会执行。任务2在执行时,任务1 没能够释放任务3急需的资源。这种情况只有在任务2结束时才能够解决。但是这就意味着任务2在具有比它更高优先权的人任务3之前运行(优先权倒置)
旗语协议同时也有可能导致死锁。假定两个任务必须用到两个资源,它们用不同的顺序锁定这两个资源。任务A用标志S1锁定第一个资源。接着,和正常的情况一样,任务B正在运行并用标志2锁定了第二个资源。任务B需要用到第一个资源,然而它已经被任务A锁定了。
任务B所能做的就是将对处理器的控制权传给任务A,然后任务A试图访问第二个资源。但是失败了,因为任务B锁定它了。于是任务A重新将处理器控制权传给任务B,但是任务B同样不能执行,于是处理器控制权又被传给任务A,就这样陷入死循环。这两个任务被锁死了,因为它们在同时等待被对方锁定的资源。图7演示了这种情况:

优先权限制协议
在优先权限制协议中,每个资源有自己优先权限制。该优先权限制等于可以访问该资源的所有任务中所拥有的最高优先权。任务在访问该资源过程中,将会获得该资源所具有优先权,访问完毕以后,恢复原有的优先权。所有优先权低于资源优先权限制的任务都不可能优先占有该资源,因此,所有其他试图访问某资源的任务都不能优先占有该资源。优先占有的情况只有在某一任务对该资源的访问结束,并且原任务优先权恢复以后,才会出现。
这种方法防止了优先占有资源情况的出现,这通常是导致资源访问冲突的主要原因。因此,像优先权倒置和死锁的现像就不会发生了。但是,这种协议的缺点就是,所有优先权低于该优先权限制的任务将会被排斥在外,即使他们不会使用该资源。OSEK/VDX OS 使用这种资源管理模式。
最高锁定者优先权协议
该协议类似于优先权限制协议,有区别的是,一个没有占有资源,拥有比资源的优先权限制低的任务,能够比正在使用资源的某一更低优先权的任务优先占用该资源。为了达到这个目的,调度器需要考虑两种任务优先权,初始优先权和资源优先权。
概要
这一部分介绍了涉及同步对共享资源访问的一些概念。这其中的一些协议由于一些精妙的作用而变得比较复杂。从这一章中,我们能得到的一个主要观点就是,RTOS必须控制对共享资源的并发访问;我们可能用到的资源调度机制有十分重要的意义。




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4274/showart_30109.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP