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