00000015.htm

来自「水木社区 embeded 版精华区 下载」· HTM 代码 · 共 319 行 · 第 1/3 页

HTM
319
字号
务完成临界区操作以后,它将取消删除保护以使自己可以被删除,从而解阻塞删除任务&nbsp;<br />。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;正如上面所展示的,任务删除保护通常伴有互斥操作。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;这样,为了方便性和效率,互斥信号量包含了删除保护选项。(参见&quot;互斥信号量&quot;&nbsp;<br />)&nbsp;<br />任务间通信&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;为了提供完整的多任务系统的功能,wind内核提供了一套丰富的任务间通信与同步&nbsp;<br />的机制。这些通信功能使一个应用中各个独立的任务协调他们的活动。&nbsp;<br />共享地址空间&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;wind内核的任务间通信机制的基础是所有任务所在的共享地址空间。通过共享地址&nbsp;<br />空间,任务能够使用共享数据结构的指针自由地通信。管道不需要映射一块内存区到两&nbsp;<br />个互相通信任务的寻址空间。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不幸的是,共享地址空间具有上述优点的同时,带来了未被保护内存的重入访&nbsp;<br />问的危险。UNIX操作系统通过隔离进程提供这样的保护,但同时带来了对于实时操作系&nbsp;<br />统来说巨大的性能损失。&nbsp;<br />互斥操作&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;当一个共享地址空间简化了数据交换,通过互斥访问避免资源竞争就变为必要的了&nbsp;<br />。用来获得一个资源的互斥访问的许多机制仅在这些互斥所作用的范围上存在差别。实&nbsp;<br />现互斥的方法包括禁止中断、禁止任务抢占和通过信号量进行资源锁定。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;中断禁止:最强的互斥方法是屏蔽中断。这样的锁定保证了对CPU的互斥访问。这种&nbsp;<br />方法当然能够解决互斥的问题,但它对于实时是不恰当的,因为它在锁定期间阻止系统&nbsp;<br />响应外部事件。长的中断延时对于要求有确定的响应时间的应用来说是不可接受的。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;抢占禁止:禁止抢占提供了强制性较弱的互斥方式。&nbsp;当前任务运行的过程中不允许&nbsp;<br />其他任务抢占,而中断服务程序可以执行。这也可能引起较差的实时响应,就象被禁止&nbsp;<br />中断一样,被阻塞的任务会有相当长时间的抢占延时,就绪态的高优先级的任务可能会&nbsp;<br />在能够执行前被强制等待一段不可接受的时间。为避免这种情况,在可能的情况下尽量&nbsp;<br />使用信号量实现互斥。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;互斥信号量:信号量是用于锁定共享资源访问的基本方式。不象禁止中断或抢占,&nbsp;<br />信号量限制了互斥操作仅作用于相关的资源。一个信号量被创建来保护资源。VxWorks的&nbsp;<br />信号量遵循Dijkstra的P()和V()操作模式。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;当一个任务请求信号量,P(),&nbsp;根据在发出调用时信号量的置位或清零的状态,&nbsp;会&nbsp;<br />发生两种情况。如果信号量处于置位态,&nbsp;信号量会被清零,并且任务立即继续执行。如&nbsp;<br />果信号量处于清零态,任务会被阻塞来等待信号量。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;当一个任务释放信号量,V(),会发生几种情况。如果信号量已经处于置位态,释放&nbsp;<br />信号量不会产生任何影响。如果信号量处于清零态且没有任务等待该信号量,信号量只&nbsp;<br />是被简单地置位。如果信号量处于清零态且有一个或多个任务等待该信号量,最高优先&nbsp;<br />级的任务被解阻塞,信号量仍为清零态。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;通过将一些资源与信号量关联,能够实现互斥操作。当一个任务要操作资源,它必&nbsp;<br />须首先获得信号量。只要任务拥有信号量,所有其他的任务由于请求该信号量而被阻塞&nbsp;<br />。当一个任务使用完该资源,它释放信号量,允许等待该信号量的另一个任务访问该资&nbsp;<br />源。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Wind内核提供了二值信号量来解决互斥操作所引起的问题。&nbsp;这些问题包括资源拥有&nbsp;<br />者的删除保护,由资源竞争引起的优先级逆转。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;删除保护----互斥引起的一个问题会涉及到任务删除。在由信号量保护的临界区中&nbsp;<br />,需要防止执行任务被意外地删除。删除一个在临界区执行的任务是灾难性的。资源会&nbsp;<br />被破坏,保护资源的信号量会变为不可获得,从而该资源不可被访问。通常删除保护是&nbsp;<br />与互斥操作共同提供的。由于这个原因,互斥信号量通常提供选项来隐含地提供前面提&nbsp;<br />到的任务删除保护的机制。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;优先级逆转/优先级继承----优先级逆转发生在一个高优先级的任务被强制等待一段&nbsp;<br />不确定的时间以便一个较低优先级的任务完成执行。考虑下面的假设:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1,T2和T3分别是高、中、低优先级的任务。T3通过拥有信号量而获得相关的资源&nbsp;<br />。当T1抢占T3,为竞争使用该资源而请求相同的信号量的时候,它被阻塞。如果我们假&nbsp;<br />设T1仅被阻塞到T3使用完该资源为止,情况并不是很糟。毕竟资源是不可被抢占的。然&nbsp;<br />而,低优先级的任务并不能避免被中优先级的任务抢占,一个抢占的任务如T2将阻止T3&nbsp;<br />完成对资源的操作。这种情况可能会持续阻塞T1等待一段不可确定的时间。这种情况成&nbsp;<br />为优先级逆转,因为尽管系统是基于优先级的调度,但却使一个高优先级的任务等待一&nbsp;<br />个低优先级的任务完成执行。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;互斥信号量有一个选项允许实现优先级继承的算法。优先级继承通过在T1被阻塞期&nbsp;<br />间提升T3的优先级到T1解决了优先级逆转引起的问题。这防止了T3,间接地防止T1,被&nbsp;<br />T2抢占。通俗地说,优先级继承协议使一个拥有资源的任务以等待该资源的任务中优先&nbsp;<br />级最高的任务的优先级执行。当执行完成,任务释放该资源并返回到它正常的或标准的&nbsp;<br />优先级。因此,继承优先级的任务避免了被任何中间优先级的任务抢占。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;同步&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;信号量另一种通常的用法是用于任务间的同步机制。在这种情况下,信号量代表一&nbsp;<br />个任务所等待的条件或事件。最初,信号量是在清零态。一个任务或中断通过置位该信&nbsp;<br />号量来指示一个事件的发生。等待该信号量的任务将被阻塞直到事件发生、该信号量被&nbsp;<br />置位。一旦被解阻塞,任务就执行恰当的事件处理程序。信号量在任务同步中的应用对&nbsp;<br />于将中断服务程序从冗长的事件处理中解放出来以缩短中断响应时间是很有用的。&nbsp;<br />消息队列&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;消息队列提供了在任务与中断服务程序或其他任务间交换变长消息的一种较低层的&nbsp;<br />机制。这种机制在功能上类似于管道,但有较少的开销。&nbsp;<br />管道、套接字、远程过程调用和更多&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;许多高层的VxWorks机制提供任务间通信的更高层的抽象,包括管道、TCP/IP套接字&nbsp;<br />、远程过程调用和更多。为了保持裁减内核为仅包含足够支持高层功能的一个最小函数&nbsp;<br />集的设计目标,这些特性都是基于上面描述的内核同步方式的。&nbsp;<br />3.&nbsp;内核设计的优点&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;wind内核的一个重要的设计特性是最小的抢占延时。其他的主要设计的优点包括史&nbsp;<br />无前例的可配置性,对不可预见的应用需求的可扩展性,在各种微处理器应用开发中的&nbsp;<br />移植性。&nbsp;<br />最小的抢占延时&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;正如前面所讨论的,禁止抢占是获得代码临界资源互斥操作的通常手段。这种技巧&nbsp;<br />的不期望的负面影响是高的抢占延时,这可以通过尽量使用信号量实现互斥和保持临界&nbsp;<br />区尽量紧凑被减小。但即使广泛地使用信号量也不能解决所有的可能导致抢占延时的根&nbsp;<br />源。内核本身就是一个导致抢占延时的根源。为了理解其原因,我们必须更好地理解内&nbsp;<br />核所需的互斥操作。&nbsp;<br />内核级和任务级&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;在任何多任务系统中,大量的应用是发生在一个或多个任务的上下文。然而,有些&nbsp;<br />CPU时间片不在任何任务的上下文。这些时间片发生在内核改变内部队列或决定任务调度&nbsp;<br />。在这些时间片中,CPU在内核级执行,而非任务级。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;为了内核安全地操作它的内部的数据结构,必须有互斥操作。内核级没有相关的任&nbsp;<br />务上下文,内核不能使用信号量保护内部链表。内核使用工作延期作为实现互斥的方式&nbsp;<br />。当有内核参与时,中断服务程序调用的函数不是被直接激活,而是被放在内核的工作&nbsp;<br />队列中。内核完成这些请求的执行而清空内核工作队列。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;当内核正在执行已经被请求服务时系统将不响应到达内核的函数调用。可以简单地&nbsp;<br />认为内核状态类似于禁止抢占。如前面所讨论的,抢占延时在实时系统中是不期望有的&nbsp;<br />,因为它增加了对于会引起应用任务重新调度的事件的响应时间.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;管操作系统在内核级(此时禁止抢占)完全避免消耗时间是不可能的,但减少这些&nbsp;<br />时间是很重要的。这是减少由内核执行的函数的数量的主要原因,&nbsp;也是不采用统一结构&nbsp;<br />的系统设计方式的原因。例如,有一种流行的实时操作系统的每个函数都是在内核级执&nbsp;<br />行。这意味着当一个低优先级的任务在执行分配内存、获得任务信息的函数时所有高优&nbsp;<br />先级的任务被禁止抢占。&nbsp;<br />一个最小的内核&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;已经说明了一个最小内核的优点和构造高层操作系统功能的必要功能,我们使用这&nbsp;<br />些操作原语来执行一个传统的内核级功能,而在VxWorks中作为任务级功能执行,内存管&nbsp;<br />理。&nbsp;在这个例子中,考虑用户可调用的子例程malloc,&nbsp;用于分配所请求大小的内存区&nbsp;<br />并返回一个指向该内存区的指针。假定空闲内存区是通过搜索一个空闲内存块的队列找&nbsp;<br />到的,一个信号量必须被用来保护这个非抢占多用户资源。分配内存的操作如下:&nbsp;<br />

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?