CN1332548C - 海量定时器的调度方法 - Google Patents
海量定时器的调度方法 Download PDFInfo
- Publication number
- CN1332548C CN1332548C CNB021287554A CN02128755A CN1332548C CN 1332548 C CN1332548 C CN 1332548C CN B021287554 A CNB021287554 A CN B021287554A CN 02128755 A CN02128755 A CN 02128755A CN 1332548 C CN1332548 C CN 1332548C
- Authority
- CN
- China
- Prior art keywords
- timer
- queue
- massive
- dispatching method
- timers
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Communication Control (AREA)
- Measurement Of Predetermined Time Intervals (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明提供了一种海量定时器的调度方法,该方法包含用于定时器启动的插入步骤、用于定时器中止的删除步骤、用于操作系统监视激活的定时器超时的扫描步骤;其中所述的扫描步骤包含下列步骤:a.在每个周期判断定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;b.读取位于定时器队列头部的定时器;c.判断该定时器是否到时,如果否,退出本步骤,如果是,继续;d.将该定时器对象从定时器队列中清除并同时调整定时器队列顺序,然后回到步骤a。本发明通过使用堆数据结构或前序完全二叉树结构对定时器队列进行组织,利用其优良特性对海量定时器的高效调度,能够有效地降低系统的复杂度,提高系统的稳定性、可移植性和可维护性。
Description
技术领域
本发明涉及定时器领域,具体来说是涉及一种海量定时器的调度方法。
背景技术
为了更好地理解现有技术中定时器的调度方法,首先介绍一些基本知识和概念,tick(滴答):是指定时器调度程序扫描定时器队列的周期,也就是定时器调度方法的时间单位,可定义为T。每一个定时器有两种状态:激活状态和挂起状态,激活状态就是定时器等待超时或者中止时的状态,当超时或者中止时该定时器可以通过删除动作进入挂起状态;挂起状态的定时器是不会超时的,当启动时可以通过插入动作使其进入激活状态。
一般来讲,定时器调度方法包含如下基本步骤:用于定时器启动的插入步骤;用于定时器中止或超时的删除步骤;用于操作系统监视激活的定时器的扫描步骤。其中扫描步骤是由一个周期为T的操作系统提供的定时器进行驱动,在该定时器的驱动下,在每个扫描周期对等待超时的定时器进行一次检查,使到时的预先登记时长的定时器通过删除步骤进入挂起状态。定时器调度方法虽然只需使用一个或少数几个系统级的定时器,但是却可以对外提供多个定时器。
随着通讯系统的容量越来越大,速度越来越快,协议越来越复杂,客户对稳定性要求越来越高,对定时器调度的要求也越来越高。如在大话务量负载仿真测试工具开发过程中,该工具需要模拟巨大数量的用户极其频繁地发起长短不一的呼叫,呼叫中许多特殊状态的定时器精度要求非常高,经常需要精确到10ms,而有些状态(例如通话状态等)的时长要求非常长,可能要达到数小时或更长。由于该测试工具是通用测试工具,状态的属性可以由用户自由定制,每个状态的等待时长的可能范围非常大,几十毫秒到几个小时不等,需要对不同长度范围和精度的定时器做不同的处理。
而现有的定时器调度方法主要有下面几种:
1、轮询定时器调度方法,是一种常用于少量定时器调度的轮询方法,在每个扫描周期把所有的定时器检查一遍,看看是否有定时器超时,并且把每个定时器的剩余时间减一。很明显,如果当精度要求很高,扫描周期非常短时,这种方法便不能在一个扫描周期内检查太多的定时器。
2、差分定时器调度方法。在该方法中,定时器按照到时时刻排列成一个长链,每个定时器记录自身到时时刻与上一个定时器到时时刻的时间差(即:差分方案),这种方法几乎没有扫描开销,在判断是否有定时器超时,只需判断链表头的第一个定时器即可。但是,如果要想插入一个新定时器,就必须遍历链表,这样,当处于激活状态的定时器数量非常大时,插入过程就会很慢。
3、分类定时器调度方法,这种方法采用定时器时长分类的方式,利用了差分定时器的优点,并且针对系统的特殊性克服差分定时器插入效率低的缺点。例如,在系统所用到的定时器长度只有少数几种的情况下,可以针对每个长度的定时器构造一个链表,由于每个链表只有一种定时时延,新登记的定时器插入该定时器所属定时器类的链表尾部,每个扫描周期扫描所有定时器链表的头即可,由于定时器时长的种类很少,这种定时器非常高效。但是这种定时器只能应付定时器时长的可能取值有限的情况,对于超时时长可能取值种类过多或者可变的系统是不适用的。
另外,在现有技术中还有一些系统按照定时器的精度对定时器进行分类,越高精度的定时器可定时的最大时长越短。例如提供毫秒、秒钟、分钟、小时的数种定时器,用户根据精度和长度的要求选取相应的类别。这种定时器方案也可以做得非常高效,但却存在使用相对比较麻烦,需要根据长度和精度确定类别的缺点。
以上将定时器分类的方法在许多通讯协议软件系统中得到应用,但是这些方法使用起来需要指定类别而不能任意直接指定时长,并且修改或者增删类别的维护工作比较烦琐并且容易出错。
4、时间缓冲区方法。该方法将到时时刻做成一个固定尺寸的环型区域,一个代表当前时刻的指针指向当前时刻对应的单元,该指针每过一个扫描周期便前进一个单元,并且将该单元里面的定时器启动。登记定时器的时候,直接登记到该定时器到时时刻所对应的位置上去。这种方案也是非常高效的通用方案,但缺点是定时的最大扫描周期数受环型区域尺寸的限制。如果要定时非常长的时间间隔,即使没有一个处于激活状态的定时器,也需要巨大的内存。
显然,上述现有的定时器调度方法都存在各自的缺点,而且由于皆动态地分配和释放内存,从而造成了内存碎片化。另外,虽然上述方法可以对不同长度范围和精度的定时器做不同的处理,但是会增大调度程序总的复杂性,增大应用程序使用定时任务的难度,降低系统的可靠性。
发明内容
针对上述情形,本发明提出了一种调度既通用又高效,能够统一处理不同长度和精度定时器的海量定时器的调度方法。
为实现上述目的,本发明的海量定时器的调度方法包含如下具体步骤:用于定时器启动的插入步骤;用于定时器中止的删除步骤;用于操作系统监视激活的定时器超时的扫描步骤。其中:
所述的扫描步骤包含下列步骤:
a、在每个扫描周期判断定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;
b、读取位于定时器队列头部的定时器;
c、判断该定时器是否到时,如果否,退出本步骤,如果是,继续;
d、将该定时器对象从定时器队列中清除并同时调整定时器队列顺序,然后回到步骤a。
所述的插入步骤包含:先将到时时刻保存到定时器对象中,然后将该定时器对象插入容纳定时器对象的定时器队列中并同时调整队列顺序。
所述的删除步骤包含:先判断该定时器是否被激活,如果未被激活则退出本步骤,否则清空该定时器,然后将该定时器对象从定时器队列中清除并同时调整定时器队列顺序。
另外,所述的定时器队列是指以堆数据结构构成的定时器队列或者是以前序完全二叉树结构构成的定时器队列。
本发明通过使用堆数据结构或前序完全二叉树结构对定时器队列进行组织,利用其中堆或者树的优良特性达到对海量定时器的高效调度,能够有效地降低系统的复杂度,提高系统的稳定性、可移植性和可维护性。具体来说具有下述优点:
1、能够高效扫描大量处于激活状态的定时器,执行超时的定时器任务;
2、能够高效插入、删除定时器;
3、可提供的定时时延范围足够大,应用程序不必对特殊长度的时延进行特殊处理;
4、定时的精度足够高,满足精确定时的需要。
下面结合附图和具体实施例来详细描述本发明。
附图说明
图1是本发明的系统框图;
图2是本发明所述的插入步骤的方法流程图;
图3是本发明所述的删除步骤的方法流程图;
图4是本发明所述的扫描步骤的方法流程图;
具体实现方式
在通信技术领域,大话务量负载仿真测试工具是通用测试工具,其需要模拟巨大数量的用户极其频繁地发起长短不一的呼叫,在许多极限情况下,呼叫速度可以达到每秒数百次。呼叫中许多特殊状态的定时器的状态属性用户也可以自由定制,如有些定时器精度要求非常高,有时需要精确到10ms,有些状态(例如通话状态等)的定时器的时长要求非常长,可能长达数小时或更长。当系统运行足够长时间后发起呼叫速度和结束呼叫速度达到动态平衡的时候,系统中正在等待超时的定时器数量会有数十万到数百万个,这样海量数目的定时器的调度使用本发明是这样完成的:
现假设本发明定时器调度方法中的时间单位为10ms。本发明的定时器调度方法包括如下基本步骤:插入步骤:用于定时器启动;删除步骤:用于定时器中止;扫描步骤:用于操作系统监视激活的定时器超时。另外,所有的定时器均放入以堆数据结构构成的定时器队列中。
由于堆数据结构具备一些优良的特性,这种数据结构可以在每次插入和删除元素操作的时候迅速地进行调整,保证操作之后数据仍然被组织为一个堆。只要数据被组织成为一个堆,就可以按照先后顺序将元素提取出来,并且提取操作也是非常迅速的。上述各个基本步骤的具体过程为:
如图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
一次扫描时间 | 一次插入时间 | 基本内存占用 | 可直接定时时长数 | |
轮询定时器方法 | O(F×T) | O(1) | O(1) | 2B |
差分定时器方法 | O(1) | O(F×T) | O(1) | 2B |
缓冲定时器方法 | O(1) | O(1) | O(L) | O(M) |
分类定时器方法 | O(C) | O(1) | O(C) | C |
本发明 | O(1) | <O(B) | O(1) | 2B |
表2是在极端情况下本实施例和现有的几种调度方法的性能具体数据近似值的比较,系统整数位数为32,定时器插入速度为10次/扫描周期,定时器平均生存时长为100,000扫描周期,缓冲定时器方法的可直接定时时长数为1,000,000扫描周期,分分类定时器方法中定时器类别数为100个类别,这样,分类调度方案就只能对100种时长直接定时,远远少于其他类型定时器的可直接定时的时长数。
表2
一次扫描时间 | 一次插入时间 | 基本内存占用 | 可直接定时时长数 | |
轮询定时器方法 | ~1000000 | ~1 | ~1 | ~232 |
差分定时器方法 | ~1 | ~1000000 | ~1 | ~232 |
缓冲定时器方法 | ~1 | ~1 | ~1000000 | ~1000000 |
分类定时器方法 | ~100 | ~1 | ~100 | ~100 |
本发明 | ~1 | <32 | ~1 | ~232 |
Claims (7)
1、一种海量定时器的调度方法,其特征在于:该方法包含如下步骤:用于定时器启动的插入步骤;用于定时器中止的删除步骤;用于操作系统监视激活的定时器超时的扫描步骤;其中,所述的扫描步骤包含下列步骤:
a、在每个扫描周期判断定时器队列中是否有激活的定时器,如果否,退出本步骤,如果是,继续;
b、读取位于定时器队列头部的定时器;
c、判断该定时器是否到时,如果否,退出本步骤,如果是,继续;
d、将该定时器对象从定时器队列中清除并同时调整定时器队列顺序,然后回到步骤a。
2、如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述插入步骤包含:先将到时时刻保存到定时器对象中;然后将该定时器对象插入容纳定时器对象的定时器队列中并同时调整队列顺序。
3、如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述删除步骤包含:先判断该定时器是否被激活,如果未被激活则退出本步骤,否则清空该定时器;然后将该定时器对象从定时器队列中清除并同时调整定时器队列顺序。
4、如权利要求1、2或3所述的一种海量定时器的调度方法,其特征在于,所述的定时器队列是指以堆数据结构构成的定时器队列或者是以前序完全二叉树结构构成的定时器队列。
5、如权利要求1、2或3所述的一种海量定时器的调度方法,其特征在于,所述的定时器是用无符号整数表示的。
6、如权利要求1所述的一种海量定时器的调度方法,其特征在于,所述步骤c实现过程为:比较该定时器的定时时长和系统的计时时长,如果二者不相等,退出本步骤,如果二者相等,继续。
7、如权利要求6所述的一种海量定时器的调度方法,其特征在于,所述计时时长是用无符号整数来记录的。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB021287554A CN1332548C (zh) | 2002-08-07 | 2002-08-07 | 海量定时器的调度方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB021287554A CN1332548C (zh) | 2002-08-07 | 2002-08-07 | 海量定时器的调度方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1474241A CN1474241A (zh) | 2004-02-11 |
CN1332548C true CN1332548C (zh) | 2007-08-15 |
Family
ID=34143810
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB021287554A Expired - Fee Related CN1332548C (zh) | 2002-08-07 | 2002-08-07 | 海量定时器的调度方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1332548C (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1798129B (zh) * | 2004-12-21 | 2012-10-17 | 华为技术有限公司 | 一种基于申请驱动的轮询排队方法和装置 |
CN100358295C (zh) * | 2005-07-06 | 2007-12-26 | 华为技术有限公司 | 一种定时器调度方法 |
CN101853047B (zh) * | 2010-05-18 | 2012-02-29 | 瑞斯康达科技发展股份有限公司 | 一种定时器实现方法及装置 |
CN102354257A (zh) * | 2011-07-13 | 2012-02-15 | 南京中兴软创科技股份有限公司 | 一种通讯平台的精确时钟管理方法 |
CN103684911B (zh) * | 2013-12-05 | 2017-05-03 | 北京奇虎科技有限公司 | 一种网站的在线用户统计方法和装置 |
CN105653367A (zh) * | 2015-12-24 | 2016-06-08 | 北京奇虎科技有限公司 | 遍历计时器的方法及装置 |
CN107273229B (zh) * | 2017-05-24 | 2020-06-26 | 百富计算机技术(深圳)有限公司 | 处理计时器计时异常的方法、装置及计算机可读存储介质 |
CN115525402A (zh) * | 2021-06-25 | 2022-12-27 | 中兴通讯股份有限公司 | 定时器任务的处理方法、软件定时器及存储介质 |
CN113742042B (zh) * | 2021-08-26 | 2023-08-25 | 苏州浪潮智能科技有限公司 | 一种定时器处理方法、装置、设备及可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1099923A (zh) * | 1993-03-03 | 1995-03-08 | 罗姆公司 | 队列管理系统和方法 |
JPH09288528A (ja) * | 1996-04-19 | 1997-11-04 | Matsushita Electric Ind Co Ltd | 情報処理システムにおけるタイマ管理装置及びタイマ管理方法 |
JPH09288588A (ja) * | 1996-04-22 | 1997-11-04 | Oki Electric Ind Co Ltd | タイマハンドラ管理システム |
-
2002
- 2002-08-07 CN CNB021287554A patent/CN1332548C/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1099923A (zh) * | 1993-03-03 | 1995-03-08 | 罗姆公司 | 队列管理系统和方法 |
JPH09288528A (ja) * | 1996-04-19 | 1997-11-04 | Matsushita Electric Ind Co Ltd | 情報処理システムにおけるタイマ管理装置及びタイマ管理方法 |
JPH09288588A (ja) * | 1996-04-22 | 1997-11-04 | Oki Electric Ind Co Ltd | タイマハンドラ管理システム |
Also Published As
Publication number | Publication date |
---|---|
CN1474241A (zh) | 2004-02-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1332548C (zh) | 海量定时器的调度方法 | |
CN106802826B (zh) | 一种基于线程池的业务处理方法及装置 | |
US6085277A (en) | Interrupt and message batching apparatus and method | |
CN105847378B (zh) | 一种实现大数据同步的方法和系统 | |
EP2088713A1 (en) | A polling method and a polling server | |
CN111045806A (zh) | 延迟消息队列实现方法以及系统 | |
CN103645939A (zh) | 一种图片抓取的方法和系统 | |
CN106067043A (zh) | 一种性能测试方法及系统 | |
EP3076309A1 (en) | Programmable logic controller, data collection apparatus, database access method, and database access program | |
CN109656733B (zh) | 智能调度多ocr识别引擎的方法及设备 | |
CN110442564B (zh) | 增量数据校验方法、存储介质 | |
US5276896A (en) | Apparatus for implementing data communications between terminal devices and user programs | |
CN111400407A (zh) | 数据的同步方法及装置、存储介质及电子装置 | |
US6115835A (en) | Method and apparatus for determining a set of tests for integrated circuit testing | |
CN1757021A (zh) | 设备管理方法及设备管理系统 | |
Almeida et al. | Using a planning scheduler to improve the flexibility of real-time fieldbus networks | |
CN109842621A (zh) | 一种减少token存储数量的方法及终端 | |
CN106802689B (zh) | Windows操作系统环境下可调速高精度定时器的实现方法 | |
CN107066413B (zh) | 一种用于处理多个总线设备数据的方法及其总线系统 | |
Sztrik | Finite-source queueing systems and their applications | |
CN113342679A (zh) | 接口测试方法及测试装置 | |
US20050050480A1 (en) | Notifying status of execution of jobs used to characterize cells in an integrated circuit | |
US6535908B1 (en) | System and method for call record search and call record verification for network certification | |
CN108509160B (zh) | 邮政单打印方法、电子装置及计算机可读存储介质 | |
US6708197B1 (en) | Method of driving timer in an advanced intelligent network switching system employing the thread call structure under UNIX system |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20070815 Termination date: 20160807 |
|
CF01 | Termination of patent right due to non-payment of annual fee |