专利名称:远程同步调用过程中的超时自适应方法
技术领域:
本发明涉及通信领域中的过程控制方法,尤其涉及远程同步调用过程中的调用超时的处理方法。
背景技术:
在多个处理器(CPU)组成的系统中,CPU之间需要进行相互通信。这种通信方式有很多种,例如远程数据传送、中断控制以及程序或函数的远程同步调用。在上述通信方式中,程序或函数的远程同步调用是较常用的一种,该通信方式是指一个CPU的任务调用另一个CPU的函数,并且在调用过程中调用CPU阻塞该任务,等待回应。如果在预先设定的超时时间内,调用CPU收到执行该函数的执行结果,则调用成功,否则调用失败。对于该通信方式来说,被调用CPU处理同一个函数的时间可能相差很大,例如,调用CPU的某个任务要求被调用CPU删除其管理的某个文件,由于系统中每个文件的长度是不确定的,使得具体删除某个文件的时间也不能事先确定。再比如说,调用CPU的某个任务调用另一个CPU的删除函数-删除交换芯片的MAC地址,由于不同交换芯片的MAC地址的个数可能不同,MAC地址的个数越多,被调用CPU执行的删除时间越长,最短的执行时间和最长执行时间相差很大,由于调用CPU在调用另一个CPU的删除函数之前无法确定被调用CPU所删除的MAC地址的个数,因此难以预先设定超时时间。在这种情况下,如果执行删除操作的时间比预先设定的超时时间要长,则在所述调用CPU的任务在超时时间内没有收到执行结果时,就会认为调用失败,但此时也有可能出现被调用者执行操作成功的结果;如果执行删除操作的时间比超时时间短,则对于调用异常的反应速度慢,调用CPU的任务就可能会被长时间阻塞,运行效率差。因此,需要解决上述类似在同一个函数处理时间可变的情况下,预先设定超时时间的问题。
图1为现有技术中普遍采用的一种远程同步调用中调用超时的处理方法。该方法包括调用CPU的调用过程和被调用CPU的执行过程。在调用CPU的调用过程中,首先由调用CPU基于对所调用函数执行时间的估计设定一个固定超时时间(步骤S110);然后调用CPU执行调用任务,发送调用报文,该调用报文的内容包括调用CPU编号、被调用CPU编号、调用模块号、被调用模块号、信号量编号、被调用的函数编号,同时设定信号量的初始值(可预先设置为0)(步骤S120);在上述任务完成后,调用CPU获取信号量,即减少信号量的值,当该CPU检测到信号量的值小于0,则阻塞该调用任务(步骤S130);接着,调用CPU判断在固定超时时间内是否收到被调用的CPU发送的包含有执行结果的result报文,如果是调用成功,否则调用发生超时错误(步骤S140)。
在被调用CPU的执行过程中,首先接收从调用CPU发送的调用报文(步骤S150),然后开始执行被调用函数(步骤S160),当执行结束后发送result报文至调用CPU(步骤S170)。
由于并不是所有函数的执行时间都是确定的,存在着如上述提及的用于删除MAC地址的删除函数等实际中无法事先确定处理时间的函数,所以调用CPU在预先设定的超时时间内没有收到调用结果无法判断是由于被调用CPU执行该函数的执行时间长还是调用时发生调用错误引起的。并且,当被调用CPU中的某个函数增加了复杂处理后,需要调整该函数每个可能调用的CPU的超时时间,大大增加了软件代码维护量。
作为上述方法的一种改进,在调用CPU端也可以这样完成所述任务首先调用CPU先将调用的函数编号等参数发送至被调用的CPU,由被调用CPU估计执行该函数的时间,再将结果返回调用CPU;接着,调用CPU将接收的结果设定成超时时间,然后执行上述步骤S120至步骤S140。
该方法虽然解决了确定超时时间这个问题,但是一个CPU任务调用两次才能执行一个被调用CPU的函数,被调用的CPU和调用的CPU的效率就被降低了。由于被调用的CPU需要估计大量函数在指定参数下的执行时间,导致由多个CPU组成的系统变得复杂,不利于保持系统的简单、清晰和易维护。
发明内容
本发明解决的问题是将远程同步调用的超时机制变为自动适应方式,为此提供了一种远程同步调用过程中的超时自适应方法,使用该方法不会因为被调用函数执行时间长而发生调用超时错误,并且,能够快速发现调用过程中的调用错误。
为解决上述问题,本发明提供了一种远程同步调用过程中的超时自适应方法,包括调用CPU的调用过程和被调用CPU的执行过程,其中,所述调用CPU的调用过程包括(1)执行调用任务,发送调用报文至被调用CPU,所述调用报文包括信号量编号和被调用函数名称;(2)获取信号量,阻塞调用任务,进行阻塞计时;(3)判断阻塞计时时间是否大于预先设定的超时时间,如果是,结束执行调用任务,否则进行步骤(4);(4)判断是否收到被调用的CPU发送的反馈数据包,如果是,释放信号量,唤醒调用任务,然后进行步骤(5),否则进行步骤(3);(5)判断数据包是否是wait报文,如果是,进行步骤(2),否则从接收的result报文中获得调用结果;
所述被调用CPU处理过程包括(6)被调用CPU收到调用报文,执行被调用函数,并且在执行过程中发送wait报文至调用CPU,所述发送wait报文的时间间隔小于超时时间;(7)执行函数结束后发送包括调用结果的result报文至调用CPU。
进一步,本发明的所述超时时间小于调用CPU估计调用所述函数需要执行的固定超时时间。
在被调用CPU的函数中可以预先插入向调用任务发送Wait报文的代码。步骤(6)中通过执行发送wait报文的代码来执行发送wait报文的操作。
步骤(6)中通过一个计时单元来控制发送wait报文的时间。
所述调用报文中还包括超时时间。步骤(6)还包括(6-1)被调用CPU根据接收到的调用报文中的超时时间,确定向调用CPU发送wait报文的时间间隔;(6-2)当被调用CPU执行所述函数的时间是所述时间间隔的倍数时,发送wait报文。
步骤(5)通过判断接收到的报文中的结果长度是否为0来判断是否是wait报文。
本发明还提供了一种远程同步调用过程中的超时自适应方法,包括调用CPU处理过程和被调用CPU处理过程,其中所述调用CPU处理过程包括(1)执行调用任务,发送调用报文至被调用CPU,所述调用报文包括被调用函数;(2)调用任务开始睡眠,进行睡眠计时;(3)判断睡眠计时时间是否大于等于预先设定的超时时间,如果是唤醒调用任务,然后进行步骤(4),否则进行步骤(3);(4)判断是否收到被调用的CPU发送的反馈数据包,如果是进行步骤(5),否则结束执行调用任务;(5)判断收到的数据包中是否有result报文,如果有,则从所述result报文中获得调用结果,否则进行步骤(2);所述被调用CPU处理过程包括(6)被调用CPU收到调用报文,执行被调用函数,并且在执行过程中发送wait报文至调用CPU,发送wait报文的时间间隔小于超时时间;(7)执行函数结束后发送包括调用结果的result报文至调用CPU。
预先设置的超时时间小于调用CPU估计调用所述函数需要执行的固定超时时间。
与现有技术相比,本发明具有以下优点(1)本发明中,被调用CPU能够在执行被调用函数过程中发送wait报文至调用CPU,调用CPU收到wait报文,阻塞调用任务继续等待,保证不会由于被调用函数执行时间长于预先设定的超时时间而发生调用超时错误。
(2)设定的超时时间小于固定超时时间,这样有利于调用CPU能够及时发现调用过程时发生的调用失败,提高了CPU的运行效率。
(3)当某个函数增加了复杂处理后,不需要调整针对它设置的超时时间,只要在函数中适当地增加发送wait报文代码即可,减少了软件代码维护量。还有该方法兼容原来的固定超时时间机制,对软件系统的改造工作量小。
图1为公知的一种CPU固定超时时间机制的流程图。
图2是本发明中调用CPU的调用过程的一种处理流程图。
图3是本发明中被调用CPU的执行过程的一种处理流程图。
图4是本发明中被调用CPU的执行过程的另一种处理流程图。
图5是本发明中调用CPU的调用过程的另一种处理流程图。
具体实施例方式
以下结合附图对本发明的具体实施例做进一步的阐明。
本发明调用超时的处理方法适于由多个CPU组成的系统中CPU之间进行相互通信,在具体实施例中,本发明的通信系统是至少包括CPU A和CPU B。CPU A中的调用任务T1调用CPU B中的函数,并且CPU B执行该函数的时间不能事先确定。以下具体举例来说明的远程同步调用过程中的超时自适应方法。
远程同步调用过程中的超时自适应方法包括CPU A的调用过程和CPU B的执行过程。
请参阅图2,公开了CPU A的调用过程的一种实施例,该CPU A的调用过程包括S210CPU A预先设置超时时间,该超时时间可以比固定超时时间短。当调用过程中发生错误时,由于超时时间比固定超时时间短,CPU A在超时时间内没有收到从CPU B中发送的反馈数据包,就能判断调用过程发生错误了。所以CPU A能够更快速发现错误,并且调用任务T1也不会长时间阻塞,提高了CPU A的运行效率。
S220CPUA执行调用任务T1,发送调用报文至CPU B,具体的步骤如下首先,调用任务T1创建一个信号量,定义该信号量的编号和其初始值,本实施例中信号量的编号为Sem,并将其初始值定义为0;其次,构造一个调用报文,该调用报文的内容包括源CPU编号、目的CPU编号、源模块号、目的模块号、信号量编号、被调用函数及其参数。其中源CPU编号为CPU A的编号,目的CPU编号为CPU B的编号,源模块号为CPUA的模块号,目的模块号为CPU B的模块号,信号量编号为Sem;最后,发送该报文至CPU B上。
S230获取信号量,从而使信号量的值小于0,调用的CPU无法调度到调用任务T1,即阻塞该任务T1,进行阻塞计时;S240判断阻塞计时时间是否大于预先设定的超时时间,如果是发出调用超时错误并结束执行调用任务,否则进行步骤S250。
S250CPU A是否接收到从CPU B发送的反馈数据包,如果是进行步骤S260,否则进行步骤S240;S260释放信号量Sem,唤醒任务T1,即增加信号量的值使其大于0,将此数据包放入T1的队列中,T1就会被CPU调度到;S270CPU A执行T1任务时,从T1队列中取出该数据包,判断收到的数据包是否是wait报文,如果是执行步骤S230,否则进行步骤S280,其中Wait报文是用来CPU B要求CPUA的调用任务T1继续等待,wait报文包括源CPU编号、目的CPU编号、源模块号、目的模块号、信号量编号、结果长度和调用结果。源CPU编号为CPU B的编号,目的CPU编号为CPU A的编号,源模块号为CPU B的模块号,目的模块号为CPU A的模块号,结果长度为0,是通过判断结果长度是否为0来判断接收到的是否是Wait报文;S280当接收到的数据包的结果长度不为0时为result报文,从result报文中取出调用结果,继续执行CPU A后续的操作。
CPU B的执行过程包括以下步骤CPU B收到调用报文,执行被调用函数,并且在执行过程中发送wait报文至CPU A,使调用任务T1能继续等待,每次发送Wait报文的时间间隔小于超时时间,直至执行完该函数后,CPU B发送result报文至CPU A。请参阅图3,为CPU B的执行过程的第一个实施方式。
S310通过测试找出哪些函数的执行时间不能事先确定或是执行时间过长,并在该些函数的代码中主动插入发送wait报文的代码,使得发送wait报文的时间间隔小于检测时间,即两个发送wait报文之间,发送wait报文和发送result报文的时间间隔都应小于超时时间;S320CPU B接收该调用报文,从中获取被调用的函数,创建用来执行该函数的执行任务T2;S330CPU B执行该函数中的命令操作,当执行到函数中的发送wait报文的代码时,向CPU A发送wait报文,该wait报文中的源CPU编号、目的CPU编号、源模块号、目的模块号、信号量编号从调用报文中取得,即该源CPU编号为调用报文中的目的CPU编号,目的CPU编号为调用报文中的源CPU编号,源模块号为调用报文中的目的模块号,目的模块号为调用报文中的源模块号,取得信号量编号为sem,结果长度为0;S340当执行任务T2结束后,发送Result报文至CPU A,Result报文中内容包括源CPU编号、目的CPU编号、源模块号、目的模块号、信号量编号、结果长度、调用结果,其中源CPU编号、目的CPU编号、源模块号、目的模块号、信号量编号从接收到的调用报文中取得,并将调用的结果和结果长度放入该报文中调用结果和结果长度的字段内。
如果在函数中增加复杂处理,则很有可能还需要再增加发送Wait报文的次数,为了减少软件代码维护量,还可以通过一个计时单元来达到控制发送wait报文的目的。这是被调用CPU执行过程的第二种实施例。在以上所述的被调用CPU执行过程的第一实施例的基础上进行改进。当创建T2时,可设置一个计时单元,根据计时单元的计时时间发送wait报文,发送wait报文的时间间隔小于检测时间。
在上述两种CPU B的执行过程的实施例中,如将超时时间设置为10S,在CPU B的函数中主动加入发送Wait报文时,很有可能不知道调用的CPU中设置的超时时间,仅能估计该代码占用的时间可能长于超时时间,为了防止产生超时错误,用户事先会插入多个发送wait报文的代码,如间隔为1S就发送一次wait报文,虽然克服了被调用函数执行时间长而超时的问题,但是它需要CPU A不停地阻塞调用任务T1和CPU B不停地发送wait报文,存在着CPU效率低的问题。假设CPU B执行该函数需要20S,设定的超时时间为8S,如果间隔1sCPU B就需发送一次wait报文,则CPU A在该同步调用中至少收到19次wait报文,阻塞19次调用任务,同样CPU B至少发送19次wait报文,造成CPU效率很低。作为上述方法的一种改进在被调用CPU也可以这样完成所述任务首先CPU A将内容中增加预先设定超时时间的调用报文发送至被调用的CPU上,如预先设定的超时时间为10S,则10S通过调用报文发送至CPU A上,请参阅图4,为CPU B的执行过程的第三个具体实施例,具体步骤如下。
S410CPU B接收到调用报文,启动计时任务T3的定时器;-S420根据调用报文中的预先设定的超时时间10S,确定计时任务T3中的计时时间Time,计时时间小于超时时间,并可为超时时间的50%-90%,在本实施例中设置计时时间为超时时间的80%,即8S;S430被调用的CPU中任务T2执行函数调用;S440T3判断执行时间是否是计时时间8S的倍数,如果是T3主动发送wait报文至调用CPU的T1,否则进行步骤S450;S450,判断是否为已执行完毕,如果是则T2发出Result报文,T3中的定时器被停止,否则进行步骤S440。
以上的实施例中,能够根据调用的CPU中预先设定的超时时间来决定发送wait报文的时间,以本实施例为例,设置的超时时间为10s,根据从调用报文中收到的10S确定计时时间为8S,如果执行本函数的时间为20S,只需发送2次wait报文命令即可,提高了CPU的利用率,保持了系统的简单和清晰。
在CPUA的调用过程还可以提供另一种实施方式,请参阅图5。
S510CPUA设定超时时间;S520CPUA执行调用任务T1,发送调用报文至CPU B,调用报文中包括被调用函数名称;S530调用任务T1开始睡眠;S540当睡眠时间等于预先设定的超时时间时,唤醒调用任务;S550判断是否收到从CPU B发送的反馈数据包,如果是进行步骤S560,否则发出调用超时错误并结束执行调用任务;S560判断数据包中是否有result报文,如果有从接收到的result报文中获得调用结果,否则进行步骤S530。
信号量方式接受到Wait报文或者Result报文,信号量得到释放后。调用任务能够立即得到调度。而睡眠方式则必须睡眠到指定时间后,操作系统才会去唤醒调用任务。可以看出,信号量方式比睡眠方式的效率要高。
以上公开的仅为本发明的几个具体实施例,但并非局限于此,任何本领域的技术人员在此基础上能思之的变动,都应落入本发明保护范围。
权利要求
1.一种远程同步调用过程中的超时自适应方法,其特征在于,包括调用CPU的调用过程和被调用CPU的执行过程,其中,所述调用CPU的调用过程包括(1)执行调用任务,发送调用报文至被调用CPU,所述调用报文包括信号量编号和被调用函数名称;(2)获取信号量,阻塞调用任务,进行阻塞计时;(3)判断阻塞计时时间是否大于预先设定的超时时间,如果是,结束执行调用任务,否则进行步骤(4);(4)判断是否收到被调用的CPU发送的反馈数据包,如果是,释放信号量,唤醒调用任务,然后进行步骤(5),否则进行步骤(3);(5)判断数据包是否是wait报文,如果是,进行步骤(2),否则从接收的result报文中获得调用结果;所述被调用CPU处理过程包括(6)被调用CPU收到调用报文,执行被调用函数,并且在执行过程中发送wait报文至调用CPU,所述发送wait报文的时间间隔小于超时时间;(7)执行函数结束后发送包括调用结果的result报文至调用CPU。
2.如权利要求1所述的远程同步调用过程中的超时自适应方法,其特征在于,所述超时时间小于调用CPU估计调用所述函数需要执行的固定超时时间。
3.如权利要求1所述的远程同步调用过程中的超时自适应方法,其特征在于还包括在被调用CPU的函数中预先插入向调用任务发送Wait报文的代码。
4.如权利要求3所述的远程同步调用过程中的超时自适应方法,其特征在于,步骤(6)中通过执行发送wait报文的代码来执行发送wait报文的操作。
5.如权利要求1所述的远程同步调用过程中的超时自适应方法,其特征在于,步骤(6)中通过一个计时单元来控制发送wait报文的时间。
6.如权利要求1所述的远程同步调用过程中的超时自适应方法,其特征在于,所述调用报文中还包括超时时间。
7.如权利要求6所述的远程同步调用过程中的超时自适应方法,其特征在于,步骤(6)还包括(6-1)被调用CPU根据接收到的调用报文中的超时时间,确定向调用CPU发送wait报文的时间间隔;(6-2)当被调用CPU执行所述函数的时间是所述时间间隔的倍数时,发送wait报文。
8.如权利要求1所述的远程同步调用过程中的超时自适应方法,其特征在于,步骤(5)通过判断接收到的报文中的结果长度是否为0来判断是否是wait报文。
9.一种远程同步调用过程中的超时自适应方法,其特征在于,包括调用CPU处理过程和被调用CPU处理过程,其中所述调用CPU处理过程包括(1)执行调用任务,发送调用报文至被调用CPU,所述调用报文包括被调用函数;(2)调用任务开始睡眠,进行睡眠计时;(3)判断睡眠计时时间是否大于等于预先设定的超时时间,如果是唤醒调用任务,然后进行步骤(4),否则进行步骤(3);(4)判断是否收到被调用的CPU发送的反馈数据包,如果是进行步骤(5),否则结束执行调用任务;(5)判断收到的数据包中是否有result报文,如果有,则从所述result报文中获得调用结果,否则进行步骤(2);所述被调用CPU处理过程包括(6)被调用CPU收到调用报文,执行被调用函数,并且在执行过程中发送wait报文至调用CPU,发送wait报文的时间间隔小于超时时间;(7)执行函数结束后发送包括调用结果的result报文至调用CPU。
10.如权利要求9所述的远程同步调用过程中的超时自适应方法,其特征在于,预先设置的超时时间小于调用CPU估计调用所述函数需要执行的固定超时时间。
全文摘要
一种远程同步调用过程中的超时自适应方法,包括调用CPU的调用过程和被调用CPU的执行过程,其中调用CPU首先执行调用任务,发送调用报文至被调用CPU,获取信号量,阻塞调用任务,接着判断在超时时间内是否收到反馈数据包,如果是调用失败,否则判断收到的数据包是否是wait报文,如果是重新获取信号量,阻塞任务,重新进行阻塞计时,如果收到的result中取得调用结果,调用成功;被调用CPU收到调用报文,执行被调用函数,并且在执行过程中发送wait报文至调用CPU,发送wait报文的时间间隔小于超时时间;执行函数结束后发送包括调用结果的result报文至调用CPU。使用该方法不会因为被调用函数执行时间长而发生调用超时错误,并且,能够快速发现调用过程中的调用错误。
文档编号G06F15/16GK1635485SQ20031012083
公开日2005年7月6日 申请日期2003年12月26日 优先权日2003年12月26日
发明者马国强 申请人:华为技术有限公司