在多任务操作系统中解决任务死锁的方法技术方案

技术编号:2856849 阅读:223 留言:0更新日期:2012-04-11 18:40
本发明专利技术提出一种在多任务操作系统中解决任务死锁的方法,涉及通信领域。它是基于将可能导致死锁的有限资源扩展为无限资源的机制。本发明专利技术通过在消息控制头中增加一个指向下一个消息的指针来实现对消息的缓存,形成缓存链表;通过发送者在发送消息时查看本身所在的任务的消息队列是否为满,若满则取出一条消息放入缓存链表的方式来确保任务间不会出现因互发消息导致死锁。采用本发明专利技术所述方法,对于系统中突发的消息流,可以进行暂时的缓冲,保证在多任务操作系统中,任务不会因为互发消息而导致死锁,也不用担心消息会被丢弃而引起系统不稳定的现象的发生,为系统的稳定运行提供了保障。

【技术实现步骤摘要】

本专利技术提出一种,它是基于将可能导致死锁的有限资源扩展为无限资源的机制。
技术介绍
在多任务操作系统中,通常提供了任务间互发消息的机制来实现任务间通信,如VxWorks、pSos等商用嵌入式操作系统。这种机制的实现基于消息队列。用户可以为某个任务创建一个消息队列,并守候在这个消息队列上,要和该任务通信的其它任务可以将消息发送到这个消息队列上,这样就实现了任务间的通信。多任务操作系统都对消息队列赋予了如下操作发送消息到某消息队列;从某消息队列接收消息。并且这些操作都具有延时的功能,包括0延时和永久等待。如果是延时一段时间,发送者(或接收者)如果不能立即发送成功(或接收到消息),则发送者(或接收者)将会被阻塞一段时间再试图发送(或接收),这时不论发送成功(或接收到消息)与否,发送者(或接收者)都将继续往下运行。如果是0延时,则发送者(或接收者)不论发送成功(或接收到消息)与否,都将继续往下运行。如果是永久等待,则发送者(或接收者)只有发送成功(或接收到消息),才会继续往下运行,否则将会一直阻塞。在创建消息队列时,需要为消息队列指定一个最大长度,即可以容纳的消息的最大数目。在通信软件中,任务之间常常是通过大量的消息进行交互的。通常每个任务都有它自己的消息队列,该任务守候在它的消息队列上等候接收消息然后进行处理。如果在发送消息时采用永久等待的方式,就很容易导致两个甚至多个任务因为互发消息而导致死锁。例如任务A和任务B,它们的消息队列长度为N。在某个时刻任务A和任务B的消息队列中已经存储了N-1个消息(如图1所示),这时有一个任务C向任务A和B各发送了一个消息,导致任务A和任务B的消息队列全满了(如图2所示)。任务A得到运行后,向任务B发送一个消息,但是由于任务B的消息队列已满,因此任务A就进入阻塞状态;而这时任务B得到运行后,向任务A也发送一条消息,由于同样的原因,任务B也进入阻塞状态(如图3所示)。从而,任务A和B因为互发消息导致了死锁,再也得不到运行。这种问题对于软件系统来说是致命的。为了解决这个问题,有些通信软件采用了0延时或者延时一段时间的方法进行发送。如果发送不成功,就将发送的消息丢弃。这样的方法虽然能够避免死锁,但是以丢掉消息作为代价的,这样会增加系统的不可靠性。针对这些问题,本专利技术提出了一种可靠的方法来解决任务间因互发消息而导致的死锁。
技术实现思路
本专利技术所要解决的技术问题在于提供一种既不丢弃消息又能解决任务间因互发消息而造成死锁的方法。本专利技术提出一种,它是基于将可能导致死锁的有限资源扩展为无限资源的机制。本专利技术通过在消息控制头中增加一个指向下一个消息的指针来实现对消息的缓存,形成缓存链表;通过发送者在发送消息时查看本身所在的任务的消息队列是否为满,若满则取出一条消息放入缓存链表的方式来确保任务间不会出现因互发消息导致死锁。本专利技术包括以下步骤(1)对系统进行初始化,包括创建消息队列、创建任务、初始化缓存链表;(2)发送者发送消息到接收任务的消息队列,发送者如果在发送消息时失败,首先查看本身所在的任务的消息队列是否为满,若为满,则取出一条消息放入缓存链表,使得自己的消息队列不满;(3)接收者在自己的消息队列上接收消息,接收者首先处理缓冲链表中的消息,将缓冲链表中的消息处理完毕后,才能处理自己的消息队列中的消息。采用本专利技术中所述方法,可以避免因系统中各任务互发消息而引起的死锁,并且可以不丢失消息。为系统的稳定性运行提供了保障,并且减少上层应用软件的复杂度,使得软件更易实现。对于系统中突发的消息流,可以进行暂时的缓冲,增强了系统的健壮性。附图说明以下是对附图的说明图1是任务A和任务B的消息队列都为N-1时的状态。图2是任务A和任务B的消息队列都为N时的状态图3是任务A和任务B发生死锁时的情形。图4是初始化流程。图5是发送消息到接收任务的消息队列的流程。图6是在消息队列上接收消息的流程。具体实施例方式下面将结合附图与具体实施方式对本专利技术做进一步的详细描述为了实现消息的无限缓存,我们采用了链表的方式将要缓存的消息连接起来。因此,数据结构的组织采用了如下的方式所有的消息都需要一个消息控制头,紧跟着消息控制头后面的是消息体。在消息控制头中有一个指针,指向下一个消息。我们利用这个指针将要缓存的消息连接起来,形成缓存链表,从而实现了消息的无限缓存。这是保证解决任务间互发消息而导致死锁的前提。因为它实质上是将任务消息队列的长度扩展为无限长,解决了资源问题。为了使系统正常运行,需要一些必要的初始化工作。包括创建消息队列、创建发送任务和接收任务、初始化缓存链表等。消息队列既可以使用操作系统创建的消息队列,也可以用用户自己的方法来创建消息队列。只要消息对列的长度是有限的,本方法都是适用的。本文中提到的用户自己创建队列函数、消息接受函数和发送函数的功能是和系统的队列函数、消息接收函数和发送函数的功能一致的。初始化部分的实施步骤如下 1、调用系统函数或使用用户创建的队列函数,为需要接收消息的任务,按照指定的队列长度创建消息队列。2、创建系统中的任务,包括接收任务和发送任务。3、初始化各接收任务的消息缓存链表为空。初始化部分的实施流程如图4所示。在进行完相应的初始化工作后,系统进入工作状态。这时任务间就可以通过互发消息进行通信了。为了避免原来的因为任务间互发消息而导致的死锁问题,我们必须修改通常的发送消息流程简单调用系统的或用户自己的发送消息函数直接进行发送。主要的改变就是调用系统发送消息函数或用户自己的发送消息函数以0延时的方式发送消息到接收任务的消息队列。如果发送不成功,则先查看发送者本身的消息队列是否是满的。如果满,则发送者要调用系统接收函数或用户自己的消息接收函数从自己的消息队列中接收一条消息,插入到缓冲链表中,以保证发送者的消息队列不会永远为满。这个步骤是保证任务间不发生死锁的关键。发送者发送消息到接收任务的消息队列的实施步骤如下1、用系统的或用户自己的发送消息函数,以0延时的方式发送消息到接收任务的消息队列。如果发送成功,转到5;否则,转到2。2、查看发送者所在任务的消息队列中消息数目。如果消息数目等于该消息队列的长度,则继续;否则,转到4。3、调用系统的或用户自己的接收消息函数,以永久等待的方式从发送者的消息队列上接收一条消息,并将该消息插入缓存消息形成的链表。在该步中,接收到的消息可能是一个消息串,即有若干条消息通过消息控制头中的指向下一个消息的指针连接起来。若为消息串,则需要将该消息串的尾部作为消息缓存链表的尾部。否则将该消息作为缓存链表的尾部。该步骤的目的是保证每个消息队列不能永远为满的状态。4、将发送者所在的任务延时一段时间,转到1。该步骤的目的是为了防止发送任务长时间占用CPU资源,使得其它任务有得到调度的机会,能够尽快处理自己的消息。5、结束发送。发送者发送消息到接收任务的消息队列的实施流程如图5所示。由于在消息发送过程中,可能因为暂时发送不了消息而将自己的消息队列中的消息取出进行缓存,所以在缓存链表中可能会有一些消息。为了保证消息的有序性,我们需要优先处理这些消息。因此,在接收消息的过程中,首先要查看接收者的缓存链表中是否有消息,如果有,则优先处理这些消息。将所有的缓存消息处理完毕后本文档来自技高网
...

【技术保护点】
一种在多任务操作系统中解决任务死锁的方法,其特征在于,包括以下步骤:(1)对系统进行初始化,包括创建消息队列、创建任务、初始化缓存链表;(2)发送者发送消息到接收任务的消息队列,发送者如果在发送消息时失败,首先查看本身所在的 任务的消息队列是否为满,若为满,则取出一条消息放入缓存链表,使得自己的消息队列不满;(3)接收者在自己的消息队列上接收消息,接收者首先处理缓冲链表中的消息,将缓冲链表中的消息处理完毕后,才能处理自己的消息队列中的消息。

【技术特征摘要】
1.一种在多任务操作系统中解决任务死锁的方法,其特征在于,包括以下步骤(1)对系统进行初始化,包括创建消息队列、创建任务、初始化缓存链表;(2)发送者发送消息到接收任务的消息队列,发送者如果在发送消息时失败,首先查看本身所在的任务的消息队列是否为满,若为满,则取出一条消息放入缓存链表,使得自己的消息队列不满;(3)接收者在自己的消息队列上接收消启,接收者首先处理缓冲链表中的消息,将缓冲链表中的消息处理完毕后,才能处理自己的消息队列中的消息。2.根据权利要求1所述的方法,其特征在于步骤(1)中所述的创建消息队列是通过调用系统函数或使用用户创建的队列函数,为需要接收消息的任务,按照指定的队列长度创建消息队列。3.根据权利要求1所述的方法,其特征在于步骤(1)中所述的创建任务包括创建系统中的接收任务和发送任务。4.根据权利要求1所述的方法,其特征在于步骤(2)中的发送消息到接收任务的消息队列是通过调用系统发...

【专利技术属性】
技术研发人员:邓红波周元庆周海山
申请(专利权)人:中兴通讯股份有限公司
类型:发明
国别省市:94[中国|深圳]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1