一种在多任务环境下防止死锁的互斥信号量管理方法

文档序号:6444089阅读:759来源:国知局
专利名称:一种在多任务环境下防止死锁的互斥信号量管理方法
技术领域
本发明属于计算机操作系统技术领域,尤其涉及一种在多任务环境下防止死锁的
互斥信号量管理方法。
背景技术
在嵌入式计算机操作系统中,很多情况下,需要保障任务独自访问共享资源或者临界区。可能几个任务竞争地访问这些资源,所以必须同步它们的行为,以实现独占式的访问。互斥信号量是专门被设计用来提供互斥访问,从而避免任务间冲突和不确定交互的方法。然而,使用互斥信号量的一个潜在问题是死锁。死锁是由两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行。

发明内容
鉴于现有技术中存在的问题,本发明提供一种在多任务环境下防止死锁的互斥信号量管理方法,其特征在于包括如下步骤A、为系统所需的互斥信号量分配一一对应的编号,编号有大小之分;B、在任务状态控制块中建立包括含有互斥信号量的ID与互斥信号量编号信息的双向链表,并指明任务已经占有的信号量的个数以及任务可占有信号量的最大个数;C、在系统中建立针对互斥信号量的状态数组,以所述互斥信号量编号为状态数组下标,指示互斥信号量在系统中的存在个数;数组的每个成员值表示系统中所对应编号的互斥信号量的拥有个数;D、在任务状态控制块中根据互斥信号量的ID按照互斥信号量编号从小到大的顺序申请信号量,并根据信号量的使用情况,对任务状态控制块中存放占有信号量的个数的域以及互斥信号量状态数组进行更新。进一步,本发明所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于在信号量申请的过程中,如果任务申请互斥信号量失败或者已经超过可占有信号量的最大个数,那么系统收回该任务已经申请获得的并且编号小于该信号量编号的信号量,并更新对应任务状态控制块中的存放占有信号量个数的域和互斥信号量状态数组;如果任务申请成功并且尚未到达可占有信号量的最大个数,则更新互斥信号量状态数组的对应项。进一步,本发明所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于步骤A为系统所需的互斥信号量分配的编号采用整数表示。进一步,本发明所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于步骤C中所述互斥信号量的状态数组元素的类型为整型,初始化为零。进一步,本发明所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于如果某个任务释放某个互斥信号量,对应互斥信号量的状态数组中对应的值就会自加操作。
进一步,本发明所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于如果任务申请获得某个信号量,它将先查找状态数组,如果对应的值小于零,则表示无法再申请当前信号量,该方法将已经占有并且编号小于该编号的信号量释放回系统, 更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,并将任务加入挂起队列;如果对应的值大于零并且任务控制块的所占有的信号量数目已经达到了最大可占有的数,则将已经占有并且编号小于该编号的信号量释放回系统,更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,将任务加入挂起队列;如果对应的值大于零并且任务控制块的所占有的信号量数目还没有达到最大可占有数,则更新状态数组对应项以及任务控制块中的存放已经占有信号量的域。进一步,本发明所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于在进行步骤D的操作的时候,操作过程不被中断。基于申请互斥信号量有序化的机制,本发明的目的是提供一种防止死锁的互斥信号量管理方法,该方法通过一种新型的互斥信号量管理机制,可有效避免互斥信号量机制引发的死锁。


图1是本发明实现在多任务环境下防止死锁的互斥信号量管理方法的流程图。
具体实施例方式为使本发明的上述目的、特征和优点更加明显易懂,下面结合附图和具体实施方式
对本发明作进一步详细的说明。图1是本发明实现在多任务环境下防止死锁的互斥信号量管理方法的流程图;其包括如下步骤A、为系统所需的互斥信号量分配一一对应的编号,编号有大小之分;互斥信号量是操作系统内核为多任务环境下保护临界资源而设置的一种机制,普通的互斥信号量由一一对应的控制块管理,保存有信号量的基本信息。本方法中在控制块中增加新成员表示该互斥信号量的编号,编号有大小之分,为系统所需的互斥信号量分配的编号采用整数表示,并且没有两个互斥信号量的编号相同。新型互斥信号量在创建的时候通过参数传递的方式,指定该编码。B、在任务状态控制块中建立包括含有互斥信号量的ID与互斥信号量编号信息的双向链表,并指明任务已经占有的信号量的个数以及任务可占有信号量的最大个数;任务控制块中需要包含将使用的互斥信号量的信息,包括一个双向链表和两个整数域。双向链表结构包括该互斥信号量的对象ID——互斥信号量的唯一标识(系统在创建互斥信号量的时候统一分配ID号)、互斥信号量的编号、以及结点指针域;任务已经占有的信号量的个数,任务可占有信号量的最大个数。C、在系统中建立针对互斥信号量的状态数组,以所述互斥信号量编号为状态数组下标,指示互斥信号量在系统中的存在个数;数组的每个成员值表示,系统中所对应编号的互斥信号量的拥有个数;
维护针对互斥信号量的状态数组a,数组的每一项表示可以申请的信号量的个数, 互斥信号量的状态数组元素的类型为整型,初始化为零。例如a[i]的值为1表示的是当前环境下,任务可以申请编号为i的信号量的个数为1。如果某个任务释放某个互斥信号量, 对应互斥信号量的状态数组中对应的值就会自加操作。D、在任务状态控制块中根据互斥信号量的ID按照互斥信号量编号从小到大的顺序申请信号量,并根据信号量的使用情况,对任务状态控制块中存放占有信号量的个数的域以及互斥信号量状态数组进行更新。在任务需要多个信号量的情况下,信号量申请的过程必须按照编号的大小从小到大的顺序申请,以下步骤将使得这个过程有序化。如果任务申请获得某个信号量,它将先查找状态数组,如果对应的值小于零,则表示无法再申请当前信号量,该方法将已经占有并且编号小于该编号的信号量释放回系统,更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,并将任务加入挂起队列;如果对应的值大于零并且任务控制块的所占有的信号量数目已经达到了最大可占有的数,则将已经占有并且编号小于该编号的信号量释放回系统,更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,将任务加入挂起队列;如果对应的值大于零并且任务控制块的所占有的信号量数目还没有达到最大可占有数,则更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,在该过程中,系统规定在该操作过程中必须不被中断。基于申请互斥信号量有序化的机制,本发明的目的是提供一种在多任务环境中防止死锁的互斥信号量管理方法,该方法通过一种新型的互斥信号量管理机制,可有效避免互斥信号量机制引发的死锁。下面基于RTEMS操作系统具体描述本发明在多任务环境中防止死锁的互斥信号量管理方法实现过程[1]在RTEMS 4. 9. 0源码中对象控制块的定义中,增加放置编号的域number,类型为有符号数。[2]需要在创建互斥信号量的时候,为域number赋值,此值的来源为创建互斥信号量的功能实现的传入参数,开发者可以也通过显示的方式调用设置number值的API。[3]在以RTEMS 4. 9. 0版本为基础,在任务控制块结构体中,添加结点类型为互斥信号量指针的双向链表,整个链表构成了任务需要申请的互斥信号量有序链表;添加两个整数域分别对应任务已经占有的信号量的个数,任务可占有信号量的最大个数。[4]在全局变量定义头文件中定义全局数组——mUteX_ptr,用于前文提到的状态数组,指示所有信号量对应互斥资源当前存在个数。[5]在信号量释放功能函数禁止中断函数段中,对状态数组的对应互斥信号量进行自加操作。[6]在信号量获取功能函数禁止中断函数段中,判断状态数组mutetqueue是否为空,如果为空则直接进行重新调度。如果非空,按照以下步骤进行互斥信号量的申请(1)任务申请某个信号量,它将先查找状态数组,如果编号对应结点的值大于零, 则表示可以申请执行(3);(2)如果状态数组中的值小于零,则将已经占有并且编号小于该编号的信号量释放回系统,状态数组对应更新,任务控制块中的存放已经占有信号量的域更新,并将任务加入挂起队列;
(3)查看任务控制块的所占有的信号量数目是否达到最大可占有的数目,如果达到了最大的可占有的数目执行G),否则执行(5)。(4)将已经占有并且编号小于该编号的信号量释放回系统,状态数组对应更新,任务控制块中的存放已经占有信号量的域更新,将任务加入挂起队列。(5)任务可以占有互斥信号量,状态数组对应更新,任务控制块中的存放已经占有信号量的域更新。以上提到方法可以预防互斥信号量访问引起的死锁问题,举一个简单的例子。例如在以下这种情况下,任务1和任务2都需要申请信号量1和信号量2,会因为互斥访问带来死锁的问题1)任务1占有互斥信号量1。2)任务2占有互斥信号量2。3)任务1挂起因为要申请信号量2。4)任务2挂起因为要申请信号量1。这样,两个任务就会陷入死锁,它们都彼此等待另一个任务拥有的互斥量。运用本发明的方法能够消除类似这种因为互斥访问引起的死锁问题,例如在上面的例子中,会发生这样的情况1)任务1申请占有互斥信号量1。2)任务2也需要申请信号量1,也需要申请互斥信号量2。3)任务2在申请信号量1的时候,发现被信号量1占有了,它就不能占有信号量 2,因为本方法需要顺序占有信号量。4)这样的制约下,就不会出现死锁现象。本发明通过对由于等待其他任务占有的互斥信号量而形成死锁的情况形成新的解决方法。本方法通过对互斥信号量进行编号,任务被指定其可以占有互斥信号量的个数, 任务在申请互斥量的时候是按照编号的大小有序进行的,这样就可以避免了前述情况的发生。最后应当说明的是以上实施例仅用以说明本发明的技术方案而非对其限制;尽管参照较佳实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解依然可以对本发明的具体实施方式
进行修改或者对部分技术特征进行等同替换;而不脱离本发明技术方案的精神,其均应涵盖在本发明请求保护的技术方案范围当中。
权利要求
1.一种在多任务环境中防止死锁的互斥信号量管理方法,其特征在于包括以下步骤A、为系统所需的互斥信号量分配一一对应的编号,编号有大小之分;B、在任务状态控制块中建立包括含有互斥信号量的ID与互斥信号量编号信息的双向链表,并指明任务已经占有的信号量的个数以及任务可占有信号量的最大个数;C、在系统中建立针对互斥信号量的状态数组,以所述互斥信号量编号为状态数组下标,指示互斥信号量在系统中的存在个数;数组的每个成员值表示,系统中所对应编号的互斥信号量的拥有个数;D、在任务状态控制块中根据互斥信号量的ID按照互斥信号量编号从小到大的顺序申请信号量,并根据信号量的使用情况,对任务状态控制块中存放占有信号量的个数的域以及互斥信号量状态数组进行更新。
2.根据权利要求1所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于在信号量申请的过程中,如果任务申请互斥信号量失败或者已经超过可占有信号量的最大个数,那么它已经申请获得的并且编号小于该信号量编号的信号量被系统收回,并更新对应任务状态控制块中的存放占有信号量个数的域和互斥信号量状态数组;如果任务申请成功并且尚未到达可占有信号量的最大个数,则互斥信号量状态数组更新。
3.根据权利要求1所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于步骤A为系统所需的互斥信号量分配的编号采用整数表示。
4.根据权利要求1所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于步骤C中所述互斥信号量的状态数组元素的类型为整型,初始化为零。
5.根据权利要求1所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于如果某个任务释放某个互斥信号量,对应互斥信号量的状态数组中对应的值就会自加操作。
6.根据权利要求1所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于如果任务申请获得某个信号量,它将先查找状态数组,如果对应的值小于零,则表示无法再申请当前信号量,该方法将已经占有并且编号小于该编号的信号量释放回系统,更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,并将任务加入挂起队列; 如果对应的值大于零并且任务控制块的所占有的信号量数目已经达到了最大可占有的数, 则将已经占有并且编号小于该编号的信号量释放回系统,更新状态数组对应项以及任务控制块中的存放已经占有信号量的域,将任务加入挂起队列;如果对应的值大于零并且任务控制块的所占有的信号量数目还没有达到最大可占有数,则更新状态数组对应项以及任务控制块中的存放已经占有信号量的域。
7.根据权利要求1所述的在多任务环境中防止死锁的互斥信号量管理方法,其特征在于在进行步骤D的操作的时候,操作过程不被中断。
全文摘要
一种在多任务环境中防止死锁的互斥信号量管理方法,包括以下步骤A、为系统所需的互斥信号量分配一一对应的编号;B、建立包括含有互斥信号量的ID与互斥信号量编号信息的双向链表,并指明任务已经占有的信号量的个数以及任务可占有信号量的最大个数;C、建立针对互斥信号量的状态数组,以所述互斥信号量编号为状态数组下标,指示互斥信号量在系统中的存在个数;数组的每个成员值表示,系统中所对应编号的互斥信号量的拥有个数;D、在任务状态控制块中根据互斥信号量的ID按照互斥信号量编号从小到大的顺序申请信号量,并根据信号量的使用情况,对任务状态控制块中存放占有信号量的个数的域以及互斥信号量状态数组进行更新。
文档编号G06F9/46GK102567096SQ20111045043
公开日2012年7月11日 申请日期2011年12月30日 优先权日2011年12月30日
发明者刘立宇, 李彦峰, 杜栓柱, 杨秋松, 武延军, 潘远明, 翟健 申请人:中国科学院软件研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1