天极Yesky
  • 笔记本电脑
    笔记本
  • 台式电脑
    台式机
  • 手机
    手机
  • 电脑硬件DIY
    DIY硬件
  • CPU
    主板
    音箱
  • 硬盘
    显卡
    键鼠
  • 内存光驱
    显示器
    机箱电源

  • 数码相机DC
    数码相机
  • MP3播放器
    MP3/MP4
  • 数码摄像机DV
    摄像机
  • 电脑外设
    外设
  • 网络
    网络
  • 服务器
    服务器
  • 数字家庭
    数字家庭
  • 群乐
    群乐
  • 产品报价 行情 经销商 渠道 评测 | 软件 设计 网页 开发 安全 论坛 E时代 游戏 图片 壁纸 下载 网摘 博客 索尼专区 Vista 科技奥运
    您现在的位置: 天极网 > 软件频道 > 专题教程

      图4:作业对象与CReferableCache全局对象的交互

      图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

      阅读关于 C++ 智能指针 内存占用 的全部文章
    群乐:C++