专利名称:软件定时器的定时及控制方法
技术领域:
本发明涉及一种计算机领域及通信领域中软件定时器的定时及控制方法,具体地说,涉及一种实时多任务操作系统中的进行定时器定时及控制的方法。
背景技术:
软件的定时器是用于控制软件等待某事件发生的时间间隔的,例如,当打电话摘机时,程控交换机检测到该动作后,送拨号音到电话机并在软件上设置了10秒的定时,等待拨入第一个按键。如果在该10秒内拨入号码,所述程控交换机的软件就会取消10秒的定时,停送拨号音,而等待后续的拨入按键;如果超过10秒没有拨入第一个按键,所述程控交换机的软件定时到,会立刻送忙音到该电话机。
在通信领域的产品中,如大型程控交换机,设置和取消定时的操作是非常频繁的,其一次业务的呼叫从摘机到通话后挂机释放,至少需要5次定时器的设置。当同时处理的业务呼叫多达上万个时,则需要大规模(比如40000个)的定时器;因此如果对定时器的控制方法效率较差,就会因定时器个数太多而造成定时处理耗用系统CPU资源过大,影响定时精度,降低呼叫业务处理的及时性,从而成为影响整体系统性能的瓶颈。因此对定时器的控制方法是影响通信系统性能很重要的一个环节。
定时器的时钟源来源于硬件时钟中断,时钟中断每隔一定时间产生,该时间间隔为最小计时时长,也就是定时器的计时精度,每个对硬件时钟中断处理称为机器的定时周期。
目前对定时器的定时及控制的方法有两种。
一种方法称为简单定时法或单队列定时法,即对所有的定时器采用一个队列进行控制。在设置定时时,根据设定的时间长度,按照从小到大的原则,插入到队列中对应位置。当每个定时周期到达时,先将该队列的头定时器的计时数减1,然后判断结果是否为0,如果为0,则表示定时时间已到并进行到时处理,否则继续等待下一定时周期。
另一种是多队列定时法。系统机器定时周期为100毫秒,首先根据系统定时应用特点,将定时队列划分成40个不同时长的队列毫秒级、1秒、2秒......10秒,20秒.......100秒,200秒......1000秒,2000秒......10000秒,大于10000秒等等,目的在于每次新设置定时时,减少遍历队列定时器的个数,甚至当时长是秒级又不大于10000秒时,不需遍历整个定时器队列,可以直接插入队列末尾,机器定时周期到时,从10000秒队列开始计数,完成后逐一计以下位,直至计满毫秒位。如某定时器的定时时长为2003.9秒,则它的毫秒位是9,秒位是3,十秒位是0,百秒位为0,千秒位是2。比如利用该第二种定时器的定时方法,首先把该定时器放在2000秒队列末尾定时,每次机器定时周期到时,减100毫秒,20000次后,2000秒减到0,之后因百秒位和十秒位是0,跳过,直接放在3秒队列末尾定时,经过30个机器定时周期,3秒减到0时,最后再遍历毫秒级队列,从小到大的原则,插入到队列中对应位置,经过9个机器定时周期,定时完毕。如果定时时长超过10000秒,则遍历大于10000秒(39号)队列从小到大的原则,插入到队列中的对应位置。
综上所述,现有技术的该简单定时法固然方法简单,实现容易,但效率低,该方法每新设置一定时器,都需要从队列头开始搜索,在大型程控交换机中,业务繁忙时,定时器队列过长,这种搜索就耗费了大部分的CPU资源,影响到了正常的业务功能。
而所述多队列定时法相对于该简单定时法更高效,但该方法却存在很多冗余操作,每次机器定时周期到时,都需要对队列进行判断,如空负载时要做每秒400次检查;而且在毫秒级队列和大于万秒级队列处理中存在耗费计算资源的遍历排序操作。
发明内容
本发明的目的在于提供一种新的定时器的定时及控制方法,采用多队列定时法,通过设置一最大定时器数数组的空闲队列,以及各队列设置有指向当前子队列的一循环指针,每次各队列只处理所述循环指针指向的子队列下的定时器,解决单队列定时法和多队列定时法中存在的耗时排序操作,和多队列定时法中存在的冗余检查操作的缺点,大大提高了定时效率,而且具有伸缩性,可适应不同规模的系统中。
本发明的技术方案如下一种软件定时器的定时及控制方法,采用多队列定时法,包括以下步骤a)定义所需最大定时器数的定时器描述数组,作为用于存放空闲定时器的空闲队列;b)根据定时器时长类型的字节长度L定义定时子队列的数目N=L×32,并把这N个子队列划分成M个队列,M为2的阶乘,即2、4、8...等,M不大于N,每个队列下包含子队列数目为N/M,各队列还设置有一指向当前子队列的循环指针,每次各队列只处理循环指针指向的子队列下的定时器,并且循环指针重新指向队列的子队列号0时,才继续处理后一队列,否则立刻返回;c)对定义的定时队列和子队列初始化,当前子队列的循环指针赋值为0;d)当上层应用程序需要设置新定时器时,设定新的定时器;e)在机器的定时周期到时,所述队列0的定时周期为T,该队列0中的循环指针指向下一子队列,并判断该子队列是否为空,如果不为空,则对子队列下的所有定时器所属进程发送超时消息;当该循环指针重新指向子队列0时,队列进阶,对定时周期为T×(N/M)的队列1进行处理,同样对该队列1中的当前子队列进行判断,如果定时器的所述队列0的子队列号为0,则向定时器所属进程发送超时消息,否则根据定时器的所述队列0的子队列号放入队列0相应子队列的末尾;f)当上层应用程序不再需要定时器时,从所在定时队列中把对应定时器移走,放入空闲队列中。
所述的定时及控制方法,其中,所述步骤d)的设定新定时器还包括以下步骤d1)从所述空闲队列中取出新定时器;d2)根据定时的时长,以及各队列定时周期,定位出该定时器要放入的最大队列号Q。
d3)再根据队列Q的定时周期,修正定时的时长,减去队列Q的定时周期,再补上当前相对于队列Q的定时周期已走过的时间;d4)对于新的时长计算该定时在各队列中的子队列号;d5)把新定时器放入队列Q的计算出的子队列末尾。
所述的定时及控制方法,其特征在于,所述定时队列Q确定规则如下从定时周期最大的队列开始比较,定时的时长不小于队列的定时周期,如此定位出所述定时队列Q。
所述的方法,其特征在于,所述定时器被取消的步骤如下g1)先判断该定时器的使用标志,没有使用,则返回;g2)清除该定时器的使用标志;g3)根据所述定时器结构中的所述que字段和所述pointer字段定位该定时器所在的定时队列和子队列,由所述que字段指示定时器当前所在的定时队列,由所述pointer字段表示该定时器所在定时队列中的子队列;g4)把所述定时器从定位出的定时子队列中移出;g5)把该定时器放入空闲队列中。
所述的定时及控制方法,其中,所述每一队列中的子队列采用双向链表结构。
本发明的一种软件定时器的定时及控制方法,由于采用本发明所述的多队列定时法,首先设置空闲队列,以及在各队列设置有指向当前子队列的一循环指针,每次各队列只处理所述循环指针指向的子队列下的定时器,经过模拟测试,与现有技术相比,定时器在各种负载下的平均性能提高40倍以上,达到了高性能、高效率、高均衡性、实现简单性、可伸缩性的效果,节省了通信系统的定时管理所需的CPU资源。
下面结合附图,对本发明的具体实施作进一步的详细描述。
附图中,图1是本发明方法的定时子队列的示意图;图2是本发明方法的定时队列的示意图;图3是本发明方法设置定时的流程图;图4是本发明方法的定时队列控制方法的流程图。
具体实施例方式
本发明所述的软件定时器的定时及控制方法,其定时器定时方法是多队列定时法,具体包括以下步骤第一步定义所需最大定时器数的定时器描述数组,用于存放空闲定时器;第二步根据所述定时器的时长类型字节长度L定义定时子队列的数目N=L×32,把这N个子队列划分成M个队列,M为2的阶乘,即2、4、8...等,M不大于N,每个队列下包含子队列数目为N/M(符号“/”表示除法运算),各队列设置有指向当前子队列的一循环指针。每次各队列只处理所述循环指针指向的子队列下的定时器,并且该循环指针重新指向队列的子队列号0时,才继续处理后一队列,否则立刻返回。因此,该M个定时队列有M个不同的定时周期,假定机器定时周期为T,则M个定时队列的定时周期分别为T,T×(N/M),T×(N/M)×(N/M),...,可以看出各队列定时周期的规律是后一队列是前一队列的N/M倍,即队列中的子队列数目;第三步对定义的所述定时队列和所述子队列进行初始化,对当前子队列的循环指针赋值为0;第四步当上层应用程序需要设置新定时器时,其设定流程如图3所示的,具体包括以下步骤(1)从空闲队列中取出新定时器,置use字段为1,该use字段表示该定时器是否空闲,值为0时该定时器空闲,值为1时该定时器正使用;(2)并且根据定时的时长,以及各队列定时周期,定位出该定时器要放入的最大队列号Q,所述定时队列Q确定规则如下从定时周期最大的队列开始比较,定时的时长不小于队列的定时周期,如此定位出所述定时队列Q;(3)再根据该队列Q的定时周期,修正定时的时长,减去该队列Q定时周期,再补上当前相对于该队列Q的定时周期已走过的时间;(4)根据新的时长计算该定时在各队列中的子队列号;(5)把新定时器放入Q队列的计算出的子队列末尾;第五步对定时队列进行控制,其控制方法的流程如图4所示,在机器定时周期到时,定时周期为T的队列(即队列0)中的循环指针指向下一子队列,并判断该子队列是否为空,如果不为空,则对该子队列下的所有定时器所属进程发送超时消息。当循环指针重新指向该子队列0时,队列进阶,对定时周期为T×(N/M)的队列(即队列1)进行处理。同样对队列1中的当前子队列进行判断,如果定时器的队列0的子队列号为0,则向定时器所属进程发送超时消息,否则根据定时器的队列0的子队列号放入队列0相应子队列的末尾。
第六步当上层应用程序不再需要该定时器时,从所在定时队列中把该定时器移走,放入空闲队列中。
本发明方法的所述定时器时长的类型为长整型,具体可以但不限于,长度为4,定义8个定时队列对设置的定时器进行控制,各队列下包括16个子队列和指向当前子队列的循环指针,总共的子队列数目为128个。各队列下的子队列数用16是为了在定时过程中避免乘法、除法和模的运算,可直接用移位和位与操作实现,加快处理速度。假定机器定时周期为T,则8个定时队列的定时周期分别为T,T×0x10,T×0x100,T×0x1000,T×0x10000,T×0x100000,T×0x1000000,T×0x10000000,0x表示后面所的数字为16进制。
以下是本发明方法的程序实现的具体示例宏定义定时队列和子队列数目如下#define MAX_TQUE_NUM (unsigned char)8/*队列数目*/#define MAX_SUBQUE_NUM(unsigned char)0x10/*子队列数目*/定义定时器结构<pre listing-type="program-listing"> typedef struct TagTMCB { unsigned use1;/*使用标志0空闲;1使用*/ unsigned arrived1;/*定时到标志0未到;1到*/ unsigned type6; /*定时器类型相对,绝对*/ BYTE TimerNo; /*定时器号*/ WORD16 pno; /*定时器所属进程号*/<!-- SIPO <DP n="7"> --><dp n="d7"/> WORD32 Count100ms;/*定时器时长*/ BYTE que; /*定时器所在队列*/ BYTE pointer[MAX_TQUE_NUM]; /*定时器入队列的子队列位置*/ WORD16 prev; /*前向指针*/ WORD16 next; /*后向指针*/ }TMCBStruc;</pre>定时器空闲队列结构typedef struct TagTMCBPool{long count; /*队列元素数目*/WORD16 head;/*队列头*/WORD16 tail;/*队列尾*/WORD16 ele[TMCB_NUM]; /*队列元素*/}TMCBPoolStruc;定时器控制子队列结构typedef struct TagTSubQue{WORD16 count; /*计数*/WORD16 head; /*子队列头*/WORD16 tail; /*子队列尾*/}TSubQue;
定时器控制队列结构typedef struct TagTQue{BYTE pointer;/*子队列循环指针*/TSubQue SubQue[MAX_SUBQUE_NUM];/*子队列*/}TQueStruc;定义定时器控制队列TQueStruc TQue[MAX_TQUE_NUM];共定义8个定时器控制队列,每个队列有不同的定时周期,队列中的子队列的控制采用双向链表,如图1所示,子队列结构中的头指向子队列第一个定时器,子队列结构中尾指针指向子队列的最后一个定时器,中间的部分通过定时器结构中的前向指针和后向指针链接。
每个定时队列有16子队列,采用环形链表结构,如图2所示,由所述循环指针指向某一子队列,如图中所示,所述循环指针等于2时,其指向的是子队列号为2的子队列,每次队列定时周期到时,只处理一个子队列,循环处理。
机器定时周期为T,下面举具体例说明如何实现本发明方法首先,对定时队列及其子队列初始化(1)各定时队列中的子队列循环指针赋值为0;(2)各子队列中的定时器个数赋值为0,头尾指针赋值为0xffff;其次,实现对新定时器设定假定在0xA4A3A2A1A0×T的时刻,用户设定时时长为0xB3B2B1B0×T定时,Ai、Bi表示任意值,两者无相关性,与下面的队列3对应,并且B3>0。
(1)从所述空闲队列中取出新定时器,置use字段为1;(2)根据定时的时长,以及各队列定时周期,定位出该定时器要放入的最大队列号Q;其定位规则如下从定时周期最大的队列开始比较,定时的时长不小于队列的定时周期,就定位出定时队列Q。如本实施例中定时的时长为0xB3B2B1B0×T,B3>0,因此可以得出0x10000×T>0xB3B2B1B0×T>=0x1000×T,定位出该定时器要放入的最大队列号Q=3;(3)再根据队列Q的定时周期0x1000×T,修正用户的定时时长,减去队列3定时周期,再补上当前0xA4A3A2A1A0×T相对于队列3的定时周期已走过的时间0xA2A1A0×T,最后时长为0x(B3-1)(B2+A2)(B1+A1)(B0+A0)×T,考虑到简化和进位,记为0xC3C2C1C0×T;(4)对于新的时长计算该定时在各队列中的子队列位置。设当前定时队列3,2,1,0的子队列循环指针分别为P3,P2,P1,P0,根据对队列定时周期的规定,对队列3操作时,P2,P1,P0肯定为全0,因此计算出为各队列中的子队列位置分别为(C3+P3+1)&0x0f(符号&表示位与运算,记为C3),C2,C1,C0,保存在定时器结构的pointer字段中相应位置;(5)定时器结构中的字段que,该字段可以为一字节,表示当前定时器所在的定时队列,如本实施例中赋值为3,新定时器放入所述队列3计算出的子队列C3的末尾;再其次,对所述定时队列进行控制的实现(1)所述队列3的定时周期到,其循环指针指向下一个,即(P3+1)&0x0f,当循环指针指向子队列C3时,上面的定时器出所述队列3,搜索定时器结构的指针pointer字段保存的余下队列的子队列值不为0,如果C2不为0则入队列2中的子队列C2末尾,如果C1不为0则入队列1中的子队列C1末尾,如果C0不为0则入队列0中的子队列C0末尾,同时修改定时器结构中的字段que,如果全为0,则对定时器所属进程发送超时消息;
(2)队列2、队列1和队列0的定时周期到时,执行与队列3类似的操作;最后,对定时器取消的实现如下(1)首先判断该定时器的使用标志,没有使用,则返回;(2)清除该定时器的使用标志;(3)根据定时器结构中的que字段和pointer字段定位该定时器所在的定时队列和子队列,由所述que字段指示定时器当前所在的定时队列,由所述pointer字段表示该定时器所在定时队列中的子队列;(4)把所述定时器从定位出的定时子队列中移出;(5)把该定时器放入空闲队列中;综上所述,本发明的一种软件定时器的定时及控制方法,采用多队列定时,实现简单,效率高,没有乘法除法运算,定时器入队列不需排序操作,对定时队列没有冗余操作,节省了CPU的资源。如100秒时间内,现有的多队列定时法需要执行40000次的队列检查,而本发明只需要1065次检查。
应当理解的是,上述对本发明的较佳实施例的描述中,具体数值和程序代码仅为示例说明,并不能因此限定本发明方法的专利保护范围,其请求保护范围应以本发明所附权利要求为准。
权利要求
1.一种软件定时器的定时及控制方法,采用多队列定时法,包括以下步骤a)定义所需最大定时器数的定时器描述数组,作为用于存放空闲定时器的空闲队列;b)根据定时器时长类型的字节长度L定义定时子队列的数目N=L×32,并把这N个子队列划分成M个队列,M为2的阶乘,即2、4、8...等,M不大于N,每个队列下包含子队列数目为N/M,各队列还设置有一指向当前子队列的循环指针,每次各队列只处理循环指针指向的子队列下的定时器,并且循环指针重新指向队列的子队列号0时,才继续处理后一队列,否则立刻返回;c)对定义的定时队列和子队列初始化,当前子队列的循环指针赋值为0;d)当上层应用程序需要设置新定时器时,设定新的定时器;e)在机器的定时周期到时,所述队列0的定时周期为T,该队列0中的循环指针指向下一子队列,并判断该子队列是否为空,如果不为空,则对子队列下的所有定时器所属进程发送超时消息;当该循环指针重新指向子队列0时,队列进阶,对定时周期为T×(N/M)的队列1进行处理,同样对该队列1中的当前子队列进行判断,如果定时器的所述队列0的子队列号为0,则向定时器所属进程发送超时消息,否则根据定时器的所述队列0的子队列号放入队列0相应子队列的末尾;f)当上层应用程序不再需要定时器时,从所在定时队列中把对应定时器移走,放入空闲队列中。
2.根据权利要求1所述的定时及控制方法,其特征在于,所述步骤d)的设定新定时器还包括以下步骤d1)从所述空闲队列中取出新定时器;d2)根据定时的时长,以及各队列定时周期,定位出该定时器要放入的最大队列号Q;d3)再根据队列Q的定时周期,修正定时的时长,减去队列Q的定时周期,再补上当前相对于队列Q的定时周期已走过的时间;d4)对于新的时长计算该定时在各队列中的子队列号;d5)把新定时器放入队列Q的计算出的子队列末尾。
3.根据权利要求2所述的定时及控制方法,其特征在于,所述步骤d2)中对所述定时队列Q确定规则如下从定时周期最大的队列开始比较,定时的时长不小于队列的定时周期,如此定位出所述定时队列Q。
4.根据权利要求1或2或3所述的方法,其特征在于,所述定时器被取消的步骤如下g1)先判断该定时器的使用标志,没有使用,则返回;g2)清除该定时器的使用标志;g3)根据所述定时器结构中的所述que字段和所述pointer字段定位该定时器所在的定时队列和子队列,由所述que字段指示定时器当前所在的定时队列,由所述pointer字段表示该定时器所在定时队列中的子队列;g4)把所述定时器从定位出的定时子队列中移出;g5)把该定时器放入空闲队列中。
5.根据权利要求4所述的定时及控制方法,其特征在于,所述每一队列中的子队列采用双向链表结构。
全文摘要
本发明的一种软件定时器的定时及控制方法,其涉及一种计算机和通信领域的定时器定时及控制方法,该方法采用多队列定时法,采用定义所需最大定时器数的定时器描述数组,作为用于存放空闲定时器的空闲队列,以及,各队列还设置有一指向当前子队列的循环指针,每次各队列只处理循环指针指向的子队列下的定时器,并且循环指针重新指向队列的子队列号0时,才继续处理后一队列。本发明方法中的定时器在各种负载下的平均性能提高40倍以上,达到了高性能、高效率、高均衡性、实现简单性、可伸缩性的效果,节省了通信系统的定时管理所需的CPU资源。
文档编号H04Q3/64GK1556654SQ20031011766
公开日2004年12月22日 申请日期2003年12月31日 优先权日2003年12月31日
发明者王新余, 董伟杰 申请人:中兴通讯股份有限公司