谢蒙1,2 王晶1,2 王纯1,2
(1.北京邮电大学网络与交换技术国家重点实验室 北京100876)
(2.东信北邮信息技术有限公司 北京100191)
摘要:结合综合数据业务平台的一般应用场景,对其中的定时任务需求进行了详细的分析,并在此基础上设计并实现了定时任务调度组件,该组件能够实现对大量定时任务高效管理和调度。定时任务调度组件主要包括内存管理、任务调度和告警三个部分,其中内存管理部分主要采用内存池的设计方式,任务调度部分采用了观察者设计模式,告警部分采用时钟信号中断的方式来检测陷入情况并进行日志告警。
关键词:定时任务、内存池、观察者模式、陷入检测
Design and Implementation of Timing Task Scheduling Component for Integrated Data Platform
(State Key Laboratory of Networking and Switching Technology, Beijing University of Posts
and Telecommunications, Beijing 100876, China)
(EB Information Technology Co. Ltd., Beijing 100191, China)
Xie Meng, Wang Jing, Wang Chun
Absract: Based on the general application scenarios of comprehensive data service platform,this paper analyzes the requirement of timing task,then designs and implements the timing task scheduling components which can realize for large timing task efficient management and scheduling.Timing task scheduling components has three parts,including memory management, task scheduling and alarm. Memory management using memory pool design methods,task scheduling adopted the observer of design patterns,and alarm clock signal used to detect the situation of endless loop.
1 引言
IDP(综合数据业务平台)作为一个统一的综合性的自营业务平台,已经在商用的业务中(如贵州联通手机报、浙江移动彩信营销业务等)得以应用。IDP平台具有通用的业务模板,具有统一内容管理功能,能够提供各种资源(如音频、图片、短信等)的统一管理[1];IDP是开放的、模块化的、基于标准的基础平台,它向下提供与短信网关、彩信中心、BOSS(Business&Operation Support System,运营支撑系统)、WAP(Wireless Application Protocol,无线应用协议)网关等功能实体的通信,向上提供用户鉴权、短信/彩信编辑发送、用户管理等公共功能,同时还具有对各种业务角色(如CP(Content Provider,内容提供商))的管理功能等[2]。定时任务调度作为一种灵活的后台任务执行的解决方案,能够应对现实中的很多需求,许多系统和平台都将定时器作为其基础组件。本文针对IDP平台的一般应用场景,提出了一种适宜的定时任务调度组件的设计和实现方法。
2 需求分析及功能设计
2.1 需求分析
在利用综合数据业务平台进行二次开发的时候,我们往往会遇到定时任务的需求,例如对系统运行状态实时监控等。这就要求综合数据业务平台能够提供一种定时执行任务的功能,并且能够对多个定时任务提供统一的管理和调度[3]。
2.2 定时任务的状态转化流程
图1 任务状态转化
1、 将定时任务添加到任务管理器中。
2、 任务管理器对定时任务进行统一调度。
3、 定时任务触发并执行,对定时任务的状态进行检测,如继续执行则回到任务调度状态,否则进行任务删除。
4、 将定时任务从任务管理器中删除。
2.3 主要功能模块设计
图2 功能模块
定时任务调度组件主要包括三个大的功能模块:第一个是内存管理模块,主要负责对内存的分配和管理。因为定时任务的添加和删除十分频繁,利用操作系统自身的内存分配可能造成大量的内存碎片,使得整个操作系统的运行效率受到影响;第二个是任务调度模块,主要负责对定时任务的添加、删除和调度等,也是定时任务调度组件的核心模块,实现了对任务的管理和时间的控制;第三个是告警模块,主要是针对任务调度中出现的异常情况提供告警功能。有些任务在运行的过程中可能存在陷入的情况,这样使得整个系统的运行都出现停滞,针对这种异常情况的出现,需要提供一个实时的告警功能。
3 定时任务调度组件的设计与实现
定时任务调度过程中会出现频繁的任务新建和删除,相应的对于定时任务对象要进行频繁的new和delete操作,这样会使得系统的内存碎片不断增加,系统的运行效率将越来越低,因此需要实现一个自己的内存管理器来管理定时任务timer的分配和释放,我们采用内存池的方式来实现内存管理,首先我们预先分配一定数目的timer,并存储在一个单向链表timer_list中[5],如图3所示:
图3 定时器存储结构
内存分配alloc_timer主要包括如下三个步骤:
1、 如果timer_list为空,一次性分配一定数目的timer,并加入到链表中,否则进入第2步;
2、 从单向链表的头结点中删除第一个结点,并将该节点作为返回结点;
3、 更新相应的统计数值;
内存释放 free_timer主要包括如下三个步骤
1、 检查list_timer的个数,如果单链表长度超过设定值,则直接执行free,否则第2步;
2、 将需要释放的timer相应的值复位,并添加到timer_list中;
3、 更新相应的统计值;
通过上述方式达到了对timer对象的复用,减少了频繁调用系统操作分配和释放内存的操作,避免了大量内存碎片的产生,并可以对内存的使用情况和任务的分配情况进行统计。
3.1 任务调度部分的设计与实现
任务的调度部分是整个组件的核心,主要包括任务的添加、删除和调度。为了实现高效的任务添加、删除和查找,任务调度器对定时任务采用键值对的方式进行存储,数据结构采用hashtable,这样可以对定时任务进行高效添加和删除,复杂度均为O(1)[6]。在任务的调度上采用了观察者模式,任务管理器检测时间事件,当发现时间走过1秒时,通知管理器中所有定时任务该事件的发生,定时任务针对该事件做出相应的反应,实现的UML如图4所示[7]:
图4 定时器调度UML
任务管理器获取系统时间,与上一轮获取的系统时间做差,如果时间未走过1秒,则继续下一轮,否则通知在管理器上注册的定时任务观察者时间走过1秒,定时器做出相应的反应,主要包括:
1、 时间间隔剩余减少1秒,如果其变为0,则进行下一步,否则返回;
2、 执行相应的定时任务,如为永久任务,则返回,否则进入下一步;
3、 将执行剩余次数times减1,如果times变为0,则从任务管理器中删除该任务;
在时间控制上利用系统函数gettimeofday获取当前时间并记录,在下一轮中同样获取时间到系统时间,当走过时间超过1秒时触发notify函数并更新当前时间记录,通知各个时间事件对象时间走过1秒[8]。可能发生系统时间发生回调的情况,这时修改当前时间记录并直接进入下一轮循环。
3.2 告警部分的设计与实现
定时任务调度模块中某些时间事件在运行过程中可能因为自身或者其他因素出现陷入(如无限循环、网络通信长时间不返回、无限递归等)的情况,这将使得整个时间事件的调度陷入停滞,致使其他定时任务得不到处理,系统需要针对这种异常情况进行探测并发出告警。采用ALARM信号进行系统定时中断的形式对陷入情况进行检查,当有陷入时日志告警。
在执行函数的开始加入setTag宏,将代码执行的相关信息写入到全局变量g_fileLine中,setTag宏如下:
#define setTag(t) sprintf(g_fileLine,(file:%s line %d %s)“,__FILE__,__LINE__,t);
在ALARM处理函数中将全局变量g_enterMainLoop设置为0,在调度主循环执行g_enterMainLoop++,以此记录上次ALARM打断到本次ALARM打断主调度循环执行的次数,如果在g_enterMainLoop为0,则说明两次打断之间主调度循环没有得到调度,出现了陷入的情况,输出g_fileLine就能确定陷入的函数。
4 结束语
综上所述,本文设计的综合数据业务平台的定时任务调度组件能够对大量的定时任务实现高效的管理和调度,并能针对异常情况的出现进行及时的检测和告警,其中内存管理方面采用内存池的方式减少了大量的内存分配和释放工作,减轻了操作系统的压力的同时提高了获取定时任务对象的效率;任务管理和调度方面采用观察者设计模式并采用hashtable的存储方式进行管理,提高了定时任务管理和调度的效率;采用ALARM信号进行系统定时中断的形式,能够检测组件运行的陷入情况并及时告警。
参考文献
[1] 杨妙,王晶.IDP中消息分发模块的改进[J].电信工程技术与标准化,2009,(06):73-76
[2] 廖建新.移动智能网技术的研发现状及未来发展.电子学报,2003,31(11):1725-1731
[3] 敬涛.综合数据业务平台(IDP)中业务功能模块的改进.北京邮电大学.硕士学位论文,2009年4月
[4] 赵贝尔.综合数据业务平台(IDP)的设计及核心功能实现.北京邮电大学.硕士学位论,2007年4月
[5] 郭丙轩,张京莉,张志超.基于内存池的空间数据调度算法.计算机工程,2008,34(6): 63-64
[6] MarshaII K McKusick et al.The Design and ImpIementation of the 4.4BSD Operation System. Boston:Addison-WesIey,1996
[7] Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides.设计模式.机械工业出版社,2000,9
[8] 李小群,赵慧斌,叶以民,孙玉芳.一种基于时钟粒度细化的Linux实时化方案.计算机研究与发展 ,2003, 40(5):734-739