一种循环软件定时器实现方法与流程

文档序号:17948747发布日期:2019-06-18 23:52阅读:315来源:国知局
一种循环软件定时器实现方法与流程

本发明涉及定时器技术领域,特别涉及一种循环软件定时器实现方法。



背景技术:

在网络设备中,例如路由器、数据中心、基站以及核心网等,都会用到大规模定时器,当这些大规模定时器采用硬件定时,由于硬件中断会引起任务切换开销,在linux下一个中断开销有几十微妙,是会严重降低其性能,因此,在大规模定时器上一般采用软件定时器。

现有技术中采用的软件定时器通常采用简单定时法或单队列定时法,也就是对所有的定时器均采用一个队列进行控制。根据设定的时间长度,按照从小到大的原则插入到队列中对应位置,当每个定时周期到达时,先将该队列头的定时器减1,然后判断结果是否为0,如果为0,则表示定时的时间到了,如果不为0,则继续等待下一个定时周期。

对于现有技术中的软件定时器的实现方法,提出了两种高性能循环软件定时器的实现方法。

一种是采用两个队列长度均为n的循环队列,定时周期为t,队列a放定时时长小于n*t的定时器,队列b放定时时长大于n*t的定时器。如此,每个定时周期到达时,只查两个队列同一位置p下的定时器,对队列a中位置p下的定时器直接触发定时,对队列b中位置p下的每个定时器减1,并和0进行比较,等于0的则触发定时。

另一种是采用多队列定时,通常根据定时等级划分队列,例如,队列1到队列n有的是分成:毫秒级、1秒级、10秒级、100秒级、1000秒级,而有的是以最小定时周期t为单位,将队列1到队列n分成:t、t*(n/m)、t*(n/m)*(n/m)、t*(n/m)*(n/m)*(n/m)……这样,每个定时器从其所属最大的队列随着时间的消耗依次向小一级队列转移。

上述的实现方法,第一种方法虽然具有较高的性能,但是,只有长的队列才会体现较高的性能,而且,当队列b中的定时器太多时容易导致性能下降。而第二种实现方法中多队列定时器会导致定时器堆积和计算量大。

针对上述技术问题,提出了对高性能循环软件定时器的实现方法新的要求,不仅能够实现高性能的大规模定时,又能够适应小的内存空间,降低中央处理器的消耗。



技术实现要素:

本发明的一个目的是提供一种循环软件定时器实现方法,该循环软件定时器实现方法占用的内存空间小,并且大大减少查询时间和计算量,有效降低中央处理器的消耗。

本发明提供了一种循环软件定时器实现方法,所述方法包括:

s1、确定定时颗粒和循环长度;

s2、根据所述循环长度和定时器的定时构造分多层存放的定时器,每个所述定时器存放在对应层的对应位置;

s3、根据所述循环长度确定每一层均具有n个放置定时器的位置,位于同一竖列位置且具有定时器的各个位置均链接到第一层的对应竖列位置;

s4、由所述第一层的始端开始查询所述第一层的各位置是否具有定时器,若查询到所述第一层的当前位置有定时器,或与当前位置位于同一竖列的其他各层位置上具有定时器,则将位于该同一竖列上的所有位置的层间距均减1,所述层间距指的是所述第一层之上各层与所述第一层间隔的层数;

s5、查询位于所述第一层的当前位置的下一位置,至查询到所述第一层的末端位置后,执行步骤s4。

可选地,步骤s2中,每个所述定时器存放在对应层的对应位置根据如下方法确定:

当定时器的定时t0<n时,将该定时器放在第一层;当定时器的定时xn≤t0<(x+1)n时,将该定时器放在第x+1层,其中,t0为定时器的定时,n为循环长度,x>0且x为整数。

可选地,根据如下公式确定分层的定时器的位置:

t0=yn+q0

其中,t0为定时器的定时,y为该定时器对应的层数,q0为该定时器对应的位置,n为循环长度。

可选地,步骤s4中,若查询到所述第一层的当前位置有定时器,触发当前位置内的所有定时器。

可选地,位于同一竖列且具有定时器的各个位置之间相互链接。

可选地,位于同一竖列位置且具有定时器的各个位置之间、具有定时器的位置与同一竖列上的所述第一层对应的位置均通过级联指针链链接

可选地,同一位置内存放的多个定时器通过数组、或指针链链接。

可选地,当查询到所述第一层的当前位置,需加入新的定时器时,根据当前位置和所述新的定时器的定时确定所述新的定时器的位置:

t1+p=zn+q1

当q1≥p时,所述新的定时器放在z+1层;当q1<p时,所述新的定时器放在z层;

其中,t1为新的定时器的定时,z为该新的定时器对应的层数,q1为该新的定时器对应的位置,n为循环长度。

可选地,所述新的定时器的位置与所在同一竖列的定时器的位置相互链接,所述新的定时器的位置链接到所述第一层的同一竖列的位置。

由上述可知,本发明提供了一种循环软件定时器实现方法,该方法为基于层间距的高性能循环软件定时器实现方法。在该方法中,根据确定的循环长度和各个定时器的定时构造处分多层存放的定时器,这样,将定时器存放在对应层的对应位置,每一层均具有相同个数的存放定时器的位置,并且,位于同一竖列位置且具有定时器的各个位置均链接到第一层的对应竖列位置上。在进行循环查询时,由第一层的始端开始查询第一层的各位置是否具有定时器,若查询到第一层的当前位置有定时器,且与当前位置位于同一竖列位置上具有定时器,则将位于该同一竖列上的所有位置的层间距均减1,层间距指的是第一层之上各层与该第一层间隔的层数。查询只在第一层进行查询,当查询到第一层的末端位置后,将返回至第一层的始端重新开始进行查询。通过该方法,每次查询到第一层的某个位置处具有定时器后,将层间距减1,从而使得位于同一竖的具有定时器的位置逐层下落,这样,便可只查询第一层,而不需要在各层进行查询,也无需将所有定时器都查询一遍。与现有技术相比,可大大减少查询时间,降低计算量,有效降低中央处理器cpu的损耗,并且,采用该方法,相比现有技术中的方法,在相同的cpu上,当大规模定时消耗同样的资源时,可实现高达十倍精度的定时。

附图说明

图1为本发明的具体实施例中方法流程图;

图2为本发明的具体实施例中在第一层始端位置的分层定时器分布图;

图3为对应图2中定时器的链接及层间距的示意图;

图4为本发明的具体实施例中在第一层第七位置的分层定时器分布图;

图5为本发明的具体实施例中在第一层第九位置的分层定时器分布图;

图6为本发明的具体实施例中在第一层第九位置时新增定时器后的分层定时器分布图。

具体实施方式

为了对本发明要求保护的技术方案的技术特征、目的和效果有更加清楚的理解,现对照附图说明本发明的具体实施方式,在各图中相同的标号表示相同的部分。

为了使图面简洁,各图中只示意性地表示出了与本发明相关部分,而并不代表作为产品的实际结构。另外,以使图面简洁便于理解,在有些图中具有相同结构或功能的部件,仅示意性地绘示出了其中的一个,或仅标示出了其中的一个。

针对现有技术中,高性能循环软件定时器的实现方法存在运行过程中性能低,定时器存在堆积,计算量大的问题。本发明构造了一种分层存放的循环定时器,这样,基于此提供了一种循环软件定时器实现方法,在进行查询过程中,仅对第一层,也就是最底层的定时器进行查询,无需对其他层的定时器进行查询,从而有效降低了循环软件定时器实现方法占用的内存空间,并且大大减少查询时间和计算量,有效降低中央处理器的消耗。

下面对本发明提供的一种循环软件定时器实现方法进行详细阐述。

结合附图1所示,该循环软件定时器实现方法包括如下步骤:

步骤s1、确定定时颗粒t和循环长度n。

在具体实施方式中,采用本方案提供的循环软件定时器实现方法时,根据定时精度确定出定时颗粒t,根据定时总量确定上述循环长度n。然后执行步骤s2。

步骤s2、根据循环长度n和定时器的定时t构造分多层存放的定时器,每个定时器存放在对应层的对应位置。

在此步骤中,根据定时器的定时确定该定时器的位置,从而将多个定时器放在对应的循环位置处。

步骤s3、根据循环长度n确定每一层均具有n个放置定时器的位置,也就是说,循环长度n决定了在该循环长度n范围内存放定时器的位置的数量,并且,位于同一竖列位置且具有定时器的各个位置均链接到第一层的对应竖列位置。

步骤s4、由第一层的始端位置开始查询该第一层的各位置是否具有定时器,若查询到第一层的当前位置有定时器,或与当前位置位于同一竖列的其他各层位置上具有定时器,则将位于该同一竖列上的所有位置的层间距均减1。

其中,层间距指的是位于第一层上的各层与第一层之间的间隔的层数。这样,在第一层上进行查询,只要查询到与第一层当前位置位于同一竖列的位置上具有定时器,则将位于同一竖列上的所有位置的层间距均减1,从而使得当前位置的同一竖列向第一层方向下滑一个竖向位置,从而将竖列向的定时器逐层的下滑至第一层上。

步骤s5、查询位于第一层的当前位置的下一位置,至查询到第一层的末端位置后,再执行步骤s4。

通过该步骤s5,在第一层上的循环长度n内进行查询,当完成对第一层的查询后,再回到第一层的始端位置,重新进行查询。

结合上述方法的步骤可知,本方案提供的循环定时器实现方法具有三维队列,其中,第一维队列理解为横向循环队列,即第一层循环长度n的查询,第二维队列可以理解为竖向队列,即第一层上的每个位置均在一个竖向方向上,其他各层均有与第一层上的每个位置对应的且位于同一竖向的位置,此方向上的各个位置构成了第二维队列,第三维队列可理解为同一时刻触发的定时器队列,即位于同一位置内的定时器链或定时数组。

通过本方案提供的循环定时器实现方法,可以仅在第一层上进行查询,根据步骤s4中的方法,在当前位置查询到定时器后,经过第一层上具有定时器时,将位于该同一竖列上的所有位置的层间距减1,从而使得各层均下滑一层,逐渐使得具有定时器且靠近第一层的那一层的定时器下滑至第一层的对应竖向位置处,因此,在进行查询时,并不需要对所有层进行查询,也不需要对所有定时器进行查询一遍。如此设置,大大减少了查询时间和计算量。并且,与现有技术中的方法相比,在同样的中央处理器上,大规模定时消耗同样的资源时,本发明提供的方法是现有方法中十倍的定时精度。

对于步骤s2中,每个定时器存放在对应层的对应位置根据如下方法确定:

当定时器的定时t0<n时,将该定时器放在第一层;当定时器的定时xn≤t0<(x+1)n时,将该定时器放在第x+1层,其中,t0为定时器的定时,n为循环长度,x>0且x为整数。

结合具体实施例对构造分层的定时器的方法进行详细说明。可参见图2所示。

在具体实施例中,设定定时颗粒t为1ms,循环长度为16,循环定时器从左至右(第一层的始端位置至末端位置)开始计时,始端位置为时刻零,即始端位置为q0=0,末端位置q0=15。

具有如下定时器:t6、t30、t54、t62、t74。其中,t6的定时为6ms、t30的定时为30ms、t54的定时为54ms、t62的定时为62ms、t74的定时为74ms。根据上述方法可知,对于定时器t6而言,其定时6<16,则将定时器t6放在第一层;对于定时器t30而言,其定时16<30<2×16,则将定时器t30放在第二层;对于定时器t54而言,其定时3×16<54<4×16,则将定时器t54放在第四层;对于定时器t62而言,其定时3×16<62<4×16,则将定时器t62放在第四层;对于定时器t72而言,其定时4×16<72<5×16,则将定时器t72放在第五层。

进一步地,根据如下公式确定定时器在各自层的具体位置:

t0=(y-1)n+q0

其中,t0为定时器的定时,y为该定时器对应的层数,q0为该定时器对应的位置,n为循环长度。

根据上述公式确定在构造分层存放定时器时,各个定时器的位置。具体地,可参见图2所示,图2中示出的是在循环时刻为p=0ms时的定时器分布图,其中位置q=0,q=1,q=2……q=15表示定时器分布图的竖列位置。

对于定时器t6而言,定时器t6放在第一层,其第一层的具体位置根据公式6=(1-1)×16+6确定,对应的位置应为q0=6的位置处,如图3所示,其定时器t6位于第一层,因此其层间距l6为零;对于定时器t30而言,定时器t30放在第二层,根据公式30=(2-1)×16+14确定在第二层的q0=14位置处,如图3所示,定时器t30的层间距l30为2;对于定时器t54而言,将定时器t54放在第四层,根据公式54=(4-1)×16+6确定在第4层的q0=6位置处,其与定时器t6的位置同一竖列上,如图3所示,定时器t54的层间距l54为3;对于定时器t62而言,定时器t62放在第四层,根据公式62=(4-1)×16+14确定在第4层的q0=14位置处,其与定时器t30位于同一竖列位置处,如图3所示,定时器t62的层间距l62为3;对于定时器t72而言,定时器t72放在第五层,根据公式72=(5-1)×16+8确定在第5层的q0=8位置处,如图3所示,定时器t72的层间距l72为4。

根据上述公式位置:t0=(y-1)n+q0可同时计算分析出定时器所在层及具体的位置。

位于同一竖列位置且具有定时器的各个位置之间通过级联指针链链接,具有定时器的位置与同一竖列上的第一层对应的位置也通过级联指针链链接。

并且,同一位置内存放的多个定时器通过数组、或指针链链接。

下面结合附图2和附图4对本发明的方案进行说明。

如图2所示,存放循环定时器只需要一个十六个元素的数组,也就是说,循环定时器在第一层的十六个位置上循环,即循环长度为16,其定时精度为1ms,每1ms循环至下一个位置,16ms后回到位置0。

图2中的定时器t54链接在定时器t6下,两者在同一竖列位置上,定时器t62链接在定时器t30下,两者在同一竖列位置上,并与第一层的位置q0=14在同一竖列,定时器t72直接链接在第一层的第八个位置上。

当在零时刻时,处于第一层的q0=0位置上,即第一层的始端,按照定时颗粒t=1ms进行查询。这样,每1ms向后跳一个位置,在位置q0=6查询到定时器t6,这样,当由位置q0=6跳到位置q0=7时,与位置q0=6位于同一竖列的各层位置的层间距减1,从而将各层向下滑一层,参见图4所示,在该位置q0=6位于的同一竖列的定时器t54由第四层下滑至第三层。由于定时器t6位于第一层的位置q0=6上,因此,触发此位置内的定时器t6,若还有其他定时器也位于该位置,一并触发。

与位置q0=8位于同一竖列的第五层上具有定时器t72,因此,当由位置q0=8跳到位置q0=9时,各层位置的层间距减1,可参见图5所示出的此时的定时器位置。

当跳转至位置q0=9时,其与此位置位于同一竖列上的位置均没有定时器,则当继续跳转,跳转至下一位置时,与位置q0=9位于同一竖列上的各位置的层间距不发生改变。

若当前循环至第一侧的某一位置时,需要加入新的定时器,根据当前位置和新的定时器的定时确定新的定时器的位置,具体公式如下:

t1+p=zn+q1

当q1≥p时,所述新的定时器放在z+1层;当q1<p时,所述新的定时器放在z层;

其中,t1为新的定时器的定时,z为该新的定时器对应的层数,p为当前位置所处的循环时刻,q1为该定时器对应的位置,n为循环长度。

具体参见图6所示。若在当前位置q0=9时,此时的循环时刻是p=9ms,其中,第一层的当前位置并不代表循环时刻,图6示出的是在第一层循环长度内的第一次循环,此时位置的标号对应循环时刻,若查询到第一层末端位置,进行第二次循环查询时,同样在q0=9,其对应的循环时刻是p=25ms。

在具体实施例中,是第一次查询至位置q0=9时,加入新的定时器n14、n16、n31、n35。根据上述公式确定新的定时器的位置。

对于n14,定时为14ms,则满足公式14+9=1×16+7,且满足q1<p,则将定时器n14放在此时的第一层的位置q0=7内。

对于n16,定时为16ms,则满足公式16+9=1×16+9,且满足q1≥p,则将定时器n16放在此时的第二层的位置q0=9内。

对于n31,定时为31ms,则满足公式31+9=2×16+8,且满足q1<p,则将定时器n31放在此时的第二层的位置q0=8内。

对于n35,定时为35ms,则满足公式35+9=2×16+12,且满足q1≥p,则将定时器n35放在此时的第三层的位置q0=12内。

对于n48,定时为48ms,则满足公式48+9=3×16+9,且满足q1≥p,则将定时器n48放在此时的第四层的位置q0=9内。

上述新的定时器的位置与所在同一竖列的定时器的位置相互连接,新的定时器的位置链接到第一层的同一竖列位置上,其具体的链接与最初存放的定时器的链接方式一样。

当加入新的定时器后,不改变层间距,只需将新的定时器与所在的同一竖列上的位置进一步相链接。

在循环时刻加入上述新的定时器后,若由位置q0=9跳到位置q0=10时,由于在位置q0=9所在的同一竖列上,第二层和第四层加入了新的定时器,因此,将该层的层间距减1,从而使得该竖列的位置向下滑一个位置,而对于该竖列上的定时器之间的相对层间距不需查看,也不需改变,大大减少了处理时间。也就是说,在查看的过程中,只需处理竖向最下层的层间距,而不需处理具有定时器的两层之间的相对层间距。

当完成一个循环长度的查询后,即在循环时刻15ms时到达第一层的末端位置后,在循环时刻又跳到第一层的始端位置,进行第二次的循环查询,以此往复在第一层上进行查询,每次循环查询时,若在第一层上的位置具有定时器则触发该位置的所有定时器,并将该位置所在同一竖列的位置的层间距减1,而不查询处理其他层的位置上定时器,从而大大减少了处理时间,其计算量小,占用的内存空间小,有效降低了中央处理器的消耗。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1