《实时操作系统同步互斥与通信.pptx》由会员分享,可在线阅读,更多相关《实时操作系统同步互斥与通信.pptx(134页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实时操作系统同步互斥与通信实时操作系统同步互斥与通信 并发的进程之间的协作包括如下类型:进程互斥进程互斥 多个进程不能同时使用同一个资源,某个进程使用多个进程不能同时使用同一个资源,某个进程使用该资源时,其他进程必须等待。保证各个进程不同时进该资源时,其他进程必须等待。保证各个进程不同时进入临界区,有效访问临界资源。入临界区,有效访问临界资源。进程同步进程同步 多个进程的调用存在时序关系,多个进程的调用存在时序关系,某些进程的执行必须先于另一些某些进程的执行必须先于另一些进程。保证进程运行的合理顺。进程。保证进程运行的合理顺。进程通信进程通信 多个进程之间传递消息。多个进程之间传递消息。互斥和
2、同步是进程并发的两个要素概述第1页/共133页ISR xTask yPOSTPEND任务与任务与任务与任务与ISRISR之间的同之间的同之间的同之间的同步(单向)步(单向)步(单向)步(单向)Task xTask yPOSTPENDPOSTPEND任务与任务任务与任务任务与任务任务与任务之间的同步之间的同步之间的同步之间的同步(双向)(双向)(双向)(双向)任务与任务任务与任务任务与任务任务与任务之间的同步之间的同步之间的同步之间的同步(单向)(单向)(单向)(单向)Task xTask yPOSTPEND概述第2页/共133页进程互斥与同步考虑下面一个字符回显的的过程考虑下面一个字符回显的的
3、过程考虑下面一个字符回显的的过程考虑下面一个字符回显的的过程 void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putchar(chout);从键盘获得输入,每击一下键,输入字符就保存在变量从键盘获得输入,每击一下键,输入字符就保存在变量从键盘获得输入,每击一下键,输入字符就保存在变量从键盘获得输入,每击一下键,输入字符就保存在变量chinchin中,然后传送给变量中,然后传送给变量中,然后传送给变量中,然后传送给变量choutchout,并回送显示器,并回送显示器,
4、并回送显示器,并回送显示器任何程序可以重复地调用此过程,接收用户输入,并在用户任何程序可以重复地调用此过程,接收用户输入,并在用户任何程序可以重复地调用此过程,接收用户输入,并在用户任何程序可以重复地调用此过程,接收用户输入,并在用户的屏幕上显示的屏幕上显示的屏幕上显示的屏幕上显示第3页/共133页考虑一个支持单用户单处理器、考虑一个支持单用户单处理器、多道程序设计系统多道程序设计系统l l将其当作一个共享过程,载入到所将其当作一个共享过程,载入到所将其当作一个共享过程,载入到所将其当作一个共享过程,载入到所有应用程序公用的全局存储区中。有应用程序公用的全局存储区中。有应用程序公用的全局存储区
5、中。有应用程序公用的全局存储区中。这样每个应用程序都能使用这个过这样每个应用程序都能使用这个过这样每个应用程序都能使用这个过这样每个应用程序都能使用这个过程,由于每个应用程序只需使用程,由于每个应用程序只需使用程,由于每个应用程序只需使用程,由于每个应用程序只需使用echoechoechoecho过程的一个副本,从而节省空过程的一个副本,从而节省空过程的一个副本,从而节省空过程的一个副本,从而节省空间间间间进程间共享主存是非常有用的,它允许进程间有效而紧进程间共享主存是非常有用的,它允许进程间有效而紧进程间共享主存是非常有用的,它允许进程间有效而紧进程间共享主存是非常有用的,它允许进程间有效而
6、紧密的交互,有利于进程的相互通信。但是,共享也可能密的交互,有利于进程的相互通信。但是,共享也可能密的交互,有利于进程的相互通信。但是,共享也可能密的交互,有利于进程的相互通信。但是,共享也可能会带来一些问题会带来一些问题会带来一些问题会带来一些问题 void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putchar(chout);进程互斥与同步第4页/共133页 getchargetchar()()()()chinchinchoutchout putcharputch
7、ar()()()()P1P2getchargetchar()()XXgetchargetchar()()YYYputcharputchar()()Y YYY Y?echoecho void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putchar(chout);第5页/共133页P1 void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putch
8、ar(chout);调用调用echoecho超时,就绪超时,就绪P2调用调用echoecho资源资源正忙正忙阻塞状态阻塞状态调度运行调度运行释放释放echoecho唤 醒获取资源获取资源就绪状态就绪状态调度运行调度运行第6页/共133页在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:l l信号量信号量(semaphoresemaphore),用于互斥与同步),用于互斥与同步l l事件(组)事件(组)(event groupevent group),用于同步),用于同步l l异步信号异步信号(asynchronous signalasynchronous signal),
9、用于同),用于同步步l l邮箱邮箱(mailboxmailbox)、)、消息队列消息队列(message message queuequeue),用于消息通信),用于消息通信l l管道管道(pipepipe),提供非结构化数据交换和实),提供非结构化数据交换和实现同步现同步 概述第7页/共133页l l忙等待模型忙等待模型 持续检查一个变量,直到它可用为止持续检查一个变量,直到它可用为止l l睡眠睡眠-唤醒模型唤醒模型 通过通过PVPV原语操作保证进程间的互斥原语操作保证进程间的互斥l l消息传递模型消息传递模型 通过消息传送系统实现多进程之间的互斥通过消息传送系统实现多进程之间的互斥进程互斥
10、和同步的经典解决机制第8页/共133页第一节第一节信号量信号量信号量的种类及用途信号量的种类及用途信号量的定义信号量的定义互斥信号量互斥信号量二值信号量二值信号量计数信号量计数信号量信号量机制的主要数据结构信号量机制的主要数据结构典型的信号量操作典型的信号量操作第9页/共133页临界资源和临界区操作系统把一次仅允许一个进程使用的资源操作系统把一次仅允许一个进程使用的资源称为临界资源。称为临界资源。一个进程中访问临界资源的那段程序称为临一个进程中访问临界资源的那段程序称为临界区。界区。第10页/共133页进程进程P1和和P2共享同一打印机资共享同一打印机资源,其操作流程如下:源,其操作流程如下:
11、p1:entry codep1:entry code使用打印使用打印机机exit codeexit code p2:entry code p2:entry code使用打印使用打印机机exit codeexit code系统打印机即为系统打印机即为临界资源临界资源P1和和p2的访问临界资源打印机的访问临界资源打印机的代码即为的代码即为临界区临界区临界资源和临界区第11页/共133页临界区临界资源 进程进程P1 P1 进程进程P2P2 R1 R1 countcount;R2=;R2=countcount;R1+;R2+;R1+;R2+;count=R1;count=R2;count=R1;cou
12、nt=R2;(设count的初始值为5)为互斥地使用临界资源,需保证进程互斥地进入临界区。临界资源和临界区第12页/共133页临界区的进入准则l l空闲让进空闲让进:临界资源空闲时,允:临界资源空闲时,允许进程进入临界区许进程进入临界区l l忙着等待忙着等待:临界资源正在被访问:临界资源正在被访问时,其他需要进入临界区的进程时,其他需要进入临界区的进程必须等待必须等待l l有限等待有限等待:保证进程在有效的时:保证进程在有效的时间内进入临界区,避免间内进入临界区,避免“死等死等”l l让权等待让权等待:当进程不能进入临界:当进程不能进入临界区时,应立即释放处理机,以免区时,应立即释放处理机,以
13、免其它进程其它进程“忙等忙等”临界资源和临界区第13页/共133页进程互斥进入临界区的实现方法l l硬件方法硬件方法 禁止中断禁止中断l l在进程进入临界区之后,禁止该进程在进程进入临界区之后,禁止该进程中断中断 专用机器指令专用机器指令l lTSTS指令,指令,SwapSwap指令指令l l软件方法软件方法 信号量和信号量和PVPV操作操作临界资源和临界区第14页/共133页信号量是一个数据结构,其定义如下:struct semaphore int value;struct PCB *queue;信号量semaphore包括一个整型值和一个等待队列。信号量只能通过P原语和V原语访问。什么是信
14、号量第15页/共133页什么是信号量信号量被定义为一个整形变量,在其上定义了以下三个操作:信号量被定义为一个整形变量,在其上定义了以下三个操作:1 1、可以被初始化一个非负数、可以被初始化一个非负数2 2、waitwait操作(操作(P P操作操作)将信号量的值减)将信号量的值减1 1后,若该值为负,后,若该值为负,则执行则执行waitwait操作的任务等待操作的任务等待3 3、signalsignal操作(操作(V V操作操作)将信号量的值增)将信号量的值增1 1后,若该值为非正,后,若该值为非正,则执行则执行signalsignal操作的任务唤醒操作的任务唤醒 第16页/共133页P 原语
15、 P(S)S:=S-1S:=S-1;如果如果 S =0S =0,则表示有资源,该进程继续执则表示有资源,该进程继续执行;行;如果如果 S 0S 0S=S-1返回返回调用进程进入等待队列调用进程进入等待队列转进程调度转进程调度是否第18页/共133页P原语操作原型 void wait(semaphore s)/s.value=s.value 1;if(s.value 0S 0,则该进程继续执行,则该进程继续执行 如果如果 S S 0 0,说明有进程被挂起,则唤醒一阻塞,说明有进程被挂起,则唤醒一阻塞进程,即从进程,即从S S信号量的等待队列首摘下一个信号量的等待队列首摘下一个PCBPCB,将其置
16、为就绪状态,执行,将其置为就绪状态,执行 V(S)V(S)者继续执行者继续执行6 6P P操作可能会引起进程的阻塞,操作可能会引起进程的阻塞,V V操作不会引起本操作不会引起本身进程状态的变化,但可能唤醒其他进程,使其身进程状态的变化,但可能唤醒其他进程,使其从阻塞状态转变到就绪状态从阻塞状态转变到就绪状态V原语第20页/共133页V原语(1)若信号量S的等待队列中有等待进程,则取队首进程,将其置为就绪状态并返回。(2)否则信号量S加1,并放回V原语原语是否有等待进程是否有等待进程S=S+1返回返回取队首进程置为就绪态取队首进程置为就绪态否是第21页/共133页V原语操作原型 void sig
17、nal(semaphore s)s.value=s.value+1;if(s.value=1)if(value=1)value=value 1;value=value 1;count=value;count=value;/打印一张机票;打印一张机票;else else /显示机票已售完显示机票已售完;V(mutex);V(mutex);临界区信号量实现进程互斥第33页/共133页用信号量实现任务间的互斥var mutex:Shared Semaphore;var mutex:Shared Semaphore;begin begin mutex:=1;mutex:=1;parbeginparbe
18、gin P1:P1:P2:P2:Pi:repeat Pi:repeat Wait(mutex);Wait(mutex);“进进程程PiPi的的临临界代界代码码段段”;Signal(mutex);Signal(mutex);forever forever Pn:Pn:parendparend end endTask1Task2共享资源共享资源第34页/共133页互斥信号量 WaitB(S):WaitB(S):/申请信号量申请信号量申请信号量申请信号量if S.value1;/if S.value1;/当前没有其他任务使用信号量当前没有其他任务使用信号量当前没有其他任务使用信号量当前没有其他任务使
19、用信号量 then then S.value=S.value-1=0/S.value=S.value-1=0/将信号量值修改为将信号量值修改为将信号量值修改为将信号量值修改为0 0,独占共享资源,独占共享资源,独占共享资源,独占共享资源else begin else begin Insert(CALLER,S.L);/Insert(CALLER,S.L);/如果当前有其他任务使用信号量,将该任务放入等待如果当前有其他任务使用信号量,将该任务放入等待如果当前有其他任务使用信号量,将该任务放入等待如果当前有其他任务使用信号量,将该任务放入等待 队列队列队列队列 Block(CALLER);/Blo
20、ck(CALLER);/修改该任务的状态为等待态(阻塞任务)修改该任务的状态为等待态(阻塞任务)修改该任务的状态为等待态(阻塞任务)修改该任务的状态为等待态(阻塞任务)endendSignalB(S):/SignalB(S):/释放信号量释放信号量释放信号量释放信号量if S.L queue is empty;/if S.L queue is empty;/如果等待序列为空,没有其他任务等待使用该共享资源如果等待序列为空,没有其他任务等待使用该共享资源如果等待序列为空,没有其他任务等待使用该共享资源如果等待序列为空,没有其他任务等待使用该共享资源 thenthen S.value=1;/S.v
21、alue=1;/释放信号量释放信号量释放信号量释放信号量else begin else begin Remove(S.L,id);/Remove(S.L,id);/如果有其他任务等待使用该共享资源,则从等待队列中如果有其他任务等待使用该共享资源,则从等待队列中如果有其他任务等待使用该共享资源,则从等待队列中如果有其他任务等待使用该共享资源,则从等待队列中 将该任务移除将该任务移除将该任务移除将该任务移除 wakeup(id);/wakeup(id);/将该任务的状态改为就绪态将该任务的状态改为就绪态将该任务的状态改为就绪态将该任务的状态改为就绪态(唤醒任务唤醒任务唤醒任务唤醒任务)endend
22、第35页/共133页互斥信号量状态图互斥信号量状态图互斥信号量状态图互斥信号量状态图开启开启锁定锁定初始化初始化值为值为1申请并获得申请并获得值为值为0释放释放值为值为1申请申请(递归递归)并获得并获得锁定数加锁定数加1释放释放(递归递归)锁定数减锁定数减1第36页/共133页各种互斥机制比较比较项目比较项目关中断关中断使用测试并置使用测试并置位指令位指令禁止任务禁止任务切换切换使用信号量使用信号量锁定范围锁定范围互互斥斥力力度度最最强强,锁定所有外部可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行凡是使用该指令访问共享资源的代码所有的任务只只影影响响竞竞争争
23、共共享资源的任务享资源的任务对系统响应时对系统响应时间的影响间的影响如果关中断的时间较长,对系统的响应性能有很大影响较小如果禁止切换的时间过长,则影响系统的响应性能对对系系统统响响应应性性能能有有一一定定影影响响,可可能能导导致致优优先先级级反反转转实现时的系统实现时的系统开销开销小小小较大较大注意事项注意事项关关中中断断时时间间要要尽量短尽量短不不是是所所有有的的处处理理器器都都具具备备这这种种指指令令,影影响响可可移移植植性性关关调调度度的的时时间间要尽量短要尽量短需需采采用用一一定定的的策策略略解解决决优优先先级反转问题级反转问题第37页/共133页二值信号量可获得可获得不可获得不可获得
24、申请并获得申请并获得(值为值为0)释放释放(值为值为1)初始化初始化值为值为0二值信号量状态图二值信号量状态图第38页/共133页例如:有两个程序段S1和S2,要求S1先于S2执行。semaphore mutex=0;P1进程:S1;V(mutex);/唤醒进程P2;P2进程:P(mutex);/等待P1执行;S2;二值信号量实现同步 第39页/共133页Task1()执行一些操作执行一些操作;将信号量将信号量sem1置置1;申请信号量申请信号量sem2;Task2()申请信号量申请信号量sem1;执行一些操作执行一些操作;将信号量将信号量sem2置置1;Task2申申请请信信号号量量sem1
25、失失败败,系系统统切换到切换到Task1sem1被被 置置 1后后,Task2得得 到到 sem1并并抢占抢占Task1Task2运运行行到到某某处处时时因因某某种种原原因因被被阻阻塞塞,系系统统切切换换到到Task1用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步 Task2Task2优先级高于优先级高于优先级高于优先级高于Task1Task1 sem1sem1和和和和sem2sem2的初始值均为的初始值均为的初始值均为的初始值均为0 0二值信号量实现同步 第40页/共133页计数信号量T
26、ask1Task2共享资源实例共享资源实例nTask m共享资源实例共享资源实例1第41页/共133页计数信号量计数信号量状态图计数信号量状态图可获得可获得不可获得不可获得初始化初始化值大于值大于0申请并获得申请并获得值为值为0释放释放值为值为1申请并获得申请并获得值减值减1释放释放值加值加1第42页/共133页计数(一般)信号量同步原语Wait(S):Wait(S):S.value:=S.value-1;/S.value:=S.value-1;/有新任务来使用共享资源将信号量的值减有新任务来使用共享资源将信号量的值减1 1 if S.value0 /if S.value0 /如果信号量的值为
27、负,表示共享资源已经分配完毕如果信号量的值为负,表示共享资源已经分配完毕 then begin then begin Insert(CALLER,S.L);/Insert(CALLER,S.L);/将该任务插入等待序列将该任务插入等待序列 Block(CALLER);/Block(CALLER);/将该任务状态改为等待态将该任务状态改为等待态(阻塞任务阻塞任务)end endSignal(S):Signal(S):S.value:=S.value+1;/S.value:=S.value+1;/任务使用完共享资源,将信号量的值加任务使用完共享资源,将信号量的值加1 1,释放,释放 一个信号量一个
28、信号量 if S.value=0 /if S.value 1 then if count 1 then V(entry)V(entry);P(wait);P(wait);else V(entry);V(barber);“Shave”P(entry);count:=count 1;if count 0 then V(wait);V(entry);理发室理发室椅子椅子入口入口出口出口等候室等候室第66页/共133页barberbarber信号量队列信号量队列waitwait信号量队列信号量队列entryentry信号量队列信号量队列理发师理发师P P(barberbarber)PPPP(entry
29、entry)P P(entryentry)countcount=0=0=1=1v v(entryentry)唤唤醒醒count=1count=1v v(entryentry)Count=2Count=2P P(waitwait)V V(barberbarber)第67页/共133页理发师barber信号量队列wait信号量队列entry信号量队列P(entry)count=5V(entry)P(entry)count=5count=4V(entry)V(wait)V(barber)第68页/共133页信号量机制的主要数据结构SCB1SCB2信号量控制块信号量控制块count信号量名字或信号量名
30、字或IDTask1Task2任务等待列表任务等待列表第69页/共133页信号量机制的主要数据结构信号量控制块信号量控制块:管理所有创建的信号量,内核在系统管理所有创建的信号量,内核在系统运行时动态分配和回收信号量控制块运行时动态分配和回收信号量控制块互斥和二值信号量控制块结构互斥和二值信号量控制块结构:Binary_Semaphore_Control_BlockBinary_Semaphore_Control_Blockwait_queue任务等待队列任务等待队列attributes信号量属性信号量属性lock_nesting_behavior 试试图图嵌嵌套套获获得得时时的的规规则则 wai
31、t_discipline 任务等待信号量的方式任务等待信号量的方式priority_ceiling 优先级天花板值优先级天花板值lock是否被占有是否被占有holder拥有者拥有者 nest_count嵌套层数嵌套层数第70页/共133页计数信号量控制结构计数信号量控制结构Counting_Semaphore_Control_Block wait_queue wait_queue任务等待队列任务等待队列任务等待队列任务等待队列 attributesattributes计数信号量属性计数信号量属性计数信号量属性计数信号量属性 maximum_countmaximum_count 最大计数值最大计
32、数值最大计数值最大计数值 wait_disciplinewait_discipline任务等待信号量的方式任务等待信号量的方式任务等待信号量的方式任务等待信号量的方式 countcount当前计数值当前计数值当前计数值当前计数值信号量机制的主要数据结构第71页/共133页典型的信号量操作创建信号量获取(申请)信号量释放信号量删除信号量清除信号量的任务等待列表 获取有关信号量的各种信息 第72页/共133页创建信号量功能功能:根据应用传递的参数创建一个信号量:根据应用传递的参数创建一个信号量参数参数:信号量的名字、属性和初始值等。:信号量的名字、属性和初始值等。内核动作内核动作:l l从空闲信号
33、量控制块链中分配一个信号量控制从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。块,并初始化信号量属性。l l创建成功时,为其分配唯一的创建成功时,为其分配唯一的IDID号返回给应用。号返回给应用。l l如果已创建信号量数量已达到用户配置的最大如果已创建信号量数量已达到用户配置的最大数量,就返回错误。数量,就返回错误。第73页/共133页信号量的属性信信号号量量的的属属性性信号量的类型互斥信号量(互斥信号量(MUTEX_SEMAPHORE)计数信号量(计数信号量(COUNTING_SEMAPHORE)二值信号量(二值信号量(BINARY_SEMAPHORE)任务等待信号量的方式先
34、进先出(先进先出(FIFO)顺序)顺序优先级(优先级(PRIORITY)顺序)顺序优先级反转问题的解决方法(只适用于互斥信号量)优先级继承算法(优先级继承算法(INHERIT_PRIORITY)优先级天花板算法优先级天花板算法(PRIORITY_CEILING),需给出所有可能获得此信号量的任务中优先级需给出所有可能获得此信号量的任务中优先级最高的任务的优先级。最高的任务的优先级。第74页/共133页获取(申请)信号量功能:试图获得应用指定的信号量。该功能流程如下:if if 信号量的值大于信号量的值大于0 0then then 将信号量的值减将信号量的值减1 1else else 根根据据接
35、接收收信信号号量量的的选选项项,将任务放到等待将任务放到等待 队列中,或是直接返回队列中,或是直接返回第75页/共133页获取(申请)信号量当所申请的信号量不能被立即获得时,可以有以下几种选择:l l永远等待永远等待 l l不等待,立即返回,并返回一个不等待,立即返回,并返回一个错误状态码错误状态码l l指定等待时限(可有效避免死锁)指定等待时限(可有效避免死锁)注意:注意:l l不允许在不允许在ISRISR中选择等待中选择等待l l当任务选择等待时,将被按当任务选择等待时,将被按FIFOFIFO或或优先级顺序优先级顺序放置在等待队列中放置在等待队列中第76页/共133页释放信号量功能:释放一
36、个应用指定的信号量。if if 没有任务等待这个信号量没有任务等待这个信号量then then 信号量的值加信号量的值加1 1 else else 将将信信号号量量分分配配给给一一个个等等待待任务(将相应的任务任务(将相应的任务 移出等待队列,使其就绪移出等待队列,使其就绪)如果使用了优先级继承或优先级天花板算法,那么执行该功能(系统调用)的任务的优先级将恢复到原来的高度。第77页/共133页删除信号量功能:从系统中删除应用指定的一个信号量内核动作:将信号量控制块返还给系统删除信号量的不一定是创建信号量的任务如果有任务正在等待获得该信号量,执行此功能将使所有等待这个信号量的任务回到就绪队列中,
37、且返回一个状态码指示该信号量已被删除第78页/共133页清除信号量的任务等待列表为了清除等待一个信号量的所有任务,某些内核支持Flush操作,以便释放信号量等待任务列表中的所有任务。当多个任务的执行必须在某些点相遇时,需要这样的机制。SignalTaskTask2 二值信号量二值信号量初值为初值为0FlushTask1Task3第79页/共133页第二节邮箱和消息队列通信方式概述通信方式概述消息队列机制的主要数据结构消息队列机制的主要数据结构典型的消息队列操作典型的消息队列操作第80页/共133页任务间的通信方式消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实
38、际的数据、数据块的指针或空。为了能高效率地实现进程通信,操作系统设计了多种高级通信原语send(A)原语和receive(A)原语第81页/共133页消息send(A)(读取消息)原语 send(A)send(A)原语用来发送消息,原语用来发送消息,A A是发送进程提供的是发送进程提供的发送区起始地址发送区起始地址 send(A)send(A)原语先申请一个消息缓冲区,然后把发原语先申请一个消息缓冲区,然后把发送区的内容复制到消息缓冲区中。然后找到接收送区的内容复制到消息缓冲区中。然后找到接收进程的进程的PCBPCB,把消息缓冲区连入接收进程的消息缓把消息缓冲区连入接收进程的消息缓冲区队列中冲
39、区队列中 代码代码第82页/共133页消息procedure sendprocedure send(A A););benginbengin new new(p p););p.sptr=address of sends PCB;p.sptr=address of sends PCB;mov message to buffer p;mov message to buffer p;find the receives PCB;find the receives PCB;p(mutex);p(mutex);add the buffer p to the massage queue;add the buf
40、fer p to the massage queue;v(sm);v(sm);v(mutex);v(mutex);endend;第83页/共133页消息receive(A)(读取消息)原语 receive(A)receive(A)原语用来读取消息,原语用来读取消息,A A是接收进程提是接收进程提供的接收区起始地址供的接收区起始地址 receive(A)receive(A)原语把消息缓冲区中的消息内容、消原语把消息缓冲区中的消息内容、消息长度以及发送进程的名字息长度以及发送进程的名字读取到接收区读取到接收区,然后,然后把消息缓冲区从链表中去掉,并把消息缓冲区从链表中去掉,并释放消息缓冲区释放消息
41、缓冲区 如果没有消息可读取,则阻塞接收进程,直至消如果没有消息可读取,则阻塞接收进程,直至消息发送来为止息发送来为止第84页/共133页消息procedure receive(A)bengin P(Sm);p(mutex);move out a buffer F from the message queue of the Receive;v(mutex);move senders name and text from buffer F to receiber;end;第85页/共133页进程进程p psend发送区(消息)进程进程进程进程q q q qreceive接受区接受区接受区接受区(消
42、息)(消息)(消息)(消息)hptrmutexsmP PC CB Bsptrnptrtextsptrnulltextaddpnulltextpaddpnulltextpnptr第86页/共133页消息消息通信的分类:直接通信方式直接通信方式 发送进程直接把消息发送到目标进程发送进程直接把消息发送到目标进程 Send(PSend(P,message)message)发送一个消发送一个消息到任务息到任务P P Receive(QReceive(Q,message)message)从任务从任务QQ接接收一个消息收一个消息 间接通信方式,也叫信箱通信方式间接通信方式,也叫信箱通信方式 进程间的通信需要
43、通过作为某种共享数据结构的进程间的通信需要通过作为某种共享数据结构的实体信箱。实体信箱。send(Asend(A,message)message)发送一个消息发送一个消息给邮箱给邮箱A A receive(Areceive(A,message)message)从邮箱从邮箱A A接接收一个消息收一个消息消息、消息队列、邮箱消息、消息队列、邮箱第87页/共133页内核一般提供以下邮箱服务:消息邮箱与信号量最大的区别:消息邮箱可以存放一条完整的内容信息,而用信号量进行行为同步时,只能提供同步时刻的信息,不能提供内容信息。如果邮箱内有消息,则任务将消息从邮箱中取走;如果邮箱内没有消息,则内核不将该任务
44、挂起(ACCEPT),返回空指针。内核内核 POST内容初始化PENDACCEPT邮箱内消息的内容初始化,此时邮箱内是否有消息并不重要;等待有消息进入邮箱(PEND);将消息放入邮箱(POST);消息邮箱消息邮箱第88页/共133页消息邮箱消息邮箱满满消息指针消息指针消息指针消息指针PCPCPCPC空空 一般来说,消息邮箱只有2种状态:即空状态(消息邮箱中没有消息)、满状态(消息邮箱中存放了消息)。消息邮箱的状态消息邮箱的状态第89页/共133页消息邮箱满满消息邮箱PPCC空空发送消息指针发送消息指针1.向消息邮箱发送消息有任务在等待消息有任务在等待消息等待列表中最等待列表中最高优先级的任务高
45、优先级的任务运行状态运行状态就绪状态就绪状态 任务优先级足够高PC 获得消获得消息息注意:如果发送消息指针是以广播的形式发送,那么所有等待此消息的任务都获得消息发送消息指针发送消息指针无任务在等待消息无任务在等待消息PCPPCC返回错误码说明消息邮箱已满 操作成功PC发送失败OSMboxPost()对应以上3种情形消息邮箱消息邮箱第90页/共133页消息邮箱满满空空2.从消息邮箱接收消息等待消息指针等待消息指针PCPPCC操作成功 延时等待消息延时等待消息延时中获得消息,操作成功 延时等待消息延时等待消息设定延时到,无消息,返回超时错误等待消息指针等待消息指针消息邮箱等待消息指针等待消息指针P
46、PCC空空消息邮箱满满另一个任务(或中断服务程序)向消息邮箱发出消息 PCOSMboxPend()对应以上3种情形消息邮箱消息邮箱第91页/共133页 消息队列就象一个类似于缓冲区的对象,通过消息队列任务和ISR发送和接收消息,实现数据的通信和同步。消息队列具有一定的容量,可以容纳多条消息,因此可以看成是多个邮箱的组合。消息指针1消息指针3消息指针2任务任务1PC任务任务2PCPCPCPCPC消息指针3消息指针2消息指针3FIFO 消息队列消息指针1消息指针3消息指针2任务任务1PC任务任务2PCPCPCPCPC提高消息在队列中的优先级实现LIFO算法 LIFO消息队列消息队列消息队列第92页
47、/共133页等待消息的到来(PEND);将消息放入队列中去(POST);无等待取得消息,如果消息队列中有消息,则任务将消息从消息队列中取走;如果消息队列为空,则内核不将该任务挂起,返回空指针。内核一般提供以下消息队列服务:与信号量和邮箱相比,消息队列的最大优点就是通过缓冲的方式来传递多个消息,从而避免了信息的丢失或混乱。内核内核 POST初始化PENDACCEPT消息队列初始化,队列初始化时总是清为空;消息队列消息队列第93页/共133页 一般来说,消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态
48、)。消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息队列消息指针消息指针消息指针消息队列消息队列空状态空状态正常状态正常状态满状态满状态消息队列消息队列第94页/共133页消息队列状态图消息队列状态图非空非空满满队列创建队列创建消息数为消息数为0消息队列状态图消息队列状态图消息发送消息发送消息数加消息数加1空空消息发送消息发送消息数为消息数为1消息接收消息接收消息数为消息数为0消息接收消息接收消息数减消息数减1消息接收消息接收消息数减消息数减1消息发送消息发送消息数等于队列长度消息数等于队列长度第95页/共133页消息队列机制的主要数据结构队列控制块队列控制块队列长度队列长
49、度QCB1队列名或队列名或IDTask3Task4接收任务等待列接收任务等待列表表Task1Task2发送任务等待列发送任务等待列表表最大最大消息消息长度长度QCB2消息队列及其相关的参数和支持数据结构消息队列及其相关的参数和支持数据结构 第96页/共133页发送消息指针发送消息指针1.向消息队列发送消息有任务在等待消息有任务在等待消息等待列表中最等待列表中最高优先级的任务高优先级的任务运行状态运行状态就绪状态就绪状态 任务优先级足够高PC 获得消息获得消息注意:如果发送消息指针是以广播的形式发送,那么所有等待此消息的任务都获得消息 当任务向消息队列中发送消息时,它首先判断是否有任务在等待消息
50、队列的消息。OSQPost()对应3种情形消息队列消息队列第97页/共133页未满未满发送消息指针发送消息指针无任务在等待消息无任务在等待消息PC返回错误码说明消息队列已满 操作成功PC 如果没有任务在等待消息队列的消息,那么就会再判断消息队列当前是否已满。消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息指针消息队列消息队列发送失败已满已满OSQPost()对应3种情形消息队列消息队列第98页/共133页100100消息指针消息指针2.从消息队列接收消息消息指针消息指针消息指针任务等待消息任务等待消息PC消息队列 消息队列中已存在消息,通过内核服务将消息传递