馬 薇
(哈爾濱理工大學(xué)機(jī)械動力工程學(xué)院,哈爾濱150080)
隨著互聯(lián)網(wǎng)的普及,其用戶在很短的時(shí)間內(nèi)迅速增長.這種爆炸性的增長所帶來的問題也日益突顯,那就是網(wǎng)絡(luò)管理的問題[1].在人工管理的情況下,網(wǎng)絡(luò)主機(jī)的線形增長會導(dǎo)致網(wǎng)絡(luò)管理復(fù)雜度的非線形增長.當(dāng)一個(gè)網(wǎng)絡(luò)的節(jié)點(diǎn)達(dá)到100臺以上時(shí),光靠手工檢測與管理其難度是不可想象的.對此,人們提出了使用計(jì)算機(jī)進(jìn)行自動化或半自動化管理,以減輕管理人員的負(fù)擔(dān),并且增加效率,提高準(zhǔn)確性.使網(wǎng)絡(luò)管理趨于自動化[2].但由于網(wǎng)絡(luò)規(guī)模日益增大,目前存在的網(wǎng)絡(luò)管理軟件中,大部分采用多線程輪詢設(shè)備的做法,此做法的好處是實(shí)時(shí)性比較強(qiáng),缺點(diǎn)是要耗費(fèi)巨大的硬件資源,嚴(yán)重占用網(wǎng)絡(luò)帶寬[3].為此本文提出了一種比較靈活的多線程模型.既可以有效地保證設(shè)備的狀態(tài)實(shí)時(shí)性,也可以節(jié)省硬件資源,非常適合管理大型的網(wǎng)絡(luò).
在大型的網(wǎng)絡(luò)中,網(wǎng)絡(luò)設(shè)備加上工作站要幾百臺設(shè)備,單獨(dú)的線程根本無法完成這么大的輪詢?nèi)蝿?wù),所以程序必須采用多線程輪詢方式來工作.一般網(wǎng)絡(luò)設(shè)備是以樹的方式連接[4].比如稅務(wù)局相應(yīng)的級別為省局、市局、區(qū)縣局、稅務(wù)所.設(shè)備所在單位的級別越高,管理員也就越關(guān)心設(shè)備的狀態(tài).也就是說,在稅務(wù)所與省局間的設(shè)備,管理員顯然更關(guān)心省局的設(shè)備,因?yàn)樗鼈兪钦麄€(gè)網(wǎng)絡(luò)的中心,省局的設(shè)備所要求的實(shí)時(shí)性也就越高.這就要求我們的程序可以為每臺設(shè)備設(shè)定輪詢周期.我們可以把省局的輪詢周期設(shè)為5 min,將稅務(wù)所的設(shè)備輪詢周期設(shè)為30min,從而達(dá)到所需的效果.多線程運(yùn)行結(jié)合著上述的輪詢周期的設(shè)備增大了程序模型設(shè)計(jì)的復(fù)雜性.可是設(shè)備數(shù)量太多,一般工作站是無法承受幾百個(gè)甚至上千的線程同時(shí)進(jìn)行操作.在這個(gè)問題上,本文提出了一種線程池的技術(shù).原理如下:在程序初始化的時(shí)候先建立起若干個(gè)線程并讓其堵塞,然后再建立一個(gè)任務(wù)隊(duì)列,隊(duì)列里放置將要輪詢的任務(wù),這若干個(gè)線程只針對任務(wù)隊(duì)列里的任務(wù),如果有任務(wù),若干個(gè)線程就并行工作完成任務(wù),完成任務(wù)后繼續(xù)堵塞等待下次任務(wù).可以按照設(shè)備各自的周期將任務(wù)由任務(wù)調(diào)度定期加入到任務(wù)隊(duì)列中去.這樣做可以解決程序要求的多設(shè)備按自己的輪詢周期多線程網(wǎng)絡(luò)操作[5].原理圖如圖1所示.
圖1 多線程輪詢模塊結(jié)構(gòu)圖
這個(gè)模型在Window操作系統(tǒng)、VC.net和C++語言來完成,模型中利用了面向?qū)ο笳Z言的虛函數(shù)特性.主要通過幾個(gè)自定義的類來實(shí)現(xiàn):CWork-ThreadPool類代表線程池模型,CDevice類代表設(shè)備基類,CMap<UINT,UINT,C Device*,C Device*>模板類代表設(shè)備的映射隊(duì)列,C PtrArray類代表任務(wù)隊(duì)列.成百上千設(shè)備的信息存在數(shù)據(jù)庫中,在程序啟動的時(shí)候讀到內(nèi)存中,在內(nèi)存中的存放方式為Map映射,以便通過設(shè)備id迅速地找到該設(shè)備,在內(nèi)存中的存放方式[6],如圖2所示.
在整個(gè)線程池模型中任務(wù)推動引擎與調(diào)度的實(shí)現(xiàn)上,本程序采用了Window消息響應(yīng)的機(jī)制來設(shè)計(jì).基本實(shí)現(xiàn)方法如下:在程序初始化的時(shí)候,從數(shù)據(jù)庫中可以讀取到各個(gè)設(shè)備及其輪詢周期,這時(shí)采用Windows系統(tǒng)APISetTimer函數(shù)來通過操作系統(tǒng)來完成引擎和調(diào)度,調(diào)用原型為:SetTimer(設(shè)備id,設(shè)備輪詢周期,NULL).而在主窗口線程消息響應(yīng)函數(shù)OnTimer(UINT param)中,由于我們在內(nèi)存中組織數(shù)據(jù)結(jié)構(gòu)時(shí)CDevice設(shè)備類用的是Map映射,而索引正是設(shè)備id,所以通過參數(shù)param可以迅速判斷是哪個(gè)設(shè)備達(dá)到了輪詢時(shí)機(jī),然后將設(shè)備在內(nèi)存中對應(yīng)的設(shè)備類對象指針加入到任務(wù)隊(duì)列中去,由線程池來完成網(wǎng)絡(luò)輪詢.
在線程池與任務(wù)隊(duì)列的實(shí)現(xiàn)上,由自定義類CWorkThreadPool來完成.在類的內(nèi)部有任務(wù)隊(duì)列的定義:CPtrArray m_WorkItems.這個(gè)任務(wù)隊(duì)列里放置的是CDevice設(shè)備類的指針.
在類初始化的過程中啟動線程池里的線程:
圖2 設(shè)備在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)
我們在上面的程序中看到了設(shè)備CDevice類的GetSnmpInfo輪詢函數(shù),而CDevice基類的指針pdev指向的對象可以是派生類的對象,由于GetSnmpInfo是虛函數(shù),所以輪詢函數(shù)GetSnmpInfo可以根據(jù)pdev所指向的設(shè)備類型來執(zhí)行各自不同的操作,類CWorkThreadPool就這樣完成了按設(shè)備各自輪詢周期的多線程輪詢操作.
除此以外,進(jìn)程模型中還有一個(gè)Trap守護(hù)線程,專門負(fù)責(zé)接收從各個(gè)設(shè)備主動發(fā)來的報(bào)警[7],由于是單線程,比較簡單,并不在本文敘述.
本文提出的模型在用VC.net實(shí)現(xiàn)以后,在吉林省稅務(wù)局包含上千臺設(shè)備(路由器、交換機(jī)、服務(wù)器、普通計(jì)算機(jī))的網(wǎng)絡(luò)中,用一臺普通配置的IBM服務(wù)器長期運(yùn)行了幾個(gè)月,完全可以滿足管理的要求.如圖3,客戶端的拓?fù)鋱D中顯示的網(wǎng)絡(luò)狀態(tài)讀取的就是本文進(jìn)程模型實(shí)現(xiàn)的服務(wù)器端程序.管理員可以通過設(shè)備的重要性來定制設(shè)備的輪詢周期,能夠盡量實(shí)時(shí)地發(fā)現(xiàn)設(shè)備的問題,同時(shí)極大地節(jié)省了硬件資源.
圖3 顯示線路提示信息的拓?fù)鋱D
提出一種基于網(wǎng)絡(luò)管理軟件的多線程模型,并且已經(jīng)在相關(guān)的單位進(jìn)行了較為成功的應(yīng)用.這種模型相對于常規(guī)的網(wǎng)絡(luò)管理線程管理方法有如下優(yōu)點(diǎn):
1)可靈活定制,每個(gè)設(shè)備都可以根據(jù)自己的周期來定期監(jiān)測;
2)耗費(fèi)硬件資源低,占用網(wǎng)絡(luò)帶寬小,經(jīng)過實(shí)驗(yàn)驗(yàn)證,20個(gè)線程足以監(jiān)測上千臺設(shè)備;
3)因?yàn)樵趦?nèi)存中設(shè)備以Map方式存放,可以迅速地定位設(shè)備并找到設(shè)備其他信息.
本線程管理模型既可用作網(wǎng)絡(luò)管理方面,也可用作其他按對象重要程度全局監(jiān)控的其他方面,有很強(qiáng)的實(shí)用性.
[1]侯俊杰.深入淺出MFC[M].2版.武漢:華中科技大學(xué)出版社,2001:232-245.
[2]STEVENSW R.TCP/IP Illustrated Volume1[M].北京:機(jī)械工業(yè)出版社,2000:359-388.
[3]胡成松,汪 凱.SNMP網(wǎng)絡(luò)管理[M].北京:中國電力出版社,2001:122-159.
[4]MicroSoft Company.MSDN Library[M].USA:MicroSoft Company,2001:399-440.
[5]JEFF P.MFCWindows程序設(shè)計(jì)[M].2版.北京:清華大學(xué)出版社,2001:36-422.
[6]CLIFFORD A S.數(shù)據(jù)結(jié)構(gòu)與算法分析(C++版)[M].北京:電子工業(yè)出版社,2002:227-350.
[7]STEVENSW R.TCP/IP Illustrated Volume 2[M].北京:機(jī)械工業(yè)出版社,2000:433-492.