📄 104.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://202.112.58.200"><font face="黑体"><big><big>Tsinghua</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> 嵌入式系统 (BM: turbolinux jacobw) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="嵌入式系统.htm">回到开始</a>][<a href="59.htm">上一层</a>][<a href="105.htm">下一篇</a>]
<hr><p align="left"><small>发信人: plato (纯真年代), 信区: Embedded <br>
标 题: VXWORKS内核分析(转) <br>
发信站: BBS 水木清华站 (Wed Apr 25 22:11:57 2001) <br>
<br>
1. 实时操作系统的结构 <br>
在计算的早期开发的操作系统的最原始的结构形式是一个统一的实体(monolithic) <br>
。在这样的系统中,提供的不同功能的模块,如处理器管理、内存管理、输入输出等, <br>
通常是独立的。然而他们在执行过程中并不考虑其他正在使用中的模块,各个模块都以 <br>
相同的时间粒度运行。 <br>
由于现代实时环境需要许多不同的功能,以及在这样的环境中存在的并发活动所引 <br>
起的异步性和非确定性,操作系统变得更加复杂。所以早期操作系统的统一结构的组织 <br>
已经被更加精确的内部结构所淘汰。 <br>
层次结构的起点----内核 <br>
操作系统的最好的内部结构模型是一个层次性的结构,最低层是内核。这些层次可 <br>
以看成为一个倒置的金字塔,每一层都建立在较低层的功能之上。 内核仅包含一个操作 <br>
系统执行的最重要的低层功能。正象一个统一结构的操作系统,内核提供了在高层软件 <br>
与下层硬件之间的抽象层。然而,内核仅提供了构造操作系统其他部分所需的最小操作 <br>
集。 <br>
对一个实时内核的要求 <br>
一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括: <br>
多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多 <br>
任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执 <br>
行。系统内核分配CPU给这些任务来获得并发性。 <br>
抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先 <br>
级。基于优先级的抢占调度,任务都被指定了优先级, 在能够执行的任务(没有被挂起 <br>
或正在等待资源)中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的 <br>
任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。 <br>
快速灵活的任务间的通信与同步:在一个实时系统中,可能有许多任务作为一个应 <br>
用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提 <br>
供为了有效地共享不可抢占的资源或临界区所需的同步机制。 <br>
方便的任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为 <br>
了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。 <br>
所以需要杂任务级和中断级之间存在通信。 <br>
性能边界:一个实时内核必须提供最坏情况的性能优化,而非针对吞吐量的性能优 <br>
化。我们更期望一个系统能够始终以50微妙执行一个函数,而不期望系统平均以10微妙 <br>
执行该函数,但偶尔会以75微妙执行它。 <br>
特殊考虑:由于对实时内核的要求的增加,必须考虑对内核支持不断增加的复杂功 <br>
能的要求。这包括多进程处理,Ada和对更新的、功能更强的处理器结构如RISC的支持。 <br>
<br>
拥有其它名字的内核 <br>
许多商用化的内核支持的功能远强于上面所列的要求。在这方面,他们不是真正的 <br>
内核,而更象一个小的统一结构的操作系统。因为他们包含简单的内存分配、时钟管理 <br>
、甚至一些输入输出系统调用的功能。 <br>
这种分类不仅仅是在语义上的争论,在这篇文章的后面章节将说明限制内核功能和 <br>
油画这些功能的重要性。 <br>
2. VxWorks内核:Wind <br>
VxWorks操作系统是一种功能最全的现在可以获得的独立于处理器的实时系统。然而 <br>
,VxWorks是带有一个相当小的真正微内核的层次结构。内核仅提供多任务环境、进程间 <br>
通信和同步功能。这些功能模块足够支持VxWorks在较高层次所提供的丰富的性能的要求 <br>
。 通常内核操作对于用户是不可见的。应用程序为了实现需要内核参与的任务管理和同 <br>
步使用一些系统调用,但这些调用的处理对于调用任务是不可见的。应用程序仅链接恰 <br>
当的VxWorks例程(通常使用VxWorks的动态链接功能),就象调用子程序一样发出系统 <br>
调用。这种接口不象有些系统需要一个笨拙的跳转表接口,用户需要通过一个整数来指 <br>
定一个内核功能调用。 <br>
多任务 <br>
内核的基本功能是提供一个多任务环境。多任务使得许多程序在表面上表现为并发 <br>
执行,而事实上内核是根据基本的调度算法使他们分段执行。每个明显独立的程序被成 <br>
为一个任务。每个任务拥有自己的上下文,其中包含在内核调度使该任务执行的时候它 <br>
所看到的CPU环境和系统资源。 <br>
任务状态 <br>
内核维护系统中的每个任务的当前状态。状态迁移发生在应用程序调用内核功能服 <br>
务的时候。下面定义了wind内核状态: <br>
就绪态----一个任务当前除了CPU不等待任何资源 <br>
阻塞态----一个任务由于某些资源不可获得而被阻塞 <br>
延迟态----一个任务睡眠一段时间 <br>
挂起态----主要用于调试的一个辅助状态,挂起禁止任务的执行 <br>
任务被创建以后进入挂起态,需要通过特定的操作使被创建的任务进入就绪态,这 <br>
一操作执行速度很快,使应用程序能够提前创建任务,并以一种快捷的方式激活该任务 <br>
。 <br>
调度控制 <br>
多任务需要一个调度算法分配CPU给就绪的任务。在VxWorks中默认的调度算法是基 <br>
于优先级的抢占调度,但应用程序也可以选择使用时间片轮转调度。 <br>
基于优先级抢占调度:基于优先级的抢占调度,每个任务被指定一个优先级,内核 <br>
分配CPU给处于就绪态的优先级最高的任务。调度采用抢占的方式,是因为当一个优先级 <br>
高于当前任务的任务变为就绪态时,内核将立即保存当前任务的上文,并切换到高优先 <br>
级任务的上文。VxWorks有从0到255共256个优先级。在创建的时候任务被指定一个优先 <br>
级,在任务运行的过程中可以动态地修改优先级以便跟踪真实世界的事件优先级。外部 <br>
中断被指定优先于任何任务的优先级,这样能够在任何时候抢占一个任务。 <br>
时间片轮转:基于优先级抢占调度可以扩充时间片轮转调度。时间片轮转调度允许 <br>
在相同优先级的处于就绪态的任务公平地共享CPU。没有时间片轮转调度,当有多个任务 <br>
在同一优先级共享处理器时,一个任务可能独占CPU,不会被阻塞直到被一个更高优先级 <br>
的任务抢占,而不给同一优先级的其他任务运行的机会。如果时间片轮转被使能,执行 <br>
任务的时间计数器在每个时钟滴答递增。当指定的时间片耗尽,计数器会被清零,该任 <br>
务被放在同一优先级任务队列的队尾。加入特定优先级组的新任务被放在该组任务的队 <br>
尾,并将运行计数器初始化为零。 <br>
基本的任务函数 <br>
用于状态控制的基本任务函数包括一个任务的创建、删除、挂起和唤醒。一个 <br>
任务也可以使自己睡眠一个特定的时间间隔不去运行。 <br>
许多其他任务例程提供由任务上下文获得的状态信息。这些例程包括访问一个任务当前 <br>
处理器寄存器控制。 <br>
任务删除问题 <br>
wind内核提供防止任务被意外删除的机制。通常,一个执行在临界区或访问临界资 <br>
源的任务要被特别保护。我们设想下面的情况:一个任务获得一些数据结构的互斥访问 <br>
权,当它正在临界区内执行时被另一个任务删除。由于任务无法完成对临界区的操作, <br>
该数据结构可能还处于被破坏或不一致的状态。而且,假想任务没有机会释放该资源, <br>
那麽现在其他任何任务现在就不能获得该资源,资源被冻结了。 <br>
任何要删除或终止一个设定了删除保护的任务的任务将被阻塞。当被保护的任 <br>
务完成临界区操作以后,它将取消删除保护以使自己可以被删除,从而解阻塞删除任务 <br>
。 <br>
正如上面所展示的,任务删除保护通常伴有互斥操作。 <br>
这样,为了方便性和效率,互斥信号量包含了删除保护选项。(参见"互斥信号量" <br>
) <br>
任务间通信 <br>
为了提供完整的多任务系统的功能,wind内核提供了一套丰富的任务间通信与同步 <br>
的机制。这些通信功能使一个应用中各个独立的任务协调他们的活动。 <br>
共享地址空间 <br>
wind内核的任务间通信机制的基础是所有任务所在的共享地址空间。通过共享地址 <br>
空间,任务能够使用共享数据结构的指针自由地通信。管道不需要映射一块内存区到两 <br>
个互相通信任务的寻址空间。 <br>
不幸的是,共享地址空间具有上述优点的同时,带来了未被保护内存的重入访 <br>
问的危险。UNIX操作系统通过隔离进程提供这样的保护,但同时带来了对于实时操作系 <br>
统来说巨大的性能损失。 <br>
互斥操作 <br>
当一个共享地址空间简化了数据交换,通过互斥访问避免资源竞争就变为必要的了 <br>
。用来获得一个资源的互斥访问的许多机制仅在这些互斥所作用的范围上存在差别。实 <br>
现互斥的方法包括禁止中断、禁止任务抢占和通过信号量进行资源锁定。 <br>
中断禁止:最强的互斥方法是屏蔽中断。这样的锁定保证了对CPU的互斥访问。这种 <br>
方法当然能够解决互斥的问题,但它对于实时是不恰当的,因为它在锁定期间阻止系统 <br>
响应外部事件。长的中断延时对于要求有确定的响应时间的应用来说是不可接受的。 <br>
抢占禁止:禁止抢占提供了强制性较弱的互斥方式。 当前任务运行的过程中不允许 <br>
其他任务抢占,而中断服务程序可以执行。这也可能引起较差的实时响应,就象被禁止 <br>
中断一样,被阻塞的任务会有相当长时间的抢占延时,就绪态的高优先级的任务可能会 <br>
在能够执行前被强制等待一段不可接受的时间。为避免这种情况,在可能的情况下尽量 <br>
使用信号量实现互斥。 <br>
互斥信号量:信号量是用于锁定共享资源访问的基本方式。不象禁止中断或抢占, <br>
信号量限制了互斥操作仅作用于相关的资源。一个信号量被创建来保护资源。VxWorks的 <br>
信号量遵循Dijkstra的P()和V()操作模式。 <br>
当一个任务请求信号量,P(), 根据在发出调用时信号量的置位或清零的状态, 会 <br>
发生两种情况。如果信号量处于置位态, 信号量会被清零,并且任务立即继续执行。如 <br>
果信号量处于清零态,任务会被阻塞来等待信号量。 <br>
当一个任务释放信号量,V(),会发生几种情况。如果信号量已经处于置位态,释放 <br>
信号量不会产生任何影响。如果信号量处于清零态且没有任务等待该信号量,信号量只 <br>
是被简单地置位。如果信号量处于清零态且有一个或多个任务等待该信号量,最高优先 <br>
级的任务被解阻塞,信号量仍为清零态。 <br>
通过将一些资源与信号量关联,能够实现互斥操作。当一个任务要操作资源,它必 <br>
须首先获得信号量。只要任务拥有信号量,所有其他的任务由于请求该信号量而被阻塞 <br>
。当一个任务使用完该资源,它释放信号量,允许等待该信号量的另一个任务访问该资 <br>
源。 <br>
Wind内核提供了二值信号量来解决互斥操作所引起的问题。 这些问题包括资源拥有 <br>
者的删除保护,由资源竞争引起的优先级逆转。 <br>
删除保护----互斥引起的一个问题会涉及到任务删除。在由信号量保护的临界区中 <br>
,需要防止执行任务被意外地删除。删除一个在临界区执行的任务是灾难性的。资源会 <br>
被破坏,保护资源的信号量会变为不可获得,从而该资源不可被访问。通常删除保护是 <br>
与互斥操作共同提供的。由于这个原因,互斥信号量通常提供选项来隐含地提供前面提 <br>
到的任务删除保护的机制。 <br>
优先级逆转/优先级继承----优先级逆转发生在一个高优先级的任务被强制等待一段 <br>
不确定的时间以便一个较低优先级的任务完成执行。考虑下面的假设: <br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -