状态机维护方法及装置
技术领域
本发明涉及系统维护技术,尤其涉及一种状态机维护方法及装置。
背景技术
在大多数软件系统中,为了维护系统性能,一般都会提供软件定时器功能。通常,软件定时器分为环回(LOOP)定时器和非环回(NOLOOP)定时器两种。其中,环回定时器按照指定时间间隔周期执行;非环回定时器只执行一次,在超时后即被系统删除。无论是环回定时器还是非环回定时器,其实现原理都需要系统的一个Tick任务在时间点到达之后向定时器任务里面写消息事件,定时器任务得到调度后读消息事件,并调用定时器相应的回调函数。比如,在定时器的回调函数里触发状态机检测操作,定时器任务每被调度一次就执行一次状态机检测。
但是,受系统运行状态的影响,如果采用环回定时器对状态机进行维护,则可能会出现定时间隔不符合用户要求的情况。比如,假设定时器粒度为1秒(s),即Tick任务每秒都向定时器任务里面写一个消息事件,那么,在理想情况下,如果定时器任务能够及时得到调度,则每一秒都会读到一个消息事件,检测一次状态机并做相应处理。但是,由于定时器任务的优先级较低,而Tick任务的优先级较高,因此,当系统负载很高时,高优先级的Tick任务都能得到调度,每秒向定时器任务里写一个消息事件,而低优先级的定时器任务由于高负载的原因可能很长时间如8秒都得不到调度。在这种情况下,当定时器任务在第9秒得到调度时,就会一下处理8个消息事件,每个消息事件之间的时间间隔非常短。对于对定时器最小时间间隔要求较为严格的状态机来说,由于其必须在触发检测事件后通过等待事件的响应来确定状态机是否发生变化,因此,如果消息事件的时间间隔太短,那么将会由于没有足够的响应时间而造成状态机的错误迁移,导致状态机混乱。
如果使用非环回定时器来维护状态机,则必须在处理完非环回定时器任务里的消息事件后,重新创建非环回定时器,以实现对状态机的持续维护。也就是说,在非环回定时器的回调函数里不仅要检测状态机,还需要创建非环回定时器。在这种情况下,如果非环回定时器任务里面的消息事件丢失,那么,将会导致新的非环回定时器永远无法再建立,状态机的维护也将停止。
总而言之,现有的状态机维护方法可靠性较低,容易造成状态机的错误迁移或状态机维护的停止。
发明内容
有鉴于此,本发明的主要目的在于提供一种状态机维护方法及装置,提高状态机维护的可靠性。
为达到上述目的,本发明提供的状态机维护方法如下:
设置环回定时器和非环回定时器;
非环回定时器被调度时检测状态机,并创建非环回定时器;
环回定时器被调度时检测非环回定时器是否存在,如果不存在,则创建非环回定时器;否则,等待下次调度。
该方法进一步包括:
设置第一计数器和第二计数器,其中,第一计数器用来统计非环回定时器被调度的次数,非环回定时器每被调度一次,第一计数器的值加一;第二计数器用来统计连续发生环回定时器被调度而非环回定时器未被调度的次数。
所述环回定时器被调度时检测非环回定时器是否存在包括:
在环回定时器被调度时,判断第一计数器的值是否发生了变化,如果发生了变化,则确定非环回定时器存在,并将第二计数器的值清零。
所述环回定时器被调度时检测非环回定时器是否存在还包括:
为第二计数器设置阈值,如果判断出第一计数器的值没有发生变化,则将第二计数器的值加一,并判断加一后的第二计数器的值是否达到预先设置的阈值,如果达到,则确定非环回定时器不存在。
所述环回定时器被调度时检测非环回定时器是否存在还包括:
如果判断出第二计数器的值没有达到预先设置的阈值,则确定非环回定时器存在。
本发明提供的状态机维护装置包括:环回定时器、非环回定时器和定时器创建模块,其中,
非环回定时器,用于在被调度时检测状态机,并在检测完毕后通知定时器创建模块创建非环回定时器;
环回定时器,用于在被调度时检测非环回定时器是否存在,如果不存在,则通知定时器创建模块创建非环回定时器;否则,等待下次调度;
定时器创建模块,用于在收到通知后创建非环回定时器。
该装置进一步包括:第一计数器和第二计数器,其中,
第一计数器,用于统计非环回定时器被调度的次数,非环回定时器每被调度一次,第一计数器的值加一;
第二计数器,用于统计连续发生环回定时器被调度而非环回定时器未被调度的次数。
所述环回定时器用于在被调度时判断第一计数器的值是否发生了变化,如果发生了变化,则确定非环回定时器存在,并将第二计数器的值清零。
所述环回定时器还用于为第二计数器设置阈值,并在判断出第一计数器的值没有发生变化时,将第二计数器的值加一,判断加一后的第二计数器的值是否达到预先设置的阈值,如果达到,则确定非环回定时器不存在。
所述环回定时器还用于在判断出第二计数器的值没有达到预先设置的阈值时,确定非环回定时器存在。
由此可见,本发明充分利用了环回定时器循环执行、即使消息事件丢失定时器也不会停止的特性,以及非环回定时器定时间隔较为稳定、不会连续出现多个消息事件的特性,实现了状态机的可靠维护。通过使用非环回定时器来执行状态机的维护操作,使得即使在系统负载较高、定时器任务不能得到及时调度的情况下,也不会出现定时器任务被调度时在短时间内需要处理多个消息事件的情形,避免了状态机的错误迁移;并且,通过使用环回定时器检测非环回定时器是否存在,可以避免由于非环回定时器任务里的消息事件丢失而造成状态机维护操作停止的情况发生,提高了状态机维护的可靠性。
附图说明
图1为本发明实施例中的非环回定时器检测流程图。
图2为本发明实施例中理想情况下,环回定时器与非环回定时器的工作过程示意图。
图3为本发明实施例中非环回定时器任务里的消息事件丢失的情况下,环回定时器与非环回定时器的工作过程示意图。
图4为本发明实施例中的状态机维护装置结构示意图。
图5为本发明实施例中的另一状态机维护装置结构示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,下面参照附图并举实施例,对本发明作进一步详细说明。
由背景技术描述可见,在现有技术中,如果采用环回定时器进行状态机维护,则在系统负载很高定时器任务得不到及时调度的情况下,会由于消息事件时间间隔太短而造成状态机的错误迁移;如果采用非环回定时器进行状态机维护,则会由于消息事件的丢失而导致状态机维护的停止。
为了解决上述问题,提高状态机维护的可靠性,本发明提供了一种将环回定时器和非环回定时器结合起来使用的状态机维护方法。在本发明中,非环回定时器用来执行状态机维护操作;环回定时器用来监控非环回定时器,其不执行具体的状态机维护操作。由于非环回定时器在被调度后即被删除,因此为了实现状态机的持续维护,在非环回定时器的回调函数里不仅要执行状态机维护操作,并且还需要重新创建非环回定时器。也就是说,非环回定时器每被调度一次就检测一次状态机,并重新创建非环回定时器。
另外,为了防止由于非定时器任务里的消息事件丢失而造成状态机维护的停止,本发明还需要设置环回定时器来监控非环回定时器。环回定时器在被调度时检测非环回定时器是否存在,如果存在,则等待下次调度;如果不存在,则重新创建非环回定时器,以实现状态机的持续维护。
其中,关于环回定时器检测非环回定时器是否存在的过程具体可通过设置计数器来实现。比如,分别设置第一计数器和第二计数器,其中,第一计数器用来统计非环回定时器被调度的次数,其值记作value1;第二计数器用来统计环回定时器被调度的次数,其值记作value 2。非环回定时器每被调度一次,第一计数器的值value 1就加一;环回定时器每被调度一次,第二计数器的值value 2就加一。在初始状态下,第一计数器的值和第二计数器的值均为0。另外,针对第二计数器,还需要设置一个阈值m,阈值m的具体数值可根据实际需求预先设定,比如结合系统负载及定时器任务的优先级来确定。
下面对使用第一计数器和第二计数器进行非环回定时器检测的过程进行详细说明。参见图1所示,该过程主要包括以下步骤:
步骤101:环回定时器被调度时,判断第一计数器的值value 1是否发生了变化,如果是,则执行步骤102;否则,执行步骤103。
其中,判断第一计数器的值value 1是否发生了变化,可以通过比较记录的第一计数器的值与当前第一计数器的值是否相同实现,如果相同,则确定第一计数器的值没有发生变化;如果不同,则确定第一计数器的值发生了变化。
步骤102:记录第一计数器的当前值,并将第二计数器的值value 2清零,然后跳出本流程。
也就是说,只要第一计数器的值发生了变化,即非环回定时器得到了调度,那么就将第二计数器的值清零,重新开始计数。实际上,第二计数器统计的是连续发生环回定时器被调度而非环回定时器未被调度的次数。
步骤103:将第二计数器的值value 2加一,并判断加一后的值是否小于预先设定的阈值m,如果小于,则跳出本流程,等待环回定时器的下次调度;否则,执行步骤104。
步骤104:重新创建非环回定时器。
也就是说,如果第二计数器的值达到了阈值m,即环回定时器被调度了m次,而非环回定时器都没有被调度一次,表现为在环回定时器多次被调度的期间,第一计数器的值value 1一直没有发生变化,那么,则认为非环回定时器的消息事件丢失,非环回定时器不存在了。此时,环回定时器需要重新创建非环回定时器,以保证状态机维护工作能够继续执行。
为了更加清楚起见,下面以环回定时器和非环回定时器的定时精度均为1s为例,对本发明中环回定时器和非环回定时器的协同工作过程进行详细说明。
图2所示为理想情况下环回定时器与非环回定时器的工作过程示意图。其中,实心圆圈表示环回定时器的执行点,即检测非环回定时器是否存在的时间点;空心圆圈表示非环回定时器的执行点,即执行状态机维护操作的时间点;方框表示建立非环回定时器的时间点。由图2可见,在理想情况下,即非环回定时器任务里的消息事件没有丢失并且非环回定时器能够及时得到调度的情况下,非环回定时器每秒都会执行一次状态机维护操作,并在执行完毕后重新创建非环回定时器。
图3所示为非环回定时器任务里的消息事件丢失情况下,环回定时器与非环回定时器的工作过程示意图。其中,阈值m被设置为4。由图3可见,当第二计数器的值value 2达到了阈值4时,即环回定时器发现自身被连续调度了4次,而非环回定时器由于消息事件丢失却一次都没有被调度时,则认为非环回定时器不存在了,环回定时器需要重新创建非环回定时器,以防止状态机维护操作停止的情况发生。
如果在第二计数器的值value 2尚未达到阈值4时,如value 2=3时,第一计数器的值又发生了变化,那么,则需要将第二计数器的值清零,重新开始计数。
由以上描述可见,本发明充分利用了环回定时器循环执行、即使消息事件丢失定时器也不会停止的特性,以及非环回定时器定时间隔较为稳定、不会连续出现多个消息事件的特性,实现了状态机的可靠维护。采用本发明所提供的技术方案,通过使用非环回定时器来执行状态机的维护操作,使得即使在系统负载较高、定时器任务不能得到及时调度的情况下,也不会出现定时器任务被调度时在短时间内需要处理多个消息事件的情形,避免了状态机的错误迁移;并且,通过使用环回定时器检测非环回定时器是否存在,可以避免由于非环回定时器任务里的消息事件丢失而造成状态机维护操作停止的情况发生,提高了状态机维护的可靠性。
相应地,本发明还提供了一种状态机维护装置,其结构参见图4所示,主要包括:环回定时器、非环回定时器和定时器创建模块,其中,
非环回定时器,用于在被调度时检测状态机,并在检测完毕后通知定时器创建模块创建非环回定时器;
环回定时器,用于在被调度时检测非环回定时器是否存在,如果不存在,则通知定时器创建模块创建非环回定时器;否则,等待下次调度;
定时器创建模块,用于在收到通知后创建非环回定时器。
参见图5所示,该装置还可包括:第一计数器和第二计数器,其中,
第一计数器,用于统计非环回定时器被调度的次数,非环回定时器每被调度一次,第一计数器的值加一;
第二计数器,用于统计连续发生环回定时器被调度而非环回定时器未被调度的次数。
所述环回定时器用于在被调度时判断第一计数器的值是否发生了变化,如果发生了变化,则确定非环回定时器存在,并将第二计数器的值清零。
所述环回定时器还用于为第二计数器设置阈值,并在判断出第一计数器的值没有发生变化时,将第二计数器的值加一,判断加一后的第二计数器的值是否达到预先设置的阈值,如果达到,则确定非环回定时器不存在。
所述环回定时器还用于在判断出第二计数器的值没有达到预先设置的阈值时,确定非环回定时器存在。
以上所述对本发明的目的、技术方案和有益效果进行了进一步的详细说明,所应理解的是,以上所述并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。