一种定时器调度方法

文档序号:7677962阅读:194来源:国知局
专利名称:一种定时器调度方法
技术领域
本发明涉及一种定时器的调度方法,尤其是指一种在通讯系统中处理大话务量负载时的海量定时器调度方法。
(2)差分定时器调度方法所谓差分定时器调度方法把定时器按照到时时刻排列成一个长链,每个定时器记录自身到时时该与上一个定时器到时时间的时间差,如附图2所示,该调度方法几乎没有扫描开销,判断是否有定时器超时,只需判断链表头的第一个定时器即可。但是如果插入一个新的定时器,就需要遍历链表,当处于激活状态的定时器数量非常大的时候,插入过程就会慢的无法接受,尤其在插入非常频繁的情况下。这种方案只能应用于定时器数量巨大,但是插入和删除并不频繁,平均定时时长比较短的情况下尚可。
(3)分类定时器调度方法有些通讯系统中采用了定时器时长分类的方法,系统根据所用到的定时时长将定时器进行分类,针对每个长度的定时器构造一个链表,如附图3所示的分类定时器调度方法,系统将定时器根据定时时长120tick、200tick和800tick分别构造了a、b、c三类链表,当判断是否有定时器超时,只需在每个tick内扫描定时器链表中的第一个定时器即可。由于每个链表只有一种定时时延,新登记的定时器可以直接插入该定时器所属定时器类的链表尾部,如附图4所示,当新增加的定时器时长为200tick时,只需要直接插入到定时时长为200tick的链表b中。这种方法利用了差分定时器的优点,并且针对系统的特殊性克服了差分定时器在插入效率上的缺点。当定时器时长的种类很少时,这种调度方法非常高效,但是这种定时器只能应付定时器时长的可能取值有限的情况,对于超时时长可能取值种类过多或者可变的系统是不适用的。
以上所述现有的定时器调度方法在调度上万甚至上百万个定时器时通常不能同时解决下列问题(1)高效扫描大量处于激活状态的定时器,执行超时的定时器任务;(2)高效插入、删除定时器;(3)可提供的定时时延范围足够大,应用程序不必对特殊长度的时延进行特殊处理;(4)定时的精度足够高,满足精确定时的需要。另外,对于实时系统,定时器调度方案还必须使系统能够长期稳定地工作,通常不可以动态地分配和释放内存,以免造成内存碎片化;同时,定时器调度方法最好能够通用。许多系统实现了不同精度不同长度的几类定时器,或者为某些特定时长的定时器进行了优化,所有这些方案都会增大调度程序总的复杂性,增大应用程序使用定时任务的难度,降低系统的可靠性。现在通讯系统的容量越来越大,速度越来越高,协议越来越复杂,稳定性要求也越来越高,对这种即通用又高效的海量定时器调度方法的需求变得愈发迫切。
本发明的目的是这样实现的一种定时器调度方法,其步骤包括(1)按照数学进位制确定该定时器的超时时长的最高有效位;(2)将该定时器登记到最高有效位所对应类别链表的尾部;(3)当定时器在该链表中超时,取出该定时器,再次按照所选定的数学进位制确定剩余时长的最高有效位,并登记到相应链表的尾部;(4)当该定时器的超时,启动该定时器的超时任务,并删除该定时器。
该定时器调度方法还包括扫描过程,该扫描过程是指系统从最小时长类别的链表开始循环处理每个类别的链表,包括以下步骤(a)判断当前链表中是否还有定时器,若无则扫描下一个链表,否则读取本链表头部的定时器;(b)判断该读取的定时器在本链表中的拆分时长是否到时,若未到时则扫描下一个链表,否则执行下一个步骤;(c)判断该定时器是否超时,若超时则执行步骤(4),否则执行步骤(3);(d)返回步骤(b)。
其中,所述定时器类别链表按照所选定的数学进位制分类。
图2为现有技术差分定时器调度方法的示意图。
图3为现有技术分类定时器调度方法的示意图。
图4为图3所示方法的插入定时器的示意图。
图5为本发明拆分定时器调度方法的示意图。
图6、7为图5所示方法的插入定时器的示意图。
图8为本发明方法定时器扫描的流程图。
根据前面所述,差分定时器调度方法的缺点在于插入速度太慢,需要扫描链表。分类定时器调度方法的缺点在于不能处理任意时长,提供的时长类别也不能过多,如果需要定时的时长随机地分布在一个很大的范围内,不可能为每个时长都提供一个类别。但是实际上并不需要为所有的时长准备一个类别,许多时长是可以通过其他的时长相加组合而来。例如你有了时长为3以及时长为5的时长类别,那么你就可以直接组合出时长为8的定时间隔。方法很简单,先启动一个时长为3的定时器,超时的时候立即启动一个时长为5的定时器,这个时长为5的定时器超时的时候,正好经过了8个tick。基于此,我们可以设定一些有规律的时长类别,将具体的时长都拆分成这些时长类别相组合后再进行扫描处理,即本发明所述时长拆分。所谓时长拆分就是将定时器的超时时长按照一定的数学进位制进行拆分。
本发明在最佳实施方式中采用了二进制对时长进行拆分,二进制时长拆分方法就是把每一个时长都表示成若干个2k相加的形式,2k就表示一个时长类别,每一个时长类别组成一个链表。因此可以提供的定时类别可以只有1,2,4,8,...,2k,...,k+1即是定时类别的个数(k从0开始计数),也是链表的个数。这样,本发明的系统仅仅需要定时时长为1,2,4,8,...,2k,...的定时类别链表。对于32位系统,如果使用32位整数作为时长的类型,则只需要32个时长类别链表,每个链表对应一个k值(k=0,1,2,...,31),最差情况只需要把一个定时器时长拆分32次,实际上每次拆分只需要极短的时间,这个开销完全是微不足道的。当然,如果时长正好等于2k,则不用拆分。该32位系统可以处理时长达40亿之巨,完成可以满足特殊长度的时长要求。为叙述和


的方便,本实施方式中采用8个链表的系统进行说明,如附图5所示,在该8个链表的系统中,k=0,1,2,...,7,时长类别为20、21、22、23、24、25、26和27八个,对应的链表分别记为0,1,2,...,7。
当要插入一个定时器时,首先需要计算该定时器的到时时刻,即定时器的时长N;确定好定时器的定时长N后,需要确定定时器的二进制最高有效位,所述最高有效位是指时长可以表示成数学进位制相加形式时的最高次幂,若N表示成2k相加的形式,即N=1+2+4+,...,+2k,其最高次幂k就是N的最高有效位;与分类定时器调度方法相同,要插入该时长为N的定时器,只需要先把该定时器登记到最高有效位k所对应的链表k的尾部即可。许多CPU直接支持位扫描指令,这条指令可以直接确定一个整数的最高或最低有效位,因此可以直接利用这个指令确定一个时长为N的定时器应当登记到哪一个定时器链表中去。即使没有这个指令,通过移位运算确定这个上标也是非常快速的,不过几十个CPU时钟周期而已。当该时长为N的定时器在链表k中超时,就需要再确定剩余时长N-2k的最高有效位,再将该定时器登记到剩余时长N-2k的最高有效位所对应的链表的尾部,以此类推,直到该定时器的时长为0。
例如,对于时长22,其二进制表示为00010110,即在二进制表示中的位置为第1、2、4位,其最高有效位上标为4,该时长22采用二进制进行时长拆分可以表示为22=24+22+21,即可以拆分为时长类别为21、22和24的组合。在进行定时器扫描时,首先找到时长22的最高有效位4,将该定时器登记到最高有效位时长类别24的定时器链表4的尾部,如附图6所示;16个tick之后,该定时器在当前的链表(时长类别为24)中超时并且被取出,此时该定时器距离真正应该超时的时间还剩下6个tick;此时立即找到剩下6个tick里的最高有效位2,并把它登记到时长类别22的定时器链表2的尾部,如附图7所示;又经过了4个tick之后该定时器在当前链表(时长类别为为4)中超时并且被取出;此时再次立即找到剩下2个tick里的最高有效位1,并把它登记到时长类别21的定时器链表1的尾部。当时长为2的定时器再次超时的时候,该定时器才真正经过了22个tick,此时运行这个定时器对应的超时任务,且将该定时器自链表中删除。
当需要判断是否有定时器超时,只需要在每个tick扫描每个类别链表的第一个定时器即可,其扫描流程如附图8所示。系统从最小时长类别的定时器链表20开始循环处理每一个类别的链表,并同时开始进行tick的计数,如步骤20与步骤22所示。其次判断该时长类别的链表中是否还有定时器,如步骤23所示,如果没有则返回步骤22扫描下一个时长类别的定时器链表;否则取出该链表头部的定时器,如步骤24所示,并判断该取出的定时器登记到本链表中的拆分时长是否到时,如步骤25所示,该拆分时长与本链表的时长类别相等,例如前面所述的时长为22的定时器首先拆分登记到时长类别为24的链表中,在进行定时器扫描时,就要判断是否该定时器是否已达到拆分时长16个tick,即是否到时。由于每个链表中登记的定时器的拆分时长是一样的,且每次定时器要插入时都是登记在该链表的尾部,所以越往头部则定时器所剩余的拆分时长越短或相等,故每次扫描时只需要检查头部的定时器是否超时即可。如果没有到时则返回步骤22扫描下一个时长类别的定时器链表,否则就要判断该定时器是否实际到时,如步骤26所示,所谓实际到时就是指是否到达了整个时长,如时长22的定时器是否已经过了22个tick,如果没有实际到时,则将该定时器自本链表中取出,再确定其剩余时长的最高有效位,重新将该定时器插入到剩余时长的最高有效位对应的链表中,如步骤27所示,如前述时长为22的定时器,当在类别为24的链表中到时,但还没有实际到时,所以再确定其剩下6个tick里的最高有效位所在位置的上标2,并把它登记到时长类别22的定时器链表2的尾部;否则启动该定时器的超时任务,并删除该定时器,即清空该定时器链节,并将该定时器链节自链表中断开,如步骤28所示;经过步骤27或28以后,返回到步骤23继续扫描,直到扫描完所有的链表。
本发明方法还可以采取三进制对时长进行拆分,比如时长22可以用三进制拆分表示为22=2×32+1×31+1×30。当然还可以采用其他进位制。
本发明所述的拆分定时器调度方法,本身造成的开销非常低,能够对于不同时长和精度的定时器都能够统一处理,有效地降低了系统的复杂程度,提高了可移植性和可维护性。
权利要求
1.一种定时器调度方法,其步骤包括(1)按照数学进位制确定定时器的超时时长的最高有效位,该最高有效位确定拆分时长;(3)将该定时器登记到最高有效位所对应定时器类别链表的尾部;(3)当定时器在该链表中的拆分时长到时,取出该定时器,再次按照所选定的数学进位制确定剩余时长的最高有效位,并登记到相应链表的尾部;(4)当该定时器超时,启动该定时器的超时任务,并删除该定时器。
2.如权利要求1所述的定时器调度方法,其特征在于还包括扫描过程,该扫描过程是指系统从最小时长类别的链表开始循环处理每个类别的链表,包括以下步骤(a)判断当前链表中是否还有定时器,若无则扫描下一个链表,否则读取本链表头部的定时器;(b)判断该读取的定时器在本链表中的拆分时长是否到时,若未到时则扫描下一个链表,否则执行下一个步骤;(c)判断该定时器是否超时,若超时则执行步骤(4),否则执行步骤(3);(d)返回步骤(b)。
3.如权利要求1所述的定时器调度方法,其特征在于所述定时器类别链表按照所选定的数学进位制分类。
4.如权利要求1所述的定时器调度方法,其特征在于所述的数学进位制为二进制。
5.如权利要求1所述的定时器调度方法,其特征在于所述的数学进位制为三进制。
6.如权利要求1所述的定时器调度方法,其特征在于所述最高有效位是指超时时长表示成选定的数学进位制相加形式时的最高次幂。
7.如权利要求1所述的定时器调度方法,其特征在于所述的超时时长是指所述定时器的实际全部的时长。
8.如权利要求1所述的定时器调度方法,其特征在于所述拆分时长与所述的链表的时长类别相等。
9.如权利要求1所述的定时器调度方法,其特征在于所述删除定时器是指清空该定时器链节,并将该定时器链节自链表中断开。
全文摘要
一种定时器调度方法,是指将定时器的超时时长按照一定的数学进位制进行拆分,如采用二进制时就是将时长拆分成若干个文档编号H04M3/22GK1366416SQ02104829
公开日2002年8月28日 申请日期2002年2月8日 优先权日2002年2月8日
发明者孙伊 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1