《同步互斥与通信》PPT课件_第1页
《同步互斥与通信》PPT课件_第2页
《同步互斥与通信》PPT课件_第3页
《同步互斥与通信》PPT课件_第4页
《同步互斥与通信》PPT课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统及应用,第六章同步、互斥与通信,主要内容,概述信号量邮箱和消息队列管道,ISRx,Tasky,POST,PEND,任务与ISR之间的同步(单向),Taskx,Tasky,POST,PEND,POST,PEND,任务与任务之间的同步(双向),任务与任务之间的同步(单向),Taskx,Tasky,POST,PEND,在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号量(semaphore),用于互斥与同步事件(组)(eventgroup),用于同步异步信号(asynchronoussignal),用于同步邮箱(mailbox)、消息队列(messagequeue),用于消息通信管道(pipe),提供非结构化数据交换和实现同步,以下一些机制也可用于同步与通信(在单处理器或多处理器系统中):全局变量共享内存Sockets远程过程调用(RemoteProcedureCall),第一节信号量,信号量的种类及用途信号量的定义互斥信号量二值信号量计数信号量信号量机制的主要数据结构典型的信号量操作,什么是信号量,信号量被定义为一个整形变量,在其上定义了以下三个操作:1、可以被初始化一个非负数2、wait操作(P操作)将信号量的值减1后,若该值为负,则执行wait操作的任务等待3、signal操作(V操作)将信号量的值增1后,若该值为非正,则执行signal操作的任务唤醒,信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。信号量一般分为三种:,信号量的种类及用途,用于解决互斥问题。它比较特殊,可能会引起优先级反转问题。,用于解决同步问题,用于解决资源计数问题,将信号量进行种类细分,可以根据其用途,在具体实现时做专门处理,提高执行效率和可靠性。,互斥信号量,计数信号量,二值信号量,互斥信号量,WaitB(S):/申请信号量ifS.value1;/当前没有其他任务使用信号量thenS.value=S.value-1=0/将信号量值修改为0,独占共享资源elsebeginInsert(CALLER,S.L);/如果当前有其他任务使用信号量,将该任务放入等待队列Block(CALLER);/修改该任务的状态为等待态(阻塞任务)endSignalB(S):/释放信号量ifS.Lqueueisempty;/如果等待序列为空,没有其他任务等待使用该共享资源thenS.value=1;/释放信号量elsebeginRemove(S.L,id);/如果有其他任务等待使用该共享资源,则从等待队列中将该任务移除wakeup(id);/将该任务的状态改为就绪态(唤醒任务)end,用信号量实现任务间的互斥,varmutex:SharedSemaphore;beginmutex:=1;parbeginP1:P2:Pi:repeatWait(mutex);“进程Pi的临界代码段”;Signal(mutex);foreverPn:parendend,互斥信号量状态图,互斥信号量状态图,各种互斥机制比较,二值信号量,可获得,不可获得,申请并获得(值为0),释放(值为1),初始化值为0,二值信号量状态图,Task1()执行一些操作;将信号量sem1置1;申请信号量sem2;,Task2()申请信号量sem1;执行一些操作;将信号量sem2置1;,Task2申请信号量sem1失败,系统切换到Task1,sem1被置1后,Task2得到sem1并抢占Task1,Task2运行到某处时因某种原因被阻塞,系统切换到Task1,用二值信号量实现两个任务之间的双向同步Task2优先级高于Task1sem1和sem2的初始值均为0,二值信号量实现同步,计数信号量,计数信号量,计数信号量状态图,可获得,不可获得,初始化值大于0,申请并获得值为0,释放值为1,申请并获得值减1,释放值加1,计数(一般)信号量同步原语,Wait(S):S.value:=S.value-1;/有新任务来使用共享资源将信号量的值减1ifS.value0/如果信号量的值为负,表示共享资源已经分配完毕thenbeginInsert(CALLER,S.L);/将该任务插入等待序列Block(CALLER);/将该任务状态改为等待态(阻塞任务)endSignal(S):S.value:=S.value+1;/任务使用完共享资源,将信号量的值加1,释放一个信号量ifS.value=0/如果信号量为负,表示仍有等待该资源的任务被阻塞thenbeginRemove(S.L,id);/将等待队列中的一个任务从队列中移除wakeup(id);/将该任务的状态修改为就绪态,唤醒任务endS的绝对值表示在该信号量列表中已阻塞的任务数目,计数信号量,计数信号量使用实例:有界缓冲问题,计数信号量,VarE,F:Semaphore;mutex:binarySemaphore;begin(*mainprogram*)F:=0;E:=n;mutex=1;parbeginproducer1;producern;consumer1;consumerm;parendend,生产者任务beginrepeat生产数据/生产者生产数据Wait(E);/减少一个空缓冲区项Wait(mutex);/分配空缓冲区和移动指针P操作是互斥的“分配空缓冲区并调整指针P的临界段”;“向空缓冲区中装入数据”Signal(mutex);/释放互斥信号量Signal(F);/增加一个满缓冲区项foreverend,消费者任务beginrepeat消费数据/消费者取走数据Wait(F);/减少一个满缓冲区项Wait(mutex);/分配满缓冲区和移动指针C操作是互斥的“分配满缓冲区并调整指针C的临界段”;“从满缓冲区中取走数据”Signal(mutex);/释放互斥信号量Signal(F);/增加一个空缓冲区项foreverend,计数信号量,信号量机制的主要数据结构,信号量机制的主要数据结构,信号量控制块:管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块互斥和二值信号量控制块结构:Binary_Semaphore_Control_Block,wait_queue任务等待队列attributes信号量属性lock_nesting_behavior试图嵌套获得时的规则wait_discipline任务等待信号量的方式priority_ceiling优先级天花板值lock是否被占有holder拥有者nest_count嵌套层数,计数信号量控制结构Counting_Semaphore_Control_Blockwait_queue任务等待队列attributes计数信号量属性maximum_count最大计数值wait_discipline任务等待信号量的方式count当前计数值,信号量机制的主要数据结构,典型的信号量操作,创建信号量获取(申请)信号量释放信号量删除信号量清除信号量的任务等待列表获取有关信号量的各种信息,创建信号量,功能:根据应用传递的参数创建一个信号量参数:信号量的名字、属性和初始值等。内核动作:从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。创建成功时,为其分配唯一的ID号返回给应用。如果已创建信号量数量已达到用户配置的最大数量,就返回错误。,信号量的属性,信号量的属性,信号量的类型,互斥信号量(MUTEX_SEMAPHORE),计数信号量(COUNTING_SEMAPHORE),二值信号量(BINARY_SEMAPHORE),任务等待信号量的方式,先进先出(FIFO)顺序,优先级(PRIORITY)顺序,优先级反转问题的解决方法(只适用于互斥信号量),优先级继承算法(INHERIT_PRIORITY),优先级天花板算法(PRIORITY_CEILING),需给出所有可能获得此信号量的任务中优先级最高的任务的优先级。,获取(申请)信号量,功能:试图获得应用指定的信号量。该功能流程如下:if信号量的值大于0then将信号量的值减1else根据接收信号量的选项,将任务放到等待队列中,或是直接返回,获取(申请)信号量,当所申请的信号量不能被立即获得时,可以有以下几种选择:永远等待不等待,立即返回,并返回一个错误状态码指定等待时限(可有效避免死锁)注意:不允许在ISR中选择等待当任务选择等待时,将被按FIFO或优先级顺序放置在等待队列中,释放信号量,功能:释放一个应用指定的信号量。if没有任务等待这个信号量then信号量的值加1else将信号量分配给一个等待任务(将相应的任务移出等待队列,使其就绪)如果使用了优先级继承或优先级天花板算法,那么执行该功能(系统调用)的任务的优先级将恢复到原来的高度。,删除信号量,功能:从系统中删除应用指定的一个信号量内核动作:将信号量控制块返还给系统删除信号量的不一定是创建信号量的任务如果有任务正在等待获得该信号量,执行此功能将使所有等待这个信号量的任务回到就绪队列中,且返回一个状态码指示该信号量已被删除,清除信号量的任务等待列表,为了清除等待一个信号量的所有任务,某些内核支持Flush操作,以便释放信号量等待任务列表中的所有任务。当多个任务的执行必须在某些点相遇时,需要这样的机制。,第二节邮箱和消息队列,通信方式概述消息队列机制的主要数据结构典型的消息队列操作,任务间的通信方式,任务间的通信方式:直接通信间接通信消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空。消息进一步分为:邮箱和消息队列,消息队列机制的主要数据结构,消息队列及其相关的参数和支持数据结构,发送和接收消息的消息拷贝和内存使用这种消息传递方法效率低、占用空间大一种效率更高的方式是传递消息指针,消息的发送或接收的两种方法,number_of_message,max_message_count,消息队列控制块,消息队列缓冲区,消息队列机制的主要数据结构,消息队列的环形缓冲,消息队列机制的主要数据结构,max_message_count,queue_end,queue_start,queue_out,number_of_message,queue_in,消息指针,消息队列状态图,非空,满,队列创建消息数为0,消息队列状态图,消息发送消息数加1,空,消息发送消息数为1,消息接收消息数为0,消息接收消息数减1,消息接收消息数减1,消息发送消息数等于队列长度,典型的消息队列操作,创建消息队列发送普通消息发送紧急消息发送广播消息接收消息删除消息队列获取有关消息队列的各种信息,创建消息队列,创建消息队列时,调用者可以指定如下参数:消息的最大长度每个消息队列中最多的消息数消息队列的属性任务等待消息时的排队方式:FIFO或PRIORITY系统为新创建的消息队列分配唯一的ID,发送消息,接收消息,删除消息队列,从系统中删除指定的消息队列,释放消息队列控制块及消息队列缓冲区。任何知道此消息队列ID号的代码都可以删除它。消息队列被删除后,所有等待从这个消息队列接收消息的任务得到一个错误信息表明消息队列已被删除都回到并回到就绪态。,消息队列的其他典型使用,紧耦合的单向数据通信:发送任务发送消息后要求一个响应信号,表明接收任务已经成功接收到消息。,消息队列的其他典型使用,紧耦合的双向数据通信:如果数据需要在任务之间双向流动,则可以采用紧耦合的双向数据通信模式(也称为全双工通信)。,第三节管道,概述管道机制的主要数据结构典型的管道操作管道机制的典型应用,管道机制概述,管道(pipe)是提供非结构化数据交换和实现任务间同步的内核对象。在传统的实现中,管道是单向数据交换设施。,Task1,Task2,管道,管道中的数据,写描述符,读描述符,向管道写数据,从管道读数据,数据在管道内像一个非结构字节流,按FIFO的次序从管道中读出。当管道空时,阻塞读者,当管道满时,阻塞写者。,管道机制概述,管道允许有多个读者和写者。,管道,管道的状态转换图,非空,满,创建管道无写入数据,读数据,有剩余数据,空,写数据,读数据,无数据留下,写数据,有剩余空间,读数据,写数据,无剩余空间,管道机制的主要数据结构,典型的管道操作,选择(Select)操作Select操作允许一个任务阻塞并等待一个或多个管道上的一个指定条件的发生。,Task1,ISR,Task2,Task3,任务Task3等待从Pipe1和Pipe2这两个管道读数据并写到第三个管道Pipe3上。在这种情况下,当头两个管道中的任意一个有数据时,Select调用返回。,管道机制的典型应用,TaskA,TaskB,Select操作,Select操作,管道C,管道D,任务A和任务B打开两个管道作为任务间的通信方式:打开管道C作为从任务A到任务B的数据传输,打开管道D作为从任务B到任务A的回应。任务A等待管道C编程可写,也等待管道D上来自任务B的回应。,两个任务之间的同步,管道主要用于任务到任务或ISR到任务的数据传输,第四节事件,概述事件机制的主要数据结构典型的事件操作事件机制的典型应用,在嵌入式实时内核中,事件是指一种表明预先定义的系统事件已经发生的机制。事件机制用于任务与任务之间、任务与ISR之间的同步。其主要的特点是可实现一对多的同步。一个事件就是一个标志,不具备其它信息。一个或多个事件构成一个事件集。事件集可以用一个指定长度的变量(比如一个8bit,16bit或32bit的无符号整型变量,不同的操作系统其具体实现不一样)来表示,而每个事件由在事件集变量中的某一位来代表。,概述,事件及事件集有以下特点:事件间相互独立事件仅用于同步,不提供数据传输功能事件无队列,即多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。提供事件机制的意义在于:当某任务要与多个任务或中断服务同步时,就需要使用事件机制。若任务需要与一组事件中的任意一个发生同步,可称为独立型同步(逻辑“或”关系)。任务也可以等待若干事件都发生时才同步,称为关联型同步(逻辑“与”关系)。,概述,“或”同步和“与”同步,概述,任务,任务,任务,任务,ISR,ISR,OR,AND,“与”型同步,“或”型同步,事件集,事件集,POST,POST,PEND,PEND,用多个事件的组合发信号给多个任务,概述,任务,任务,任务,ISR,OR,AND,事件集,事件集,事件集(8,16或32位),POST,PEND,PEND,术语:发送事件集。指在一次发送过程中发往接收者(比如任务)的一个或多个事件的组合。待处理事件集。指已被发送到一个接收者但还没有被接收(即正在等待处理)的所有事件的集合。事件条件。指事件接收者在一次接收过程中期待接收的一个或多个事件的集合。“或”同步:待处理事件集只要包括事件条件中的任一事件即可满足要求;“与”同步:其二是待处理事件集必须包括事件条件中的全部事件方可满足要求。,概述,事件机制的主要数据结构,(1)事件集控制块结构(Event_set_Control_Block):attribute事件集的属性(排队方式:FIFO或PRIORITY)event_set当前事件集(指示被置位且未被接受的事件标志位)eventset_condition_queue_and事件集”与”等待队列eventset_condition_queue_or事件集”或”等待队列内核为每个等待事件集的任务生成一个“任务事件集等待控制块”(2)任务事件集等待控制块结构(Event_set_Task_Waited_Buddy)task等待任务的控制块指针event_set任务当前等待的事件集flag_node_array任务等待标志节点数组任务等待标志节点数组的长度等于事件集的位数,其中每个节点元素对应一个等待的事件标志,典型的事件操作,创建事件集删除事件集发送事件(集)接收事件(集)获取有关事件集的各

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论