信号量死锁
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
http://www.elecfans.com 电子发烧友 http://bbs.elecfans.com 电子技术论坛
有些任务需要与外界交互(数据采集,信息接收等)这时可以在中断处理程序中加入对二值同步信 号量的释放语句(不允许加入提取语句,否则会破坏中断程序响应,从而破坏系统的正常运行) ,由中断 程序来唤醒相应的处理程序。这样,平时该任务处于阻塞状态,系统运行其它的任务,等到有了外部输 入,该任务提取信号量,从而被唤醒运行。 同步问题中往往会有多个任务等待在一个同步点上,当一个任务触发同步点时,所有的任务都处于 就绪状态。这时使用 semGive(synSem),只能将其中一个任务唤醒进入就绪队列,而其他等待该信号量的 任务仍在睡眠,将无法进入就绪队列。使用 semFlush( )可以唤醒所有阻塞在该信号量上的任务,使其进 入就绪队列,等待被执行。这也就是同步机制中的广播。
Discuss of Synchronism and Exclusion of Semaphore in VxWorks
Zhao Youchun (Dep. Of Automatization, Nanjing University of Science and Technology, Nanjing 210094) Abstract In real-time operating system, mechanisms is supported in order to guarantee that the deadline time of tasks will be met. But mechanism of synchronism and exclusion supported by operation also weaken the response to deadline of tasks. Synchronism and exclusion of a particular operating system VxWorks is studied and focus is put on exclusion semaphore which is important to access share resource. Key Words VxWorks,real time operating system ,synchronism and exclusion of tasks, protocol of priority inheritance, critical area
http://www.elecfans.com 电子发烧友 http://bbs.elecfans.com 电子技术论坛
VXWORKS 实时操作系统中信号量用于多任务同步与互斥的讨论
赵佑春 (南京理工大学自动化系,江苏 南京 210094) 摘要:实时操作系统中对任务的响应时间提供了机制上的保障,但任务的同步与互斥又会削弱对任务响 应的实时性,本文通过针对一个具体的实时操作系统 VxWorks,详细的讨论了任务的同步与互斥机制, 重点的讨论了互斥信号量机制对系统的影响。 关键字 Vxworks 、实时操作系统、任务的同步与互斥、 优先权继承协议、临界区
http://www.elecfans.com 电子发烧友 http://bbs.elecfans.com 电子技术论坛
权任务中,选出一个最高优先权任务,将该任务的优先权传给在临界区执行的低优先权任务 T,这样, 低优先权任务 T 在临界区执行时,它的优先权被提高了,当其执行完临界区代码后,恢复原先进入临界 区之前的优先权。基本优先权协议保证了高优先权任务被低优先权任务在临界区阻塞后不会发生优先权 反转。VxWorks 系统实现了基本优先权协议,但基本优先权协议无法避免潜在的死锁。例如,A 任务得 到了互斥信号量 1,高优先权的任务 B 抢占了任务 A,然后任务 B 得到了信号量 2 此时它又想得到信号 量 1,当它去提取信号量 1 时,死锁发生了。这时要求程序员能够仔细严谨的设计对信号量的访问顺序, 与多个任务的执行顺序。同时由于保护临界资源提升了低优先权任务的优先级,基本优先权协议降低了 高优先权任务实时性。如当任务 1 得到了信号量 1,任务 2 发起(较任务 1 优先权高) ,抢占了任务 1 并 得到信号量 2,之后任务 3 发起,任务 3 是最高优先权任务,抢占了任务 2,此时它试图去得到信号量 1 和信号量 2,肯定被阻塞,不得不等到任务 2 和任务 1 都执行完临界区代码后,才能执行自己的代码。
3.互斥信号量用于任务间的资源保护
使用互斥信号量机制可以保护对共享资源的正确使用,同时也为任务之间的同步提供了保障。申请 不到互斥信号量的任务即转入睡眠被放入等待信号量的队列中,让出对 CPU 的使用。若任务得到了互斥 信号量即可对共享资源进行访问,这时系统仍然允许抢占。 若有高优先权任务被唤醒,它会立即剥夺低优先权任务的运行,抢占 CPU 开始执行,若高优先权任 务也要访问共享资源,则它被阻塞,让出 CPU。此时存在任务的同步与任务实时性之间的矛盾。由于共 享资源的有限性(往往是内存或其它昂贵的装置) ,当一个低优先权的任务占有了共享资源,已就绪的高 优先权的任务将不得不等待,直到低优先权的任务使用完共享资源,释放信号量。这样高优先权的任务 的响应时间被延迟,如果在低优先权的任务得到互斥信号量,阻塞了高优先权信号量时,一个中等优先 权的任务随后发起,就会出现优先权反转问题。 在 VxWorks 中,系统提供互斥信号量 API 函数 SEM_ID semMCreate ( int options ),该信号量主要 用于任务间对共享资源的互斥。与二值信号量提供的互斥功能不同,它更加严格的保护共享资源以及占 用共享资源的任务。二值信号量没有优先权反转的保护;而且对于二值信号量,不同的任务都可以对其 进行释放,在中断任务中也可释放二值信号量。甚至当任务持有二值信号量时,其它任务都可以删除它。 但互斥信号量只能由申请该信号量的任务来释放它,决不允许在其他任务中释放它(由系统编译程序检 查以实现该功能) , 也不允许在中断处理程序中提取与释放互斥信号量, 更不允许任务锁住互斥信号量时, 被其它任务删除(由参数 options 的值 SEM_DELETE_SAFE 来指定该项保护) ;互斥信号量提供选择字参 数 options,可以按优先权(SEM_Q_PRIORITY)与先入先出队列(SEM_Q_FIFO)两种方式排列等待对该互 斥信号量进行上锁的任务,在选用优先权方式时,系统还提供优先权反转的保护。 在创建互斥信号量时,选择 SEM_INVERSION_SAFE 与 SEM_Q_PRIORITY 两选择值的域,即可避 免优先权反转。但此时系统在检查临界区的信号量上锁(semTake() )与解锁(semGive( ))时,比二值信 号量实现互斥会有很大的开销,它花费了系统的开销来保护系统的稳定性。它的实现框架如下。 SEM_ID muxSem /*将其说明为全局变量,使所有使用它的任务都能访问到它*/ taskA( ) { muxSem = semMCreate ( SEM_Q_PRORITY | SEM_INVERSION_SAFE ); } taskB( ) { semTake ( muxSem ,WAIT_FOREVER); 访问临界区的代码 semGive(muxSem); /*临界区上锁与解锁必须成对出现在一个任务中*/ 非临界区代码 } VxWorks 通过优先权继承协议可以克服优先权的反转问题。优先权继承协议分为基本优先权继承协 议,顶层优先权继承协议两种。基本优先权继承协议规定一个任务 T 获得了互斥信号量,同时阻塞了比 其本身优先权高的多个任务后,该任务 T 在临界区放弃使用原先的优先权,将从被它阻塞的多个高优先
2.二值信号量用于任务间同步
任务同步,首先由最先执行的主任务创建二值信号量 synSem = semBCreate ( SEM_Q_FIFO( 或 SEM_PRIORITY) , SEM_EMPTY),用于同步的二值信号量必须初始化为空。紧接着由同步触发任务(初 始化任务)将所有的必须初始化工作做完后,释放信号量 semGive ( synSem),唤醒后ຫໍສະໝຸດ Baidu的具体执行任务, 具体执行任务在任务的开始执行处提取信号量 semTake ( synSem)。如下面框架所示。 taskA ( parameter ) { FOREVER /* 任务为一个无限循环*/ { 相应的初始化和准备工作 ···· semGive(synSem);/*信号量释放后,唤醒较高优先权的执行任务*/ } } taskB (parameter) { FOREVER { semTake (synSem); ···· 执行具体的操作 ···· }/*开始下一个循环时,由于得不到信号量,阻塞,让出 CPU,任务 A 可以执行*/ }
1.概述
实时操作系统中对于共享资源的保护与任务的同步协作,一般都提供了信号量机制。通常将信号量 分为三种,二值信号量,计数信号量,互斥信号量。二值信号量常用于各相互协作任务间的同步,计数 信号量常用于管理多个共享资源的使用。互斥信号量常用于对单一共享资源的保护。 下面我们主要以 VxWorks 实时操作系统为例,讨论信号量机制在任务间的同步与互斥中的应用。
4.互斥信号量对于任务运行时间的影响
顶层优先权协议可以解除潜在的阻塞,并且保证高优先权任务至多被一个低优先权任务的临界代码 区阻塞。但是从总体上讲,它牺牲了系统的开销,在互斥信号量上锁与解锁时要花费比基本优先权更多 的开销。但它保证了高优先权任务的实时性,不会形成阻塞链。通过优先权的提升,顶层优先权协议破 坏了死锁中的循环等待条件,因而不会发生死锁。顶层优先权的定义为:程序初始化创建信号量时为每 个互斥信号量分配一个优先权称其为顶层优先权,该优先权设为将会使用该互斥信号量的所有任务中的 最高优先权。当一个任务 T 对互斥信号量 m 上锁时,系统首先检查运行系统中已被上锁的信号量的顶层 优先权是否小于任务 T 自己的优先权,1)若小于则任务 T 可以试图上锁信号量 m,当执行获取信号量操 作时,若该信号量 m 已被锁住,则系统将任务 T 的优先权值传递给锁住信号量 m 的任务,同时将任务 T 阻塞。若信号量没有被锁住,任务 T 得到信号量 m;2)如果大于等于,任务 T 不允许执行上锁信号量的 操作,任务 T 阻塞。直到将其阻塞的信号量被释放(该信号量与任务 T 无关联) ,任务 T 被唤醒,再重复 前面的检查,如果通过检查,转入执行 1) 。当一个任务 T 释放信号量时,它首先检查是否有被阻塞在该 信号量上的任务,如果有则选最高优先权的任务,将其唤醒,投入运行。 与基本优先权相比,在任务获取信号量时,系统要检查其它已获取信号量的任务,察看信号量的顶 层优先权,也就是将来要访问该信号量的优先权最高的任务的优先权值,通过检察顶层优先权,就可以 避免低优先级任务提前获取随后发起的高优先权任务将要用到的互斥信号量,从而保证对高优先权任务 的实时性响应,防止死锁与阻塞链的产生。 在 VxWorks 中没有实现顶层优先权协议,如果程序员对互斥信号量的上锁与解锁顺序安排不当,会 产生死锁。同时也会产生阻塞链,降低了实时任务的响应时间。通过下面的简单演示程序可以看到这种 情况。 该程序发起三个任务,任务 3 优先权最低,先运行,获得了信号量 mux1,两个时钟节拍后,任务 2 开始运行获得了信号量 mux2,第四个时钟节拍, 最高优先权任务 1 运行, 试图得到信号量 1 和 2, 被阻塞, 必须等待任务 1 和任务 2 都释放了信号量后,它才能获得全部信号量继续执行。 #define Hiprio 200 #define Miprio 220 #define Loprio 240 /* 说明 3 个任务的原型 */ void task1(); void task2(); void task3(); /* 定义互斥信号量 */ SEM_ID mux1,mux2; void TimeElapse(int tasknum ) { int m,n; /*用于在临界区内模仿临界资源的执行*/