海量定时器的调度方法

文档序号:7918383阅读:254来源:国知局
专利名称:海量定时器的调度方法
技术领域
本发明涉及定时器领域,具体来说是涉及一种海量定时器的调度方法。
一般来讲,定时器调度方法包含如下基本步骤用于定时器启动的插入步骤;用于定时器中止或超时的删除步骤;用于操作系统监视激活的定时器的扫描步骤。其中扫描步骤是由一个周期为T的操作系统提供的定时器进行驱动,在该定时器的驱动下,在每个扫描周期对等待超时的定时器进行一次检查,使到时的预先登记时长的定时器通过删除步骤进入挂起状态。定时器调度方法虽然只需使用一个或少数几个系统级的定时器,但是却可以对外提供多个定时器。
随着通讯系统的容量越来越大,速度越来越快,协议越来越复杂,客户对稳定性要求越来越高,对定时器调度的要求也越来越高。如在大话务量负载仿真测试工具开发过程中,该工具需要模拟巨大数量的用户极其频繁地发起长短不一的呼叫,呼叫中许多特殊状态的定时器精度要求非常高,经常需要精确到10ms,而有些状态(例如通话状态等)的时长要求非常长,可能要达到数小时或更长。由于该测试工具是通用测试工具,状态的属性可以由用户自由定制,每个状态的等待时长的可能范围非常大,几十毫秒到几个小时不等,需要对不同长度范围和精度的定时器做不同的处理。
而现有的定时器调度方法主要有下面几种1、轮询定时器调度方法,是一种常用于少量定时器调度的轮询方法,在每个扫描周期把所有的定时器检查一遍,看看是否有定时器超时,并且把每个定时器的剩余时间减一。很明显,如果当精度要求很高,扫描周期非常短时,这种方法便不能在一个扫描周期内检查太多的定时器。
2、差分定时器调度方法。在该方法中,定时器按照到时时刻排列成一个长链,每个定时器记录自身到时时刻与上一个定时器到时时刻的时间差(即差分方案),这种方法几乎没有扫描开销,在判断是否有定时器超时,只需判断链表头的第一个定时器即可。但是,如果要想插入一个新定时器,就必须遍历链表,这样,当处于激活状态的定时器数量非常大时,插入过程就会很慢。
3、分类定时器调度方法,这种方法采用定时器时长分类的方式,利用了差分定时器的优点,并且针对系统的特殊性克服差分定时器插入效率低的缺点。例如,在系统所用到的定时器长度只有少数几种的情况下,可以针对每个长度的定时器构造一个链表,由于每个链表只有一种定时时延,新登记的定时器插入该定时器所属定时器类的链表尾部,每个扫描周期扫描所有定时器链表的头即可,由于定时器时长的种类很少,这种定时器非常高效。但是这种定时器只能应付定时器时长的可能取值有限的情况,对于超时时长可能取值种类过多或者可变的系统是不适用的。
另外,在现有技术中还有一些系统按照定时器的精度对定时器进行分类,越高精度的定时器可定时的最大时长越短。例如提供毫秒、秒钟、分钟、小时的数种定时器,用户根据精度和长度的要求选取相应的类别。这种定时器方案也可以做得非常高效,但却存在使用相对比较麻烦,需要根据长度和精度确定类别的缺点。
以上将定时器分类的方法在许多通讯协议软件系统中得到应用,但是这些方法使用起来需要指定类别而不能任意直接指定时长,并且修改或者增删类别的维护工作比较烦琐并且容易出错。
4、时间缓冲区方法。该方法将到时时刻做成一个固定尺寸的环型区域,一个代表当前时刻的指针指向当前时刻对应的单元,该指针每过一个扫描周期便前进一个单元,并且将该单元里面的定时器启动。登记定时器的时候,直接登记到该定时器到时时刻所对应的位置上去。这种方案也是非常高效的通用方案,但缺点是定时的最大扫描周期数受环型区域尺寸的限制。如果要定时非常长的时间间隔,即使没有一个处于激活状态的定时器,也需要巨大的内存。
显然,上述现有的定时器调度方法都存在各自的缺点,而且由于皆动态地分配和释放内存,从而造成了内存碎片化。另外,虽然上述方法可以对不同长度范围和精度的定时器做不同的处理,但是会增大调度程序总的复杂性,增大应用程序使用定时任务的难度,降低系统的可靠性。
为实现上述目的,本发明的海量定时器的调度方法包含如下具体步骤用于定时器启动的插入步骤;用于定时器中止的删除步骤;用于操作系统监视激活的定时器超时的扫描步骤。其中所述的扫描步骤包含下列步骤a、在每个扫描周期判断定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;b、读取位于定时器队列头部的定时器;c、判断该定时器是否到时,如果否,退出本步骤,如果是,继续;d、将该定时器对象从定时器队列中清除并同时调整定时器队列顺序,然后回到步骤a。
所述的插入步骤包含先将到时时刻保存到定时器对象中,然后将该定时器对象插入容纳定时器对象的定时器队列中并同时调整队列顺序。
所述的删除步骤包含先判断该定时器是否被激活,如果未被激活则退出本步骤,否则清空该定时器,然后将该定时器对象从定时器队列中清除并同时调整定时器队列顺序。
另外,所述的定时器队列是指以堆数据结构构成的定时器队列或者是以前序完全二叉树结构构成的定时器队列。
本发明通过使用堆数据结构或前序完全二叉树结构对定时器队列进行组织,利用其中堆或者树的优良特性达到对海量定时器的高效调度,能够有效地降低系统的复杂度,提高系统的稳定性、可移植性和可维护性。具体来说具有下述优点1、能够高效扫描大量处于激活状态的定时器,执行超时的定时器任务;2、能够高效插入、删除定时器;3、可提供的定时时延范围足够大,应用程序不必对特殊长度的时延进行特殊处理;4、定时的精度足够高,满足精确定时的需要。
下面结合附图
和具体实施例来详细描述本发明。
由于堆数据结构具备一些优良的特性,这种数据结构可以在每次插入和删除元素操作的时候迅速地进行调整,保证操作之后数据仍然被组织为一个堆。只要数据被组织成为一个堆,就可以按照先后顺序将元素提取出来,并且提取操作也是非常迅速的。上述各个基本步骤的具体过程为如图2所示,所述的插入步骤包含先将到时时刻保存到定时器对象中,然后将该定时器对象插入容纳定时器对象的堆数据结构定时器队列中并同时调整堆数据结构。
如图3所示,所述的删除步骤包含先判断该定时器是否被激活,如果未被激活则退出本步骤,否则清空该定时器,然后将该定时器对象从堆数据结构定时器队列中清除并同时调整堆数据结构。
如图4所示,所述的扫描步骤包含下列步骤1、在每个扫描周期判断堆数据结构定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;2、读取位于堆数据结构定时器队列头部的定时器;3、比较该定时器的定时时长和系统的计时时长,如果二者不相等,退出本步骤,如果二者相等,继续;4、将该定时器对象从堆数据结构定时器队列中清除并同时调整堆数据结构,然后回到步骤1。
考虑到如果系统长时间运行,系统计时记数器可能会溢出,为了使系统在溢出的前后仍然能够正确工作,本实施例使用32位无符号整数记录时长和系统计时记数器,这时计时时长最大合法长度可以达到10ms×(232-1)约497天,且所述的步骤c判断定时器是否到时的比较中不使用大于或小于,而使用相等或不相等,只有在二者相等的时候才说明该定时器在队列中超时,其他情况,无论是大于还是小于,都说明该定时器没有在该队列中到时。这样就可以巧妙地避开系统计时记数器溢出后系统混乱的问题,无论系统计时记数器溢出多少次,系统都可以毫无问题地正常工作。
假设每一次扫描步骤的时间开销是O(1),通过本实施例所述的海量堆定时器的调度方法,每次插入步骤的时间开销是O(log(N)),每次删除步骤的时间开销是O(log(N))。其中N为处于激活状态的定时器数量。插入和删除定时器的时间开销都是因调整堆数据结构造成的。另外,由于实际系统的内存限制,log(N)是存在上限的,例如32位系统中,0<=log(N))<32。
表1是本实施例和现有的几种调度方法的性能比较,其中系统整数位数B定时器插入速度F(次/tick)定时器平均生存时长T(tick)系统激活状态的定时器个数N定时器内存占用M可直接定时时长数L(分类定时器的)定时器类别数C可以看出,现有的几种调度方法在某些方面比本实施例所述的方法更快,但是在比较极端的情况下都存在严重的缺陷,导致现有的几种调度方法在极端情况下很难使用。例如在PII300以上的机器上,每秒扫描100次,每秒插入1000个定时器,系统中有近1,000,000个定时器同时处于激活状态,这两项操作所占用的CPU时间不到1/1000。也就是说,虽然这两项比其他类型定时器的最佳值要低,但是根本不足以构成性能瓶颈。在基本内存占用方面,本实施例在没有激活的定时器的时候基本没有开销,所以完全可以应用在单板的嵌入式环境中。
表1

表2是在极端情况下本实施例和现有的几种调度方法的性能具体数据近似值的比较,系统整数位数为32,定时器插入速度为10次/扫描周期,定时器平均生存时长为100,000扫描周期,缓冲定时器方法的可直接定时时长数为1,000,000扫描周期,分分类定时器方法中定时器类别数为100个类别,这样,分类调度方案就只能对100种时长直接定时,远远少于其他类型定时器的可直接定时的时长数。
表2

权利要求
1.一种海量定时器的调度方法,其特征在于该方法包含如下步骤用于定时器启动的插入步骤;用于定时器中止的删除步骤;用于操作系统监视激活的定时器超时的扫描步骤;其中,所述的扫描步骤包含下列步骤a、在每个扫描周期判断定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;b、读取位于定时器队列头部的定时器;c、判断该定时器是否到时,如果否,退出本步骤,如果是,继续;d、将该定时器对象从定时器队列中清除并同时调整定时器队列顺序,然后回到步骤a。
2.如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述插入步骤包含先将到时时刻保存到定时器对象中;然后将该定时器对象插入容纳定时器对象的定时器队列中并同时调整队列顺序。
3.如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述删除步骤包含先判断该定时器是否被激活,如果未被激活则退出本步骤,否则清空该定时器;然后将该定时器对象从定时器队列中清除并同时调整定时器队列顺序。
4.如权利要求1、2或3所述的一种海量定时器的调度方法,其特征在于,所述的定时器队列是指以堆数据结构构成的定时器队列或者是以前序完全二叉树结构构成的定时器队列。
5.如权利要求1、2或3所述的一种海量定时器的调度方法,其特征在于,所述的定时器是用无符号整数表示的。
6.如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述步骤a中的计时是用无符号整数来计时的。
7.如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述步骤c实现过程为比较该定时器的定时时长和步骤a中的计时时长,如果二者不相等,退出本步骤,如果二者相等,继续。
全文摘要
本发明提供了一种海量定时器的调度方法,该方法包含用于定时器启动的插入步骤、用于定时器中止的删除步骤、用于操作系统监视激活的定时器超时的扫描步骤;其中所述的扫描步骤包含下列步骤a.在每个周期判断定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;b.读取位于定时器队列头部的定时器;c.判断该定时器是否到时,如果否,退出本步骤,如果是,继续;d.将该定时器对象从定时器队列中清除并同时调整定时器队列顺序,然后回到步骤a。本发明通过使用堆数据结构或前序完全二叉树结构对定时器队列进行组织,利用其优良特性对海量定时器的高效调度,能够有效地降低系统的复杂度,提高系统的稳定性、可移植性和可维护性。
文档编号H04B17/00GK1474241SQ0212875
公开日2004年2月11日 申请日期2002年8月7日 优先权日2002年8月7日
发明者孙伊, 孙 伊 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1