一种基于网络管理软件的多线程轮询模型

2010-10-17 07:47
关键词:轮询网络管理线程

马 薇

(哈尔滨理工大学机械动力工程学院,哈尔滨150080)

随着互联网的普及,其用户在很短的时间内迅速增长.这种爆炸性的增长所带来的问题也日益突显,那就是网络管理的问题[1].在人工管理的情况下,网络主机的线形增长会导致网络管理复杂度的非线形增长.当一个网络的节点达到100台以上时,光靠手工检测与管理其难度是不可想象的.对此,人们提出了使用计算机进行自动化或半自动化管理,以减轻管理人员的负担,并且增加效率,提高准确性.使网络管理趋于自动化[2].但由于网络规模日益增大,目前存在的网络管理软件中,大部分采用多线程轮询设备的做法,此做法的好处是实时性比较强,缺点是要耗费巨大的硬件资源,严重占用网络带宽[3].为此本文提出了一种比较灵活的多线程模型.既可以有效地保证设备的状态实时性,也可以节省硬件资源,非常适合管理大型的网络.

1 多线程模型

1.1 模型的设计

在大型的网络中,网络设备加上工作站要几百台设备,单独的线程根本无法完成这么大的轮询任务,所以程序必须采用多线程轮询方式来工作.一般网络设备是以树的方式连接[4].比如税务局相应的级别为省局、市局、区县局、税务所.设备所在单位的级别越高,管理员也就越关心设备的状态.也就是说,在税务所与省局间的设备,管理员显然更关心省局的设备,因为它们是整个网络的中心,省局的设备所要求的实时性也就越高.这就要求我们的程序可以为每台设备设定轮询周期.我们可以把省局的轮询周期设为5 min,将税务所的设备轮询周期设为30min,从而达到所需的效果.多线程运行结合着上述的轮询周期的设备增大了程序模型设计的复杂性.可是设备数量太多,一般工作站是无法承受几百个甚至上千的线程同时进行操作.在这个问题上,本文提出了一种线程池的技术.原理如下:在程序初始化的时候先建立起若干个线程并让其堵塞,然后再建立一个任务队列,队列里放置将要轮询的任务,这若干个线程只针对任务队列里的任务,如果有任务,若干个线程就并行工作完成任务,完成任务后继续堵塞等待下次任务.可以按照设备各自的周期将任务由任务调度定期加入到任务队列中去.这样做可以解决程序要求的多设备按自己的轮询周期多线程网络操作[5].原理图如图1所示.

图1 多线程轮询模块结构图

1.2 模型的实现

这个模型在Window操作系统、VC.net和C++语言来完成,模型中利用了面向对象语言的虚函数特性.主要通过几个自定义的类来实现:CWork-ThreadPool类代表线程池模型,CDevice类代表设备基类,CMap<UINT,UINT,C Device*,C Device*>模板类代表设备的映射队列,C PtrArray类代表任务队列.成百上千设备的信息存在数据库中,在程序启动的时候读到内存中,在内存中的存放方式为Map映射,以便通过设备id迅速地找到该设备,在内存中的存放方式[6],如图2所示.

在整个线程池模型中任务推动引擎与调度的实现上,本程序采用了Window消息响应的机制来设计.基本实现方法如下:在程序初始化的时候,从数据库中可以读取到各个设备及其轮询周期,这时采用Windows系统APISetTimer函数来通过操作系统来完成引擎和调度,调用原型为:SetTimer(设备id,设备轮询周期,NULL).而在主窗口线程消息响应函数OnTimer(UINT param)中,由于我们在内存中组织数据结构时CDevice设备类用的是Map映射,而索引正是设备id,所以通过参数param可以迅速判断是哪个设备达到了轮询时机,然后将设备在内存中对应的设备类对象指针加入到任务队列中去,由线程池来完成网络轮询.

在线程池与任务队列的实现上,由自定义类CWorkThreadPool来完成.在类的内部有任务队列的定义:CPtrArray m_WorkItems.这个任务队列里放置的是CDevice设备类的指针.

在类初始化的过程中启动线程池里的线程:

图2 设备在内存中的数据结构

我们在上面的程序中看到了设备CDevice类的GetSnmpInfo轮询函数,而CDevice基类的指针pdev指向的对象可以是派生类的对象,由于GetSnmpInfo是虚函数,所以轮询函数GetSnmpInfo可以根据pdev所指向的设备类型来执行各自不同的操作,类CWorkThreadPool就这样完成了按设备各自轮询周期的多线程轮询操作.

除此以外,进程模型中还有一个Trap守护线程,专门负责接收从各个设备主动发来的报警[7],由于是单线程,比较简单,并不在本文叙述.

2 实验结果

本文提出的模型在用VC.net实现以后,在吉林省税务局包含上千台设备(路由器、交换机、服务器、普通计算机)的网络中,用一台普通配置的IBM服务器长期运行了几个月,完全可以满足管理的要求.如图3,客户端的拓扑图中显示的网络状态读取的就是本文进程模型实现的服务器端程序.管理员可以通过设备的重要性来定制设备的轮询周期,能够尽量实时地发现设备的问题,同时极大地节省了硬件资源.

图3 显示线路提示信息的拓扑图

3 结 语

提出一种基于网络管理软件的多线程模型,并且已经在相关的单位进行了较为成功的应用.这种模型相对于常规的网络管理线程管理方法有如下优点:

1)可灵活定制,每个设备都可以根据自己的周期来定期监测;

2)耗费硬件资源低,占用网络带宽小,经过实验验证,20个线程足以监测上千台设备;

3)因为在内存中设备以Map方式存放,可以迅速地定位设备并找到设备其他信息.

本线程管理模型既可用作网络管理方面,也可用作其他按对象重要程度全局监控的其他方面,有很强的实用性.

[1]侯俊杰.深入浅出MFC[M].2版.武汉:华中科技大学出版社,2001:232-245.

[2]STEVENSW R.TCP/IP Illustrated Volume1[M].北京:机械工业出版社,2000:359-388.

[3]胡成松,汪 凯.SNMP网络管理[M].北京:中国电力出版社,2001:122-159.

[4]MicroSoft Company.MSDN Library[M].USA:MicroSoft Company,2001:399-440.

[5]JEFF P.MFCWindows程序设计[M].2版.北京:清华大学出版社,2001:36-422.

[6]CLIFFORD A S.数据结构与算法分析(C++版)[M].北京:电子工业出版社,2002:227-350.

[7]STEVENSW R.TCP/IP Illustrated Volume 2[M].北京:机械工业出版社,2000:433-492.

猜你喜欢
轮询网络管理线程
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
基于OpenStack虚拟化网络管理平台的设计与实现
基于等概率的ASON业务授权设计∗
电动汽车充电服务网络管理初探
浅谈linux多线程协作
基于EOC通道的SHDSL网络管理技术
依托站点状态的两级轮询控制系统时延特性分析
利用时间轮询方式操作DDR3实现多模式下数据重排
卫星导航网络管理设计