基于令牌漏桶法的数据记录技术*
2012-06-08邢永昌
邢永昌
(中国船舶重工集团公司第七二四研究所,南京 210003)
0 引言
在试验或军事演习中,雷达产生的目标航迹数据具有很高的研究价值和训练价值;如果能够实时采集当时的航迹,对雷达设计研究人员和指挥作战人员与战位操作人员具有很重要的价值。但是,由于雷达终端对实时性要求非常高,在终端上集成数据记录功能会影响系统的实时性,从而影响整个作战系统对目标处理的实时性。如果采用专门的数据采集回放设备,软件硬件的代价昂贵,而且不能直观地在原设备上面回放。
由于数据记录任务占用的CPU 资源量很大,如果采用逐个航迹进行记录,当航迹比较多时或目标分布不均匀时,会使实时系统失去实时性,甚至死机。
本文提出一种优化的漏桶法,采用自适应记录数据技术,可以大大减少数据记录占用的CPU 资源,并且可以自适应选择CPU 空闲时间执行,从而有效避免数据记录对系统的负面影响。
1 基本原理
令牌漏桶法是在英特尔网路由器上应用的一种网络管制算法,其工作原理如下:
(1)令牌以一定的速率放入桶中;
(2)每个令牌允许源发送一定数量的比特;
(3)发送一个包,流量调节器就从桶中删除与包大小对应的令牌数;
(4)如果没有足够的令牌发送包,这个包就会等待直到有足够的令牌或者包丢弃,也可能被标记更低的DSCP(在策略者的情况下);
(5)桶有特定的容量,如果桶已经满了,新加入的令牌就会被丢弃。因此,在任何时候,源发送到网络上的最大突发数据量与桶的大小成正比。令牌桶允许突发,但是不能超出限制。
本文设计的令牌漏桶原理如下:
(1)通过WDB 绘出当前实时系统资源占用图表,统计系统资源的占用率、空闲时间段情况等数据;
(2)根据统计数据设置令牌发放频率,构建循环队列数据池的结构和设计令牌漏桶;
(3)根据设计的循环队列数据池结构,打包缓存待处理数据,如果回放则设计回放循环队列数据池中数据;
(4)根据系统运行情况和循环队列数据池中待处理数据量适时产生令牌;
(5)接收到令牌的任务,根据当前CPU的空闲情况自适应选择执行时机,根据当前循环队列数据池中待处理数据量自适应选择处理数据量。
令牌漏桶法的网络传输工作流程图见图1。基于令牌漏桶法的自适应数据记录/回放技术工作流程图见图2。
图1 令牌漏桶法的网络传输工作流程图
图2 基于令牌漏桶法的自适应数据记录/回放技术工作流程图
由于数据记录过程中主要是读写外部存储器影响系统的实时性,数据记录过程中打开文件和关闭文件消耗的系统资源比重比较大,令牌漏桶法通过设置合适的漏桶容量、合适的数据缓冲区大小和适当的令牌产生频率,使打开和关闭文件的次数大大地减少,从而有效地减少数据实时记录对系统资源的消耗。
本文令牌的发放是通过创建较低优先级任务的方法实现的。该方法不但可以让数据记录任务放在当系统资源空闲状态时才占用,而且可以实现当正在进行数据记录时如果有较高优先级的系统任务到来时可以被较高优先级任务抢占回系统资源,从而达到只在系统资源空闲时才进行数据记录而不影响系统的实时运行的目的。
2 算法实现
下面通过传统算法和本文算法比较解释本文设计的令牌漏桶法的实现。
2.1 传统数据记录算法分析
按照传统的数据记录方法,当需要记录数据单元产生后,即按照设计的数据格式处理数据并打开对应文件记录数据,然后关闭文件。图3~5分别是系统正常运行时传统方式数据记录时和采用令牌漏桶法数据记录时系统资源占用情况。由于数据记录与数据处理串行处理,当数据产生频率较高时,在t1、t2、t3时刻就容易产生系统瘫痪甚至死机。
图3 没有记录任务时CPU时间片分配图
图4 采用传统方式记录任务时CPU时间片分配图
图5 采用令牌漏桶时CPU时间片分配图
2.2 本文记录算法分析
根据系统运行情况和当前循环队列数据池中的待处理数据量确定令牌发放时机。
数据记录任务的优先级要设计得比较低,这样不但不影响系统的正常运行,而且可以在系统空闲时间内完成数据记录。
2.2.1 构建循环队列数据池
建立合适的数据缓冲区对该算法的实现至关重要,它决定着本算法的成功与失败。数据池的容量应该大于漏桶中最多令牌创对应的数据量。数据池设计成循环队列,以实现在最小的缓冲空间中实现数据的缓冲,等待和处理可以同时且互不干扰地进行。通过对线程的并行处理提供实现的基础框架和对于软件模块间松耦处理,该设计提高了软件的模块化、可重用性和稳定性。
下面是一个循环队列数据池的定义:
typedef struct DataSaveBuffer
{
DataStruct SaveDataBuffer[MAXSAVEDATANUM];//循环队列,数据缓存。
int nWritePtr;//写指针
int nReadPtr;//读指针
int nTrackCount;//待记录航迹个数
int nTaskCount;//待记录任务个数
};
2.2.2 适时产生令牌
在本文中产生令牌(创建数据记录或回放任务)缓存入令牌队列。
如果按照固定时间间隔产生令牌,在需要记录数据分布比较均匀或在数据产生频率非常低的情况下,基本可以达到本文要求的效果。但是,如果需要记录数据源产生频率不均匀或数据量比较大时,数据记录回放功能将会影响系统的实时性。
在这里提出定时产生与循环队列数据池中待处理数据量相结合的思想,即不仅要满足一定的时间间隔而且要满足缓存够一定的数据容量才会释放数据记录令牌。当取消该类数据记录或收到要关机命令时,只要缓存中还有待记录数据则释放令牌创建任务进行处理。
2.2.3 处理数据记录任务释放漏桶容量
每个数据记录任务对应漏桶中的一个令牌,每处理完一个任务漏桶中令牌即减少一个,同时漏桶中可以多增加一个令牌。
在打开记录文件过程中需要锁定其他任务,以免在打开文件的过程中由于任务优先级被抢占而破坏文件。记录过程中对不同的文件分别打开、记录、关闭,而不可打开多个再记录。完成一个记录任务,释放循环队列数据池一个存储数据空间。
3 试验结果与分析
试验环境要求:Intel Core Duo 1.66Hz中央处理器,2GB 内存,VxWorks5.5 操作系统,周期为2s,66 批目标,实时记录航迹信息,航迹信息需要记录成3个文件,分别用于回放、数据分析和记录航迹个数。令牌产生时间间隔为2 s。
图6、7 是使用传统记录方法和本文的令牌漏桶法处理记录任务占用时间对照图。
图6 采用传统方法记录航迹信息时记录每条航迹占用的时间长度
对比图6、7 可以发现,当没有较高优先级任务抢占记录任务时本文的令牌漏桶法记录每条航迹大约需要1~2 ms,传统算法需要30~50ms;当有较高优先级任务抢占记录任务时本文的令牌漏桶法记录每条航迹大约需要时间3~9 ms,传统方法记录每条航迹大约需要230~260 ms。
从现象上看,采用传统算法,当航迹个数超过12批时即会出现数据处理滞后现象,运行几分钟后行软件即处于严重瘫痪状态,操作命令不能执行,只有光标还可以移动。如果采用本文的令牌漏桶法,当航迹数达到90 批以上时,持续运行4 h,通过系统测试没有出现延时,同时也没有其他异常现象。
图7 采用本文的令牌漏桶法记录航迹信息时记录每条航迹占用的时间长度
4 结束语
通过以上试验验证,在不影响系统的正常运行情况下,本文算法不仅能实现数据的实时记录,而且可以显著降低数据实时记录占用的系统资源,解决了数据的实时记录引起系统瘫痪的问题。该方法应用于通信数据的实时接收与处理功能上同样可以得到很好的效果。
[1]谢希仁.计算机网络(第5 版)[M].北京:电子工业出版社,2008.1.
[2]严蔚敏,吴伟民.数据结构(C 语言版)[M].北京:清华大学出版社,1997.4.
[3]Bruno R Preiss.Data Structures and Algorithms with Object-Oriented Design Pattern in C++.Press John Wiley & Sons,Inc.1999.8.
[4]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2002.1.