图4描述了系统中类CScheduler、CJobDefPtr、CJobDef、CReferableCache之间的交互,类CReferableCache具备静态成员方法getUniqueTag()、addObject()、deleteObject()。当一个对CJobDef的智能指针创建时,如下:
| 以下是引用片段: CJobDefPtr jobDefPtr = new CJobDef |
CScheduler会构造CJobDefPtr和一个CJobDef对象,当对象构造时,会通过CJobDef基类的CReferable构造函数调用getUniqueTag()方法,这就为每个CJobDef对象创建了一个唯一的识别标记(tag)。接下来,CJobDef对象被赋给CJobDefPtr对象,后者会调用他自己的set()方法把CJobDef对象添加进来。
当调用CJobDefPtr赋值操作符函数时,也会调用addObject()方法,假如是第一次赋值的话,他会把CJobDef对象添加进全局CReferableCache;当智能指针被请求替换由tag识别的他内部的对象引用时,impersonate()方法会调用getObject()方法,假如impersonate()方法未找到CReferableCache中标记的对象,那么,CJobDefPtr对象会替换他的内部对象标记,并把他自身添加到CReferableCache缓存集中;最后,当CJobDefPtr被删除及对象的引用计数为零时,deleteObject()方法此时会被调用。
在此所描述的事件调度系统,一般使用在市场咨询数据公司中,其会在网络集群工作站上触发计算任务,当从世界各处的零售商汇集所需信息之后,在每周的三天之中,都会触发计算任务,而这三天中的任意时刻,系统可能也要在集群工作站上运行超过20万个任务。因此,软件在合理内存及CPU消耗的前提下,支持重新启动,就显得很重要了。表1显示了在系统中运行着多个计算任务时,事件调度守护进程在每次重启后的内存消耗,在系统重启后,较小的内存消耗要归功于软件中使用了上文方法来串行及反串行化不常用的类对象的那些模块。当任务完成时,内存最终将被回收。
表1:在软件每次重启后的调度系统所用内存大小
| 运行任务数 | 软件重启前的内存占用大小 | 软件重启后的内存占用大小 |
| 5000 | 25M | 32M |
| 100000 | 370M | 413M |
| 200000 | 730M | 795M |
[1] [2] [3] [4]




