CN103473071A - 软件定时器的实现方法和系统 - Google Patents
软件定时器的实现方法和系统 Download PDFInfo
- Publication number
- CN103473071A CN103473071A CN2013104390312A CN201310439031A CN103473071A CN 103473071 A CN103473071 A CN 103473071A CN 2013104390312 A CN2013104390312 A CN 2013104390312A CN 201310439031 A CN201310439031 A CN 201310439031A CN 103473071 A CN103473071 A CN 103473071A
- Authority
- CN
- China
- Prior art keywords
- timer
- timing
- array
- carry
- inscribing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Measurement Of Unknown Time Intervals (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种软件定时器实现方法,采用双数组多队列的方式管理定时器,按照定时器的定时时长以及当前计时时刻确定定时器所属的定时器队列,使得定时器的分布比较均匀,不易出现某个定时器队列过长的现象,而且,在某个计时时刻只扫描两个定时器队列来判断定时器是否达到定时时长,即减少了扫描队列数量,从而提高了定时器的定时效率。本申请实施例还提供一种软件定时器实现系统。
Description
技术领域
本发明涉及定时器技术领域,更具体地说,涉及一种软件定时器的实现方法和系统。
背景技术
在软件开发过程中,需要用到大量的定时器(即软件定时器),定时器的作用就是控制软件等待某事件发生的时间间隔,具体在实现时,需要检测定时器是否达到定时时长,如果是,则触发相应的事件。目前常见的软件定时器的实现方法有两种:
一种是单队列实现方法,该方法采用一个队列进行定时器管理控制,即将定时器按定时时长从小到大的顺序进行排列,当增加定时器时,根据定时时长从小到大的原则,插入到当前队列的对应位置,该种方法虽然实现简单,但在海量定时器场景下,定时器节点堆积数量大,定时器的定时效率低,导致定时器达到定时时长时不能及时触发相应事件,使得服务器时延大。为了提高定时器的定时效率,目前提出一种多队列定时器实现方法,该方法将所有的定时器中同一定时精度的定时器分为一组,通过轮询方式检测每一个队列中的定时器是否超时。
发明人在实现本发明的过程中发现,目前的多队列定时器实现方法,相对于单队列实现方法,虽然效率有所提高,但是,会存在很多冗余遍历定时器的操作,例如,假设有N个队列,那么,当只有一个定时器时,系统还需要去检测其它N-1个队列有没有定时器超时,这样系统就白白耗费了轮询N-1队列的时间,因此,当定时器的数量较大时,定时器的定时效率仍然较低。
发明内容
本发明的目的是提供一种软件定时器实现方法,以进一步提高定时器的定时效率。
为实现上述目的,本发明提供了如下技术方案:
一种软件定时器的实现方法,包括:
预定义循环计时器;
依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;
当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;
如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;
如果否,获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
上述方法,优选的,当所述计数器的初始值大于所述商值时,还包括:扫描当前计时时刻下的定时器队列,
当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
计数器初始值=目标计数值+商值+1。
上述方法,优选的,当所述计数器的初始值等于所述商值时,还包括:扫描当前计时时刻下的定时器队列,
当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
上述方法,优选的,当判断出有定时器达到定时时长时,还包括:
判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
上述方法,优选的,还包括:
如果所述达到定时时长的定时器不是循环定时器,则将所述达到定时时长的定时器释放并进行缓存。
上述方法,优选的,对当前计时时刻下的定时器队列进行扫描后,还包括:
判断是否到达下一计时时刻,如果是,则扫描下一计时时刻下挂载的定时器队列;否则,等待下一计时时刻到达时,再扫描下一计时时刻下挂载的定时器队列。
上述方法,优选的,所述循环计时器的计时时长依据定时器的定时时长确定。
一种软件定时器实现系统,包括:
预定义模块,用于预定义循环计时器;
初始化模块,用于依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;
第一定时器增加模块,用于当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;如果否,则获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
上述系统,优选的,当所述计数器的初始值大于所述商值时,所述系统还包括:
第一扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
计数器初始值=目标计数值+商值+1。
上述系统,优选的,当所述计数器的初始值等于所述商值时,所述系统还包括:
第二扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
上述系统,优选的,还包括:
第二定时器增加模块,用于当有定时器达到定时时长时,判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
通过以上方案可知,本申请提供的一种软件定时器实现方法,预先设定两个计时数组,将定时器按定时时长以及预先定义的循环计时器的计时时长挂载在相应的计数器数组中的目的计时时刻下的定时器队列中,且定时器的目的计时时刻依据当前定时时刻以及定时器的定时时长确定,因此,对于第一计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述目的计时时刻时,就可以判断该目的计时时刻下的定时器达到计时时长,而对于第二计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述目的计时时刻时,可以结合计数器判断该目的计时时刻下的定时器是否达到定时时长。
由此可知,本申请实施例提供的一种软件定时器实现方法,采用双数组多队列的方式管理定时器,按照定时器的定时时长以及当前计时时刻确定定时器所属的定时器队列,使得定时器的分布比较均匀,不易出现某个定时器队列过长的现象,而且,在某个计时时刻可以只扫描两个定时器队列来判断定时器是否达到定时时长,减少了扫描队列数量,从而提高了定时效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种软件定时器实现方法的流程图;
图2为本申请实施例提供的扫描当前计时时刻下的定时器队列的流程图;
图3为本申请实施例提供的另一种扫描当前计时时刻下的定时器队列的流程图;
图4为本申请实施例提供的一种软件定时器实现系统的结构示意图;
图5为本申请实施例提供的另一种软件定时器实现系统的结构示意图;
图6为本申请实施例提供的又一种软件定时器实现系统的结构示意图;
图7a为本申请实施例提供的又一种软件定时器实现系统的结构示意图;
图7b为本申请实施例提供的又一种软件定时器实现系统的结构示意图。
说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的部分,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示的以外的顺序实施。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,图1为本申请实施例提供的一种软件定时器实现方法的流程图,包括:
步骤S101:预定义循环计时器;
循环计时器的计时位数n可以自定义,如n的取值可以为16,也可以为22,或其它取值,如15,或32等等,这里不做具体限定。也就是说,循环计时器的各个计时时刻由一个n位的二进制数表示;而循环计时器的计时精度可以根据需要设置的所有定时器中的最小定时精度确定,例如,假设需要设置的所有定时器的精度包括三种:毫秒、秒和分钟,那么,循环计时器的计时精度可以选为毫秒,即循环计时器每1毫秒计时一次,也就是说,循环计时器的各个计时时刻的单位为毫秒。因此,在定义了循环计时器的位数及精度后,循环计时器的计时时长也就确定了,即2n*a,其中,a为计时精度,例如,a=1纳秒,或a=1毫秒,或a=1秒,或a=1分钟等等。
本实施例中,循环计时器从0开始计时,每1计时精度计时一次,当计时到(2n-1)计时精度时,会跳转到0从头开始计时,例如,假设计时精度为毫秒,那么,循环计时器会每1毫秒计时一次,当计时到(2n-1)毫秒时,跳转到0从头开始计时。
步骤S102:依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时时刻。
所述第一计时数组中的各个元素依次为0、1、2、3、……、2n-1,所述第二计时数组与所述第一计时数组相同,因此,第二计时数组中的各个元素也依次为0、1、2、3、……、2n-1。
步骤S103:当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则执行步骤S104;否则,执行步骤S105;
判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内,可以通过判断所述待增加的定时器的定时时长是否小于所述循环计时器的计时时长,如果待增加的定时器的定时时长小于或等于所述循环计时器的计时时长,则待增加的定时器的定时时长在所述循环计时器的计时时长范围内,否则,所述待增加的定时器的定时时长不在所述循环计时器的计时时长范围内。
当然,也可以将待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算,根据商值来判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内,具体的,当所述商值为0时,确定所述待增加的定时器的定时时长在所述循环计时器的计时时长范围内,当所述商值不为零时,确定所述待增加的定时器的定时时长不在所述循环计时器的计时时长范围内。
步骤S104:依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;
换句话说,待增加的定时器所对应的目的计时时刻为:以所述循环计时器当前计时时刻为基准,向计时时刻增大的方向偏移所述待增加的定时时长所确定的定时时刻。
举例说明:假设循环计时器的计时时长为从0毫秒到65535毫秒,即65536毫秒,也就是65536个计时时刻,待增加的定时器的定时时长为60毫秒;
假设当前循环计时器的计时时刻为10毫秒,那么,该待增加的定时器的目的计时时刻则为70毫秒,即以10毫秒为基准,向计时时刻增大的方向偏移60毫秒;此时,将待增加的定时器挂载在第一计时数组中,与70毫秒对应的元素下所挂载的定时器队列中。
假设当前循环计时器的计时时刻为65530毫秒,那么,该待增加的定时器的目的计时时刻则为54毫秒,即以65530毫秒为基准,向计时时刻增大的方向偏移60毫秒,而由于偏移5毫秒时,循环计时器的计时时刻达到了循环计时器的最大计时时刻65535毫秒,此时,循环计时器会跳转到0重新计时,因此,需要从0开始再向计时时刻增大的方向偏移55毫秒,即54毫秒的计时时刻即为待增加的定时器的目的计时时刻。此时,将待增加的定时器挂载在第一计时数组中,54毫秒对应的元素下所挂载的定时器队列中。
步骤S105:获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,该计数器可以用来判断定时器是否达到定时时长;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
也就是说,在待增加的定时器的定时时长大于所述循环计时器的计时时长时,将待增加的定时器加载在第二计时数组中;
其中,所述计数器的初始值依据所述商值确定,所述初始值可以为所述商值;
所述计数器的初始值也可以大于所述商值,此时,所有计数器的初始值按照统一的赋值规则进行赋值,例如,预先确定目标计数值,所述计数器的初始值可以按第一公式确定,所述第一公式为:
计数器的初始值=目标计数值+商值+1。
需要说明的是,在具体实施过程中,所有定时器所对应的计数器应该都使用同一种初始化方法,即,所有计数器在初始化时,要么初始值都为商值,要么初始值都按照统一的赋值规则进行赋值。
举例说明:假设循环计时器的计时时长为从0毫秒到65535毫秒,即65536毫秒,共65536个计时时刻,待增加的定时器的定时时长为65538毫秒;
将待增加的定时器的定时时长与循环计时器的计时时长做除法运算,得到的商值为1,余数为2
假设当前循环计时器的计时时刻为10毫秒,那么,该待增加的定时器的第二目的计时时刻则为12毫秒,即以10毫秒为基准,向计时时刻增大的方向偏移2毫秒;此时,将待增加的定时器挂载在第二计时数组中,12毫秒对应的元素下所挂载的定时器队列中,同时针对该定时器设置一个计数器,该计数器的初始值根据赋值规则可以为1,或者设置为大于1,例如初始值为2或3等等,只要大于1即可。
本申请实施例中,两个计时数组中的每个元素都可以对应一个定时器队列,因此,每一个元素都可以看做是一个定时器队列的队列头,所以,本申请实施例是通过双数组多队列的方式对定时器进行管理控制,从而实现了软件定时。
本申请实施例提供的一种软件定时器实现方法,预先设定两个计时数组,将定时器按定时时长以及预先定义的循环计时器的计时时长挂载在相应的计数器数组中的目的计时时刻所对应的元素下的定时器队列中,且定时器的目的计时时刻依据当前定时时刻以及定时器的定时时长确定,因此,对于第一计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述第一目的计时时刻时,就可以确定该第一目的计时时刻下的定时器达到计时时长,而对于第二计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述第二目的计时时刻时,可以结合计数器判断该目的计时时刻下的定时器是否达到定时时长。
由此可知,本申请实施例提供的一种软件定时器实现方法,采用双数组多队列的方式管理定时器,按照定时器的定时时长以及当前计时时刻确定定时器所属的定时器队列,使得定时器的分布比较均匀,不易出现某个定时器队列过长的现象,而且,在某个计时时刻只扫描两个定时器队列来判断定时器是否达到定时时长,减少了扫描队列数量,从而提高了定时效率,而且,因为定时器节点分分布均匀,不会导致某一队列过长而导致消耗过多的扫描时间,因此,本申请实施例提供的定时器实现方法,不会因为定时器数量的指数增长而使得定时效率呈指数下跌。
而且,在增加定时器时,直接插入相应队列即可,不用对定时器进行排序,进一步提高了定时器的定时效率。
另外,由于,同一时刻只扫描两个队列,因此,冗余扫描少(最多两次冗余扫描),而且,由于第二数组下挂载的定时器设置有与其对应的计数器,也就是说,第二计时数组中的定时器一定有设置有相应的计数器,换句话说,如果当前计时时刻下,第二计时数组中当前计时时刻对应的元素下设置有计数器,则该第二计时数组中当前计时时刻对应的元素下一定挂载有定时器,否则,没有挂载定时器,因此,在进行定时器扫描时,可以根据当前计时时刻下的定时器队列是否设置有计数器来判断是否需要对当前计时时刻下第二数组相应元素下的定时器队列进行扫描,如果设置有定时器,则进行扫描,如果没设置有定时器,则不进行扫描,因此可以避免冗余扫描,可以进一步提高定时器的定时效率。
进一步的,由于本方案结合使用计数器进行定时,定时时长t较长,其定时时长t为:
t=2(i+j)*a,
其中,i为定时器位数,j为计数器位数,a为定时器精度。
例如,假设定时器位数为16(short类型),计数器位数为32(int类型),精度为10毫秒,则定时时长t为:
t=2(16+32)*0.01秒=89255年。
上述实施例,优选的,当所述计数器的初始值大于所述商值时,还可以包括:扫描当前计时时刻下的定时器队列的步骤,具体的,所述扫描当前计时时刻下的定时器队列的流程图如图2所示,可以包括:
步骤S201:当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
也就是说,循环计时器每达到一个计时时刻,就对第一计时数组中,该计时时刻下挂载的定时器队列进行扫描,如果该计时时刻下挂载有定时器,则该定时时刻下挂载的定时器达到了定时时长。
步骤S202:当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,判断当前计时时刻下挂载的定时器达到定时时长;
其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
计数器的初始值=目标计数值+商值+1。
也就是说,循环计时器每达到一个计时时刻,除了对第一计时数组中,当前计时时刻下挂载的定时器队列进行扫描,还对第二计时数组中,该计时时刻下挂载的定时器队列进行扫描,当该计时时刻下挂载有定时器队列时,将当前计时时刻下挂载的所有定时器所对应的计数器的计数值减一,如果此时有定时器的计数值为零,则可判断该计数值为零的计数器对应的计时器达到定时时长。
当判断出定时器达到定时时长时,就可以发送超时信号以触发相应的事件。
其中,步骤S201和步骤S202执行顺序不做具体限定,即在当前扫描周期内,可以先对第一计时数组中当前计时时刻下的定时器队列进行扫描,然后对第二计时数组中当前计时时刻下的定时器队列进行扫描;也可以先对第二计时数组中当前计时时刻下的定时器队列进行扫描,然后对第一计时数组中当前计时时刻下的定时器队列进行扫描;
上述实施例,优选的,当所述计数器的初始值为所述商值时,本申请实施例提供的另一种扫描当前计时时刻下的定时器队列的流程图如图3所示,可以包括:
步骤S301:当第一计时数组中的当前计时时刻下挂载有定时器时,判断当前计时时刻下挂载的定时器达到定时时长;
具体可参见步骤S201,这里不再赘述。
步骤S302:当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
本申请实施例中,先扫描第一计时数组中当前计时时刻对应的元素下的定时器队列,再扫描第二计时数组中当前计时时刻对应的元素下的定时器队列,在当前计时时刻下挂载的定时所对应的计数器的计数值为零时,将该计数值为零的计数器对应的定时器从第二计时数组中移除,并挂载在第一计时数组中当前计时时刻下挂载的定时器队列中。
上述实施例,优选的,当判断出有定时器达到定时时长时,还可以包括:
判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器;如果否,则将所述达到定时时长的定时器存储到缓存中。
也就是说,本申请实施例提供的软件定时器实现方法,可支持的定时器包括一次性定时器和循环定时器;其中,所述一次性定时器是指该定时器达到定时时长后不再进行定时,可以退出定时器队列;所述循环定时器是指该定时器在达到定时时长后,还要再次进行定时。
此时,可以以当前计时时刻为基准,再增加一个具有相同定时时长的定时器即可。
如果所述达到定时时长的定时器不是循环定时器,则将该达到定时时长的定时器退出定时器队列,并存储在缓存中,以供下次增加定时器时使用。
为了优化上述实施例,可以预先设置空闲定时器队列,用于缓存暂时空闲的定时器,以便变需要曾加定时器时可以快速获取空闲定时器。
上述实施例,优选的,为了保证定时器的精准性,对当前计时时刻下的定时器队列进行扫描后,还可以包括:
判断是否到达下一计时时刻,如果是,则扫描所述循环计时器的下一计时时刻下挂载的定时器队列;否则,等待下一计时时刻到达时,再扫描下一计时时刻下挂载的定时器队列;
其中,所述到达下一时刻包括:正好到达下一计时时刻,或者,超过了所述下一计时时刻,例如,假设当前计时时刻为t1,下一计时时刻为t2,那么,所述到达下一时刻包括:到达t1计时时刻;或者到达t3时刻,其中,t3>t2。相应的,如果到达下一计时时刻,则不管是到达t2计时时刻,还是到达t3计时时刻,则扫描t2计时时刻对应的计时数组元素下所挂载的定时器队列。如果还未到达t2计时时刻,则进行等待,等到计时时刻到达t2计时时刻时,扫描t2计时时刻对应的计时数组元素下所挂载的定时器队列。
上述实施例,优选的,所述循环计时器的计时时长可以依据定时器的定时时长确定,例如,可以设置所述循环计时器的计时时长大于或等于最长的定时时长,以保证所有的定时器都挂载在第一计时数组队列中;当然,也可以将大部分定时器挂载在第一计时数组中的定时器队列中,例如,可以将2/3的定时器挂载在第一计时数组中的定时器队列中,将其余1/3定时器挂载在第二计时数组中的定时器队列中,此时,循环计时器的计时时长可以等于所述2/3的定时器可以实现的最长定时时长。
以下是本发明方法的定时器节点程序实现的一种具体示例:
定时器节点结构定义:
与方法实施例相对应,本申请实施例提供的一种软件定时器实现系统的结构示意图如图4所示,可以包括:
预定义模块401,用于预定义循环计时器;
初始化模块402,用于依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;
第一定时器增加模块403,用于当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;如果否,则获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
本申请实施例提供的另一种软件定时器实现系统的结构示意图如图5所示,其中,所述计数器的初始值大于所述商值,所述系统还可以包括:
第一扫描模块501,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
计数器初始值=目标计数值+商值+1。
本申请实施例提供的又一种软件定时器实现系统的结构示意图如图6所示,其中,所述计数器的初始值为所述商值,所述系统还可以包括:
第二扫描模块601,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
本申请实施例提供的又一种软件定时器实现系统的结构示意图如图7a及图7b所示,还可以包括:
第二定时器增加模块701,用于当有定时器达到定时时长时,判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种软件定时器的实现方法,其特征在于,包括:
预定义循环计时器;
依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;
当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;
如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;
如果否,获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
2.根据权利要求1所述的方法,其特征在于,当所述计数器的初始值大于所述商值时,还包括:扫描当前计时时刻下的定时器队列,
当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
计数器初始值=目标计数值+商值+1。
3.根据权利要求1所述的方法,其特征在于,当所述计数器的初始值等于所述商值时,还包括:扫描当前计时时刻下的定时器队列,
当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
4.根据权利要求2或3所述的方法,其特征在于,当判断出有定时器达到定时时长时,还包括:
判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
5.根据权利要求4所述的方法,其特征在于,还包括:
如果所述达到定时时长的定时器不是循环定时器,则将所述达到定时时长的定时器释放并进行缓存。
6.根据权利要求2或3所述的方法,其特征在于,对当前计时时刻下的定时器队列进行扫描后,还包括:
判断是否到达下一计时时刻,如果是,则扫描下一计时时刻下挂载的定时器队列;否则,等待下一计时时刻到达时,再扫描下一计时时刻下挂载的定时器队列。
7.根据权利要求1所述的方法,其特征在于,所述循环计时器的计时时长依据定时器的定时时长确定。
8.一种软件定时器实现系统,其特征在于,包括:
预定义模块,用于预定义循环计时器;
初始化模块,用于依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;
第一定时器增加模块,用于当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;如果否,则获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
9.根据权利要求8所述的系统,其特征在于,当所述计数器的初始值大于所述商值时,所述系统还包括:
第一扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
计数器初始值=目标计数值+商值+1。
10.根据权利要求8所述的系统,其特征在于,当所述计数器的初始值等于所述商值时,所述系统还包括:
第二扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310439031.2A CN103473071B (zh) | 2013-09-24 | 2013-09-24 | 软件定时器的实现方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310439031.2A CN103473071B (zh) | 2013-09-24 | 2013-09-24 | 软件定时器的实现方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103473071A true CN103473071A (zh) | 2013-12-25 |
CN103473071B CN103473071B (zh) | 2016-05-11 |
Family
ID=49797943
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310439031.2A Active CN103473071B (zh) | 2013-09-24 | 2013-09-24 | 软件定时器的实现方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103473071B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106201692A (zh) * | 2016-07-11 | 2016-12-07 | 浪潮(北京)电子信息产业有限公司 | 一种定时任务处理系统及方法 |
CN107220030A (zh) * | 2017-05-31 | 2017-09-29 | 北京北信源软件股份有限公司 | 延时任务执行方法及装置 |
CN110262883A (zh) * | 2019-06-19 | 2019-09-20 | 深圳市道通科技股份有限公司 | 基于定时器的任务处理方法、装置及电子设备 |
CN111556087A (zh) * | 2020-03-06 | 2020-08-18 | 远景智能国际私人投资有限公司 | 数据发送方法、装置、设备及可读存储介质 |
CN112463125A (zh) * | 2020-12-09 | 2021-03-09 | 百富计算机技术(深圳)有限公司 | 一种虚拟定时器的定时方法及设备 |
CN114430308A (zh) * | 2021-12-09 | 2022-05-03 | 西安昆仑工业(集团)有限责任公司 | 一种软件定时发送时间漂移导致时序偶发错位纠错方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1441570A (zh) * | 2002-02-28 | 2003-09-10 | 深圳市中兴通讯股份有限公司上海第二研究所 | 嵌入式实时操作系统中定时器的计时方法 |
US6714959B1 (en) * | 2000-06-23 | 2004-03-30 | Unisys Corporation | System and method for optimizing insertions for timer queue operations |
CN101221512A (zh) * | 2007-01-12 | 2008-07-16 | 中兴通讯股份有限公司 | 用于实时操作系统的定时方法和系统 |
CN101272564A (zh) * | 2008-04-17 | 2008-09-24 | 中兴通讯股份有限公司 | 一种软实时定时器调度的方法及软实时定时器模块 |
-
2013
- 2013-09-24 CN CN201310439031.2A patent/CN103473071B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6714959B1 (en) * | 2000-06-23 | 2004-03-30 | Unisys Corporation | System and method for optimizing insertions for timer queue operations |
CN1441570A (zh) * | 2002-02-28 | 2003-09-10 | 深圳市中兴通讯股份有限公司上海第二研究所 | 嵌入式实时操作系统中定时器的计时方法 |
CN101221512A (zh) * | 2007-01-12 | 2008-07-16 | 中兴通讯股份有限公司 | 用于实时操作系统的定时方法和系统 |
CN101272564A (zh) * | 2008-04-17 | 2008-09-24 | 中兴通讯股份有限公司 | 一种软实时定时器调度的方法及软实时定时器模块 |
Non-Patent Citations (1)
Title |
---|
丁文耀: "数据通信系统中的定时器的设计", 《计算机应用》, 28 February 2003 (2003-02-28), pages 234 - 235 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106201692A (zh) * | 2016-07-11 | 2016-12-07 | 浪潮(北京)电子信息产业有限公司 | 一种定时任务处理系统及方法 |
CN107220030A (zh) * | 2017-05-31 | 2017-09-29 | 北京北信源软件股份有限公司 | 延时任务执行方法及装置 |
CN110262883A (zh) * | 2019-06-19 | 2019-09-20 | 深圳市道通科技股份有限公司 | 基于定时器的任务处理方法、装置及电子设备 |
WO2020253776A1 (zh) * | 2019-06-19 | 2020-12-24 | 深圳市道通科技股份有限公司 | 基于定时器的任务处理方法、装置及电子设备 |
CN111556087A (zh) * | 2020-03-06 | 2020-08-18 | 远景智能国际私人投资有限公司 | 数据发送方法、装置、设备及可读存储介质 |
CN111556087B (zh) * | 2020-03-06 | 2023-02-28 | 远景智能国际私人投资有限公司 | 数据发送方法、装置、设备及可读存储介质 |
CN112463125A (zh) * | 2020-12-09 | 2021-03-09 | 百富计算机技术(深圳)有限公司 | 一种虚拟定时器的定时方法及设备 |
CN112463125B (zh) * | 2020-12-09 | 2023-09-15 | 百富计算机技术(深圳)有限公司 | 一种虚拟定时器的定时方法及设备 |
CN114430308A (zh) * | 2021-12-09 | 2022-05-03 | 西安昆仑工业(集团)有限责任公司 | 一种软件定时发送时间漂移导致时序偶发错位纠错方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103473071B (zh) | 2016-05-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103473071A (zh) | 软件定时器的实现方法和系统 | |
Tan et al. | Delay tails in MapReduce scheduling | |
CN108694109B (zh) | 同步硬件事件收集 | |
CN103561354B (zh) | 视频流畅度计算处理方法和装置 | |
US9886077B2 (en) | Processor management via thread status | |
US8402466B2 (en) | Practical contention-free distributed weighted fair-share scheduler | |
CN105024942B (zh) | 一种动态流量监控方法 | |
Rizk et al. | Computable bounds in fork-join queueing systems | |
CN111163018B (zh) | 网络设备及其降低传输时延的方法 | |
CN103312566B (zh) | 检测报文端口拥塞的方法及装置 | |
CN103235835A (zh) | 用于数据库集群的查询实现方法和装置 | |
CN103678199A (zh) | 一种传输数据的方法和设备 | |
CN105630712B (zh) | 计数器及计数方法 | |
CN104331331A (zh) | 任务数目和性能感知的可重构多核处理器的资源分配方法 | |
Jajoo et al. | Your coflow has many flows: Sampling them for fun and speed | |
Hu et al. | Job scheduling without prior information in big data processing systems | |
CN106162247A (zh) | 基于时间轮盘和页面心跳的活跃用户集维护方法及系统 | |
CN103164321A (zh) | 中央处理器占用率测量方法及装置 | |
Sigman | Exact simulation of the stationary distribution of the FIFO M/G/c queue: the general case for ρ< c | |
CN108021439B (zh) | 一种任务轮询方法、任务排布方法和相关装置 | |
CN102368729A (zh) | 一种在非实时系统上精确网络限速的方法 | |
CN103778005A (zh) | 自动化任务分配方法和装置 | |
CN107704373B (zh) | 一种数据处理方法及装置 | |
CN110147254A (zh) | 一种数据缓存处理方法、装置、设备及可读存储介质 | |
Niu et al. | Not all joules are equal: Towards energy-efficient and green-aware data processing frameworks |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |