📄 104.htm
字号:
T1,T2和T3分别是高、中、低优先级的任务。T3通过拥有信号量而获得相关的资源 <br>
。当T1抢占T3,为竞争使用该资源而请求相同的信号量的时候,它被阻塞。如果我们假 <br>
设T1仅被阻塞到T3使用完该资源为止,情况并不是很糟。毕竟资源是不可被抢占的。然 <br>
而,低优先级的任务并不能避免被中优先级的任务抢占,一个抢占的任务如T2将阻止T3 <br>
完成对资源的操作。这种情况可能会持续阻塞T1等待一段不可确定的时间。这种情况成 <br>
为优先级逆转,因为尽管系统是基于优先级的调度,但却使一个高优先级的任务等待一 <br>
个低优先级的任务完成执行。 <br>
互斥信号量有一个选项允许实现优先级继承的算法。优先级继承通过在T1被阻塞期 <br>
间提升T3的优先级到T1解决了优先级逆转引起的问题。这防止了T3,间接地防止T1,被 <br>
T2抢占。通俗地说,优先级继承协议使一个拥有资源的任务以等待该资源的任务中优先 <br>
级最高的任务的优先级执行。当执行完成,任务释放该资源并返回到它正常的或标准的 <br>
优先级。因此,继承优先级的任务避免了被任何中间优先级的任务抢占。 <br>
同步 <br>
信号量另一种通常的用法是用于任务间的同步机制。在这种情况下,信号量代表一 <br>
个任务所等待的条件或事件。最初,信号量是在清零态。一个任务或中断通过置位该信 <br>
号量来指示一个事件的发生。等待该信号量的任务将被阻塞直到事件发生、该信号量被 <br>
置位。一旦被解阻塞,任务就执行恰当的事件处理程序。信号量在任务同步中的应用对 <br>
于将中断服务程序从冗长的事件处理中解放出来以缩短中断响应时间是很有用的。 <br>
消息队列 <br>
消息队列提供了在任务与中断服务程序或其他任务间交换变长消息的一种较低层的 <br>
机制。这种机制在功能上类似于管道,但有较少的开销。 <br>
管道、套接字、远程过程调用和更多 <br>
许多高层的VxWorks机制提供任务间通信的更高层的抽象,包括管道、TCP/IP套接字 <br>
、远程过程调用和更多。为了保持裁减内核为仅包含足够支持高层功能的一个最小函数 <br>
集的设计目标,这些特性都是基于上面描述的内核同步方式的。 <br>
3. 内核设计的优点 <br>
wind内核的一个重要的设计特性是最小的抢占延时。其他的主要设计的优点包括史 <br>
无前例的可配置性,对不可预见的应用需求的可扩展性,在各种微处理器应用开发中的 <br>
移植性。 <br>
最小的抢占延时 <br>
最小的抢占延时 <br>
正如前面所讨论的,禁止抢占是获得代码临界资源互斥操作的通常手段。这种技巧 <br>
的不期望的负面影响是高的抢占延时,这可以通过尽量使用信号量实现互斥和保持临界 <br>
区尽量紧凑被减小。但即使广泛地使用信号量也不能解决所有的可能导致抢占延时的根 <br>
源。内核本身就是一个导致抢占延时的根源。为了理解其原因,我们必须更好地理解内 <br>
核所需的互斥操作。 <br>
内核级和任务级 <br>
在任何多任务系统中,大量的应用是发生在一个或多个任务的上下文。然而,有些 <br>
CPU时间片不在任何任务的上下文。这些时间片发生在内核改变内部队列或决定任务调度 <br>
。在这些时间片中,CPU在内核级执行,而非任务级。 <br>
为了内核安全地操作它的内部的数据结构,必须有互斥操作。内核级没有相关的任 <br>
务上下文,内核不能使用信号量保护内部链表。内核使用工作延期作为实现互斥的方式 <br>
。当有内核参与时,中断服务程序调用的函数不是被直接激活,而是被放在内核的工作 <br>
队列中。内核完成这些请求的执行而清空内核工作队列。 <br>
当内核正在执行已经被请求服务时系统将不响应到达内核的函数调用。可以简单地 <br>
认为内核状态类似于禁止抢占。如前面所讨论的,抢占延时在实时系统中是不期望有的 <br>
,因为它增加了对于会引起应用任务重新调度的事件的响应时间. <br>
管操作系统在内核级(此时禁止抢占)完全避免消耗时间是不可能的,但减少这些 <br>
时间是很重要的。这是减少由内核执行的函数的数量的主要原因, 也是不采用统一结构 <br>
的系统设计方式的原因。例如,有一种流行的实时操作系统的每个函数都是在内核级执 <br>
行。这意味着当一个低优先级的任务在执行分配内存、获得任务信息的函数时所有高优 <br>
先级的任务被禁止抢占。 <br>
一个最小的内核 <br>
一个最小的内核 <br>
已经说明了一个最小内核的优点和构造高层操作系统功能的必要功能,我们使用这 <br>
些操作原语来执行一个传统的内核级功能,而在VxWorks中作为任务级功能执行,内存管 <br>
理。 在这个例子中,考虑用户可调用的子例程malloc, 用于分配所请求大小的内存区 <br>
并返回一个指向该内存区的指针。假定空闲内存区是通过搜索一个空闲内存块的队列找 <br>
到的,一个信号量必须被用来保护这个非抢占多用户资源。分配内存的操作如下: <br>
获得互斥信号量 <br>
搜索空闲内存块链表 <br>
释放互斥信号量 <br>
值得注意的是搜索一个足够大的空闲内存块的可能的冗长的时间是发生在调用任务 <br>
的上下文中。这是可以被高优先级的任务抢占的(除了信号量调用的这段执行时间)。 <br>
<br>
在一个标准的统一结构的实时内核中,内存分配例程操作如下: <br>
进入内核 <br>
搜索空闲内存块链表 <br>
退出内核 <br>
整个内存分配发生在内核级,任务抢占被禁止如果高优先级的任务在此时变为就绪 <br>
态,它必须等待直到内核为低优先级的任务完成内存分配。有些操作系统甚至在这段市 <br>
时间禁止中断。 <br>
任务级操作系统服务 <br>
Wind River System的实时操作系统,VxWorks,显示了这样设计的一个最小内核是 <br>
能够满足需求的。VxWorks是现在能够获得的独立于任何处理器的、拥有相当小内核的、 <br>
功能完全的层次结构的实时操作系统。 <br>
VxWorks在内核之上提供了大量的功能。它包括内存管理,一个完整的BSD4.3网络包 <br>
,TCP/IP,网络文件系统(NFS),远程过程调用(RPC),UNIX兼容的链接加载模块, <br>
C语言的解释界面,各种类型的定时器,性能监测组件,调试工具,额外的通信工具如管 <br>
道、信号和套接字,I/O和文件系统,和许多功能例程。这些都不是运行在内核级,所以 <br>
不会禁止中断或任务抢占。 <br>
可配置性 <br>
实时应用有多种内核需求。没有哪个内核有一个用来满足每种需求的很好的设计折 <br>
衷。然而,一个内核可以通过配置来调整特定的性能特性,裁减实时系统来最好地适应 <br>
一个应用的要求。不可预见的内核配置性以用户可选择的内核排队算法的形式提供给应 <br>
用。 <br>
排队策略 <br>
VxWorks中的排队库是独立于使用他们的内核队列功能而执行的,这样提供了将来增 <br>
加新的排队方式的灵活性。 <br>
在VxWorks中有各种内核队列。就绪队列是一个按优先级索引的所有等待调度的任务 <br>
队列。滴答队列用于定时功能。信号量是一个等待信号量的被阻塞任务的链表。活动队 <br>
列是一个系统中所有任务的一个先进先出(FIFO)的链表。这些队列中的每个队列都需 <br>
要一个不同的排队算法。这些算法不是被内嵌在内核中,而是被抽取到一个自治的、可 <br>
转换的排队库中。这种灵活的组织形式是满足特殊的配置需求的基础。 <br>
可扩展性 <br>
支持不可预见的内核扩展的能力与以有功能的可配置性是同样重要的。简单的内核 <br>
接口和互斥方法使内核级功能扩展相当容易; 在某些情况下,应用可以仅利用内核钩子 <br>
函数来实现特定的扩展。 <br>
内部钩子函数 <br>
为了不修改内核而能够向系统增加额外的任务相关的功能,VxWorks提供了任务创建 <br>
、切换和删除的钩子函数。这些允许在任务被创建、 上下文切换和任务被删除的时候额 <br>
外的例程被调用执行。这些钩子函数可以利用任务上下文中的空闲区创建wind内核的任 <br>
务特性。 <br>
未来考虑 <br>
有许多系统函数现在变得越来越重要,而且会影响到内核设计时的抢占延时。尽管 <br>
涉及这些问题一个完整的讨论超出了本文的范围,但值得简单地提一下。 <br>
RISC/CISC <br>
设计一个独立于CPU的操作系统一直是一个挑战。随着新的RSIC(精简指令集)处理 <br>
器变得很流行,这些难度也加大了。为了在RISC环境下有效地执行,内核和操作系统需 <br>
要有执行不同策略的灵活性。 <br>
例如,考虑在任务切换时内核执行的例程。在CISC(复杂指令集,如680x0或80x86 <br>
)CPU,内核为每个任务存储一套完整的寄存器,在运行任务的时候将这些寄存器换入换 <br>
出。在一个RISC机器上,这样是不合理的,因为涉及到太多的寄存器。所以内核需要一 <br>
个更精密复杂的策略,如为任务缓存寄存器,允许应用指定一些寄存器给特殊的任务。 <br>
<br>
移植性 <br>
为了使wind内核在他们出现的结构上能够运行,需要有一个可移植的内核版本。这 <br>
使移植是可行的,但不是最优化的。 <br>
多处理 <br>
支持紧耦合的多处理需求要求实时内核的内部功能包含,在理想情况下,在远 <br>
端请求内核调用,如从一个处理器到另一个处理器。这就要涉及到信号量调用(为处理 <br>
器间同步)和任务调用(为了控制另一个CPU上的任务)。这种复杂性无疑会增加内核级 <br>
功能调用的开销,但是许多服务如对象标识可以在任务级执行。在多处理系统中保持一 <br>
个最小内核的优点是处理器之间的互锁可以有较好的时间粒度。大的内核将在内核级消 <br>
耗额外的时间,仅能获得粗糙的互锁时间粒度。 <br>
Ada <br>
Ada语言为实时系统设计者提供了象聚会机制这样的任务原语。异常处理、任务终止 <br>
、终止替换和聚会都将潜在地影响内核设计。这些操作可以由前面讨论的任务和同步机 <br>
制构造,为了保持减小抢占延时的设计目标,许多工作能够在任务级执行。 <br>
4. 实时内核的重要尺度 <br>
许多性能特性被用来比较以有的实时内核,这些包括: <br>
快速的任务上下文切换----由于实时系统的多任务的特性,系统能够快速地从一个 <br>
任务切换到另一个任务是很重要的。在分时系统中,如UNIX,上下文切换是在ms级。Wi <br>
nd内核执行原始上下文切换只用17us。 <br>
最小的同步开销----因为同步是实现资源互斥访问的基本方法,这些操作所引起的 <br>
开销最小化是很重要的。在VxWorks中,请求和释放二值信号量仅用8us。 <br>
最小的中断延时----因为外部世界来的事件通常以中断的形式到来,操作系统快速 <br>
的处理这些中断是很重要的。内核在操作一些临界数据结构的时候必须禁止中断。为了 <br>
减小中断延时,必须使这些时间最小化。Wind内核的中断延时小于10us。 <br>
抢占延时对性能指标的影响 <br>
当许多的实时解决方案被提交给应用工程师时, 性能指标对于评估供应商的产品变 <br>
得越来越重要。不象上下文切换和中断延时,抢占延时很难测量。所以它很少在说明中 <br>
被提及。但是考虑到当内核通常禁止上下文切换会长达数百微妙,而声称一个50us的固 <br>
定长度(与任务个数无关)的上下文切换时间是毫无意义的。除了很难测量外,抢占延 <br>
时可能会削弱许多性能指标的有效性。 <br>
Wind内核通过减小内核的大小来尽量减小抢占延时。 包含繁多功能的内核必将引起 <br>
长的抢占延时。 <br>
5. 结论 <br>
为了满足对实时内核日益增加的要求,如新的调度算法、多处理、Ada和RISC结构, <br>
wind内核始终以灵活性和可配置性为设计目标。它所提供的优秀的运行性能将成为实时 <br>
应用需求新标准。 <br>
d <br>
<br>
-- <br>
<br>
※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.161.11] <br>
</small><hr>
<p align="center">[<a href="嵌入式系统.htm">回到开始</a>][<a href="59.htm">上一层</a>][<a href="105.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -