实时操作系统同步、互斥与通信.ppt
《实时操作系统同步、互斥与通信.ppt》由会员分享,可在线阅读,更多相关《实时操作系统同步、互斥与通信.ppt(134页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式实时操作系统及应用开发第六章 同步、互斥与通信主要内容概述信号量邮箱和消息队列管道事件 并发的进程之间的协作包括如下类型:进程互斥 多个进程不能同时使用同一个资源,某个进程使用该资源时,其他进程必须等待。保证各个进程不同时进入临界区,有效访问临界资源。进程同步 多个进程的调用存在时序关系,某些进程的执行必须先于另一些进程。保证进程运行的合理顺。进程通信 多个进程之间传递消息。互斥和同步是进程并发的两个要素概述ISR xTask yPOSTPEND任务与任务与任务与任务与ISRISR之间的同步之间的同步之间的同步之间的同步(单向)(单向)(单向)(单向)Task xTask yPOSTPE
2、NDPOSTPEND任务与任务任务与任务任务与任务任务与任务之间的同步之间的同步之间的同步之间的同步(双向)(双向)(双向)(双向)任务与任务任务与任务任务与任务任务与任务之间的同步之间的同步之间的同步之间的同步(单向)(单向)(单向)(单向)Task xTask yPOSTPEND概述进程互斥与同步考虑下面一个字符回显的的过程考虑下面一个字符回显的的过程 void echo()chin=getchar();chout=chin;putchar(chout);从键盘获得输入,每击一下键,输入字符就保存在变量从键盘获得输入,每击一下键,输入字符就保存在变量chin中,然后传送给变量中,然后传送给
3、变量chout,并回送显示器,并回送显示器任何程序可以重复地调用此过程,接收用户输入,并在用户的任何程序可以重复地调用此过程,接收用户输入,并在用户的屏幕上显示屏幕上显示考虑一个支持单用户单处理器、多道程序设计系统考虑一个支持单用户单处理器、多道程序设计系统将其当作一个共享过程,载入到所有应用程序公用的全局将其当作一个共享过程,载入到所有应用程序公用的全局存储区中。这样每个应用程序都能使用这个过程,由于每存储区中。这样每个应用程序都能使用这个过程,由于每个应用程序只需使用个应用程序只需使用echoecho过程的一个副本,从而节省空间过程的一个副本,从而节省空间进程间共享主存是非常有用的,它允许
4、进程间有效而紧进程间共享主存是非常有用的,它允许进程间有效而紧密的交互,有利于进程的相互通信。但是,共享也可能密的交互,有利于进程的相互通信。但是,共享也可能会带来一些问题会带来一些问题 void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putchar(chout);进程互斥与同步 getchargetchar()()()()chinchinchoutchout putcharputchar()()()()P1P2getchar()XXgetchar()YYYputc
5、har()YYY?echo void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putchar(chout);P1 void echo()void echo()chin=getchar();chin=getchar();chout=chin;chout=chin;putchar(chout);putchar(chout);调用调用echoecho超时,就绪超时,就绪P2调用调用echoecho资源资源正忙正忙阻塞状态阻塞状态调度运行调度运行释放释放echoecho唤 醒
6、获取资源获取资源就绪状态就绪状态调度运行调度运行在单处理器平台上,嵌入式操作系统内核提供的同步、互斥与通信机制主要包括:信号量(semaphore),用于互斥与同步事件(组)(event group),用于同步异步信号(asynchronous signal),用于同步邮箱(mailbox)、消息队列(message queue),用于消息通信管道(pipe),提供非结构化数据交换和实现同步 概述忙等待模型 持续检查一个变量,直到它可用为止睡眠-唤醒模型 通过PV原语操作保证进程间的互斥消息传递模型 通过消息传送系统实现多进程之间的互斥进程互斥和同步的经典解决机制第一节信号量信号量的种类及用途
7、信号量的种类及用途信号量的定义信号量的定义互斥信号量互斥信号量二值信号量二值信号量计数信号量计数信号量信号量机制的主要数据结构信号量机制的主要数据结构典型的信号量操作典型的信号量操作临界资源和临界区操作系统把一次仅允许一个进程使用的资源称为临界资源。一个进程中访问临界资源的那段程序称为临界区。进程进程P1和和P2共享同一打印机资源,其操作流程共享同一打印机资源,其操作流程如下:如下:p1:entry codep1:entry code使用打印机使用打印机exit codeexit code p2:entry code p2:entry code使用打印机使用打印机exit codeexit c
8、ode系统打印机即为系统打印机即为临界资源临界资源P1和和p2的访问临界资源打印机的代码即为的访问临界资源打印机的代码即为临界区临界区临界资源和临界区临界区临界资源 进程P1 进程P2 R1 count;R2=count;R1+;R2+;count=R1;count=R2;(设count的初始值为5)为互斥地使用临界资源,需保证进程互斥地进入临界区。临界资源和临界区临界区的进入准则空闲让进:临界资源空闲时,允许进程进入临界区忙着等待:临界资源正在被访问时,其他需要进入临界区的进程必须等待有限等待:保证进程在有效的时间内进入临界区,避免“死等”让权等待:当进程不能进入临界区时,应立即释放处理机,
9、以免其它进程“忙等”临界资源和临界区进程互斥进入临界区的实现方法硬件方法禁止中断在进程进入临界区之后,禁止该进程中断专用机器指令TS指令,Swap指令软件方法信号量和PV操作临界资源和临界区信号量是一个数据结构,其定义如下:struct semaphore int value;struct PCB *queue;信号量semaphore包括一个整型值和一个等待队列。信号量只能通过P原语和V原语访问。什么是信号量什么是信号量信号量被定义为一个整形变量,在其上定义了以下三个操作:1、可以被初始化一个非负数2、wait操作(P操作)将信号量的值减1后,若该值为负,则执行wait操作的任务等待3、si
10、gnal操作(V操作)将信号量的值增1后,若该值为非正,则执行signal操作的任务唤醒 P 原语 P(S)S:=S-1;如果 S =0,则表示有资源,该进程继续执行;如果 S 0S=S-1返回返回调用进程进入等待队列调用进程进入等待队列转进程调度转进程调度是否P原语操作原型 void wait(semaphore s)/s.value=s.value 1;if(s.value 0,则该进程继续执行如果 S 0,说明有进程被挂起,则唤醒一阻塞进程,即从S信号量的等待队列首摘下一个PCB,将其置为就绪状态,执行 V(S)者继续执行6P操作可能会引起进程的阻塞,V操作不会引起本身进程状态的变化,但
11、可能唤醒其他进程,使其从阻塞状态转变到就绪状态V原语V原语(1)若信号量S的等待队列中有等待进程,则取队首进程,将其置为就绪状态并返回。(2)否则信号量S加1,并放回V原语原语是否有等待进程是否有等待进程S=S+1返回返回取队首进程置为就绪态取队首进程置为就绪态否是V原语操作原型 void signal(semaphore s)s.value=s.value+1;if(s.value=1)value=value 1;count=value;/打印一张机票;else /显示机票已售完;V(mutex);临界区信号量实现进程互斥用信号量实现任务间的互斥var mutex:Shared Semaph
12、ore;begin mutex:=1;parbegin P1:P2:Pi:repeat Wait(mutex);“进程Pi的临界代码段”;Signal(mutex);forever Pn:parend endTask1Task2共享资源共享资源互斥信号量 WaitB(S):/申请信号量申请信号量if S.value1;/当前没有其他任务使用信号量当前没有其他任务使用信号量 then S.value=S.value-1=0/将信号量值修改为将信号量值修改为0,独占共享资源,独占共享资源else begin Insert(CALLER,S.L);/如果当前有其他任务使用信号量,将该任务放入等待如果
13、当前有其他任务使用信号量,将该任务放入等待 队列队列 Block(CALLER);/修改该任务的状态为等待态(阻塞任务)修改该任务的状态为等待态(阻塞任务)endSignalB(S):/释放信号量释放信号量if S.L queue is empty;/如果等待序列为空,没有其他任务等待使用该共享资源如果等待序列为空,没有其他任务等待使用该共享资源 then S.value=1;/释放信号量释放信号量else begin Remove(S.L,id);/如果有其他任务等待使用该共享资源,则从等待队列中如果有其他任务等待使用该共享资源,则从等待队列中 将该任务移除将该任务移除 wakeup(id)
14、;/将该任务的状态改为就绪态将该任务的状态改为就绪态(唤醒任务唤醒任务)end互斥信号量状态图互斥信号量状态图互斥信号量状态图开启开启锁定锁定初始化初始化值为值为1申请并获得申请并获得值为值为0释放释放值为值为1申请申请(递归递归)并获得并获得锁定数加锁定数加1释放释放(递归递归)锁定数减锁定数减1各种互斥机制比较比较项目比较项目关中断关中断使用测试并置使用测试并置位指令位指令禁止任务禁止任务切换切换使用信号量使用信号量锁定范围锁定范围互互斥斥力力度度最最强强,锁定所有外部可屏蔽中断,凡是以中断形式到达的外部事件以及与之相关联的任务或处理过程均得不到执行凡是使用该指令访问共享资源的代码所有的任
15、务只只影影响响竞竞争争共共享资源的任务享资源的任务对系统响应时对系统响应时间的影响间的影响如果关中断的时间较长,对系统的响应性能有很大影响较小如果禁止切换的时间过长,则影响系统的响应性能对对系系统统响响应应性性能能有有一一定定影影响响,可可能能导导致优先级反转致优先级反转实现时的系统实现时的系统开销开销小小小较大较大注意事项注意事项关关中中断断时时间间要要尽量短尽量短不不是是所所有有的的处处理理器器都都具具备备这这种种指指令令,影响可移植性影响可移植性关关调调度度的的时时间间要尽量短要尽量短需需采采用用一一定定的的策策略略解解决决优优先先级反转问题级反转问题二值信号量可获得可获得不可获得不可获
16、得申请并获得申请并获得(值为值为0)释放释放(值为值为1)初始化初始化值为值为0二值信号量状态图二值信号量状态图例如:有两个程序段S1和S2,要求S1先于S2执行。semaphore mutex=0;P1进程:S1;V(mutex);/唤醒进程P2;P2进程:P(mutex);/等待P1执行;S2;二值信号量实现同步 Task1()执行一些操作执行一些操作;将信号量将信号量sem1置置1;申请信号量申请信号量sem2;Task2()申请信号量申请信号量sem1;执行一些操作执行一些操作;将信号量将信号量sem2置置1;Task2申申请请信信号号量量sem1失失败败,系系统统切换到切换到Task
17、1sem1被被 置置 1后后,Task2得得 到到 sem1并并抢占抢占Task1Task2运运行行到到某某处处时时因因某某种种原原因因被被阻阻塞塞,系系统统切切换换到到Task1用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步用二值信号量实现两个任务之间的双向同步 Task2Task2优先级高于优先级高于优先级高于优先级高于Task1Task1 sem1sem1和和和和sem2sem2的初始值均为的初始值均为的初始值均为的初始值均为0 0二值信号量实现同步 计数信号量Task1Task2共享资源实例共享资源实例nTask m共
18、享资源实例共享资源实例1计数信号量计数信号量状态图计数信号量状态图可可获获得得不可不可获获得得初始化初始化值值大于大于0申申请请并并获获得得值为值为0释释放放值为值为1申申请请并并获获得得值值减减1释释放放值值加加1计数(一般)信号量同步原语Wait(S):S.value:=S.value-1;/有新任务来使用共享资源将信号量的值减1 if S.value0 /如果信号量的值为负,表示共享资源已经分配完毕 then begin Insert(CALLER,S.L);/将该任务插入等待序列 Block(CALLER);/将该任务状态改为等待态(阻塞任务)endSignal(S):S.value:
19、=S.value+1;/任务使用完共享资源,将信号量的值加1,释放 一个信号量 if S.value 1 then V(entry);P(wait);else V(entry);V(barber);“Shave”P(entry);count:=count 1;if count 0 then V(wait);V(entry);理发室理发室椅子椅子入口入口出口出口等候室等候室barberbarber信号量队列信号量队列waitwait信号量队列信号量队列entryentry信号量队列信号量队列理发师理发师P P(barberbarber)PPPP(entryentry)P P(entryentry
20、)count=0=1v v(entryentry)唤唤醒醒count=1v v(entryentry)Count=2P P(waitwait)V V(barberbarber)理发师barber信号量队列wait信号量队列entry信号量队列P(entry)count=5V(entry)P(entry)count=5count=4V(entry)V(wait)V(barber)信号量机制的主要数据结构SCB1SCB2信号量控制信号量控制块块count信号量名字或信号量名字或IDTask1Task2任任务务等待列表等待列表信号量机制的主要数据结构信号量控制块:管理所有创建的信号量,内核在系统运行
21、时动态分配和回收信号量控制块互斥和二值信号量控制块结构:Binary_Semaphore_Control_Blockwait_queue任务等待队列任务等待队列attributes信号量属性信号量属性lock_nesting_behavior 试图嵌套获得时的规则试图嵌套获得时的规则 wait_discipline 任务等待信号量的方式任务等待信号量的方式priority_ceiling 优先级天花板值优先级天花板值lock是否被占有是否被占有holder拥有者拥有者 nest_count嵌套层数嵌套层数计数信号量控制结构Counting_Semaphore_Control_Block wai
22、t_queue任务等待队列任务等待队列 attributes计数信号量属性计数信号量属性 maximum_count 最大计数值最大计数值 wait_discipline任务等待信号量的方式任务等待信号量的方式 count当前计数值当前计数值信号量机制的主要数据结构典型的信号量操作创建信号量获取(申请)信号量释放信号量删除信号量清除信号量的任务等待列表 获取有关信号量的各种信息 创建信号量功能:根据应用传递的参数创建一个信号量参数:信号量的名字、属性和初始值等。内核动作:从空闲信号量控制块链中分配一个信号量控制块,并初始化信号量属性。创建成功时,为其分配唯一的ID号返回给应用。如果已创建信号量
23、数量已达到用户配置的最大数量,就返回错误。信号量的属性信信号号量量的的属属性性信号量的类型互斥信号量(互斥信号量(MUTEX_SEMAPHORE)计数信号量(计数信号量(COUNTING_SEMAPHORE)二值信号量(二值信号量(BINARY_SEMAPHORE)任务等待信号量的方式先进先出(先进先出(FIFO)顺序)顺序优先级(优先级(PRIORITY)顺序)顺序优先级反转问题的解决方法(只适用于互斥信号量)优先级继承算法(优先级继承算法(INHERIT_PRIORITY)优先级天花板算法优先级天花板算法(PRIORITY_CEILING),需,需给出所有可能获得此信号量的任务中优先级最给
24、出所有可能获得此信号量的任务中优先级最高的任务的优先级。高的任务的优先级。获取(申请)信号量功能:试图获得应用指定的信号量。该功能流程如下:if 信号量的值大于0then 将信号量的值减1else 根据接收信号量的选项,将任务放到等待 队列中,或是直接返回获取(申请)信号量当所申请的信号量不能被立即获得时,可以有以下几种选择:永远等待 不等待,立即返回,并返回一个错误状态码指定等待时限(可有效避免死锁)注意:不允许在ISR中选择等待当任务选择等待时,将被按FIFO或优先级顺序放置在等待队列中释放信号量功能:释放一个应用指定的信号量。if 没有任务等待这个信号量then 信号量的值加1 else
25、 将信号量分配给一个等待任务(将相应的任务 移出等待队列,使其就绪)如果使用了优先级继承或优先级天花板算法,那么执行该功能(系统调用)的任务的优先级将恢复到原来的高度。删除信号量功能:从系统中删除应用指定的一个信号量内核动作:将信号量控制块返还给系统删除信号量的不一定是创建信号量的任务如果有任务正在等待获得该信号量,执行此功能将使所有等待这个信号量的任务回到就绪队列中,且返回一个状态码指示该信号量已被删除清除信号量的任务等待列表为了清除等待一个信号量的所有任务,某些内核支持Flush操作,以便释放信号量等待任务列表中的所有任务。当多个任务的执行必须在某些点相遇时,需要这样的机制。SignalT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实时 操作系统 同步 通信
限制150内