国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

ACE網(wǎng)絡(luò)庫及IOCP通訊模式在電力系統(tǒng)機(jī)房監(jiān)控中的應(yīng)用

2013-04-29 17:18:03付劍瓏鄧凱
科協(xié)論壇·下半月 2013年6期

付劍瓏 鄧凱

摘 要:近年來電力系統(tǒng)的機(jī)房動(dòng)力環(huán)境監(jiān)控系統(tǒng)的應(yīng)用范圍不斷擴(kuò)展,系統(tǒng)規(guī)模迅速擴(kuò)大,接入站點(diǎn)大量增加,對(duì)監(jiān)控主站的軟件硬件提出了更高的要求。介紹在監(jiān)控主站升級(jí)改造中,運(yùn)用的新一代網(wǎng)絡(luò)通訊解決方案與策略,探討ACE網(wǎng)絡(luò)庫及IOCP通訊模式在通訊軟件中的應(yīng)用。

關(guān)鍵詞:ACE網(wǎng)絡(luò)庫 IOCP模式 動(dòng)環(huán)監(jiān)控系統(tǒng)

中圖分類號(hào):TM76 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-3973(2013)006-081-02

在電力系統(tǒng)大運(yùn)行體系實(shí)施中,建設(shè)變電站及通信機(jī)房監(jiān)控系統(tǒng),在傳統(tǒng)“四遙”的基礎(chǔ)上,安裝包含交直流電源子系統(tǒng)、遙視圖像子系統(tǒng)、安防周界子系統(tǒng)、環(huán)境子系統(tǒng)、照明子系統(tǒng)等綜合輔助監(jiān)控系統(tǒng),全面提升對(duì)變電站機(jī)房的“感知”, 減輕運(yùn)行維護(hù)人員負(fù)擔(dān),提高電網(wǎng)運(yùn)行可靠性成為一種必須。

在機(jī)房環(huán)境系統(tǒng)建設(shè)的初期,接入對(duì)象主要是電力局大樓的機(jī)房、500kV220kV高電壓等級(jí)變電站機(jī)房。接入的站點(diǎn)數(shù)量較少,一般在10個(gè)以下,通訊對(duì)象也只有幾十個(gè)。近幾年,隨著電力系統(tǒng)自動(dòng)化程度不斷提高,大量110kV及以下的變電站,都實(shí)現(xiàn)了無人值班,在變電站機(jī)房的自動(dòng)化設(shè)備大量增加的同時(shí),操作維護(hù)人員大量減少。另外,大量的社區(qū)或鄉(xiāng)鎮(zhèn)供電所實(shí)現(xiàn)網(wǎng)絡(luò)接入,聯(lián)網(wǎng)收費(fèi)。大量的110kV及以下的變電站、社區(qū)或鄉(xiāng)鎮(zhèn)供電所都需要接入集中的機(jī)房監(jiān)控系統(tǒng),接入的站點(diǎn)數(shù)量和通訊對(duì)象幾何倍數(shù)增加,很多地區(qū)供電局的機(jī)房監(jiān)控系統(tǒng)接入站點(diǎn)需求量達(dá)到200個(gè)以上,通訊對(duì)象超過1000個(gè)。

通訊對(duì)象的幾何倍數(shù)增加對(duì)動(dòng)環(huán)監(jiān)控系統(tǒng)的通訊服務(wù)器提出了極高的要求。是對(duì)現(xiàn)有服務(wù)器系統(tǒng)進(jìn)行軟件升級(jí),還是投入巨資升級(jí)硬件、增加服務(wù)器數(shù)量?成為各電力局安排建設(shè)資金面臨的重要問題。

機(jī)房監(jiān)控系統(tǒng)的通信服務(wù)器的主要工作就是進(jìn)行網(wǎng)絡(luò)通訊。目前常用的網(wǎng)絡(luò)通訊編程模型有以下幾種:

(1)blocking I/O阻塞模式:與通訊對(duì)象網(wǎng)絡(luò)連接時(shí),在連接過程中一直等待,效率極低。只要有多個(gè)通訊對(duì)象就不能有效的工作了。

(2)nonblocking I/O非阻塞模式:與通訊對(duì)象網(wǎng)絡(luò)連接時(shí),在啟動(dòng)連接后,就可以進(jìn)行其它工作,效率較高。但每個(gè)網(wǎng)絡(luò)連接工作中仍需一到兩個(gè)線程,因此連接數(shù)達(dá)到幾十上百后,大量線程經(jīng)常切換,效率大幅下降。

(3)Select模式(I/O multiplexing):一個(gè)線程可以管理64個(gè)網(wǎng)絡(luò)連接。此模式在達(dá)到1000個(gè)以上的網(wǎng)絡(luò)連接后,也會(huì)由于線程太多,效率大幅下降。

(4)signal driven I/O (SIGIO):只有UNIX系統(tǒng)支持。我們暫不考慮。

(5)asynchronous I/O模式(IOCP模式是其中一種):一個(gè)線程可以管理成千上萬個(gè)網(wǎng)絡(luò)連接。在多連接,大數(shù)據(jù)量下,可獲得理想的CPU響應(yīng)。此模式適應(yīng)于網(wǎng)絡(luò)服務(wù)器這類需要處理大量連接的應(yīng)用。

圖1是以上五種模型的比較。

圖1 五種模型的比較

從圖1可以看出,越往后,阻塞越少,理論上效率也是最優(yōu)。

從機(jī)房環(huán)境系統(tǒng)的長遠(yuǎn)發(fā)展看,我們選取asynchronous I/O(IOCP)模式進(jìn)行網(wǎng)絡(luò)通訊編程。為提高系統(tǒng)建設(shè)進(jìn)度,少走彎路,我們采取借鑒前人成功經(jīng)驗(yàn)的方式,下載國內(nèi)外程序員的開源代碼庫加以修改。

ACE自適配通信環(huán)境(Adaptive Communication Environment)是一種面向?qū)ο螅∣O)的工具包,它實(shí)現(xiàn)了通信軟件的大量基本的設(shè)計(jì)模式。ACE的目標(biāo)用戶是在UNIX和Win32平臺(tái)上開發(fā) 高性能通信服務(wù)和應(yīng)用的開發(fā)者。ACE簡化了使用進(jìn)程間通信、事件多路分離、顯式動(dòng)態(tài)鏈接和并發(fā)的OO網(wǎng)絡(luò)應(yīng)用和服務(wù)的開發(fā)。

ACE是目前最具代表的開源網(wǎng)絡(luò)通訊類軟件庫,授權(quán)是免費(fèi)的,可以自由使用,它正在被用于大量商業(yè)項(xiàng)目中(包括國際知名的大公司:諾基亞、摩托羅拉等),以及許多學(xué)院和工業(yè)研究項(xiàng)目。ACE已被移植到多種操作系統(tǒng)平臺(tái)上,包括Win32和大多數(shù)的UNIX/POSIX實(shí)現(xiàn)。此外,同時(shí)有C++和Java版本的ACE可用。

ACE庫版本很多,更新升級(jí)比較快。我們根據(jù)機(jī)房環(huán)境監(jiān)控系統(tǒng)的需要,選用的是基于VC2005的Windows平臺(tái)版本,版本號(hào)為5.8.2,這個(gè)版本的庫支持VC2005(VC8)、WinCE(VC2005)、VC2008(VC9),適用范圍比較寬。

ACE 中的Proactor框架可以實(shí)現(xiàn)IOCP功能。Proactor很多文檔翻譯為前攝器。

Proactor使用了異步的I/O工廠類收發(fā)消息,read/write方法都是異步進(jìn)行的,調(diào)用完成后立即返回給Proactor主框架,然后進(jìn)行其它事件的處理。后臺(tái)的程序負(fù)責(zé)收發(fā)消息,真正收到消息或者發(fā)送消息完成時(shí)才通知Proactor的事件處理器去進(jìn)行處理。這種異步I/O機(jī)制使得Proactor的主線程更專注于我們業(yè)務(wù)邏輯的處理,而不會(huì)將時(shí)間浪費(fèi)在對(duì)網(wǎng)絡(luò)數(shù)據(jù)I/O的處理上。

我們應(yīng)用ACE庫,通過ACE_Proactor實(shí)現(xiàn)IOCP模式的實(shí)現(xiàn)方式如下:

1 創(chuàng)建服務(wù)處理器

Proactor框架中服務(wù)處理器均派生自ACE_Service_Handler,它和Reactor框架的事件處理器非常類似。當(dāng)發(fā)生IO操作完成事件時(shí),會(huì)觸發(fā)相應(yīng)的事件完成會(huì)調(diào)函數(shù)。

2 實(shí)現(xiàn)服務(wù)處理器IO操作

Proactor框架中所有的IO操作都由相應(yīng)的異步操作類來完成,這些異步操作類都繼承自ACE_Asynch_Operation。常用的有以下幾種:

ACE_Asynch_Read_Stream, 提供從TCP/IP socket連接中進(jìn)行異步讀操作.

ACE_Asynch_Write_Stream, 提供從TCP/IP socket連接中進(jìn)行異步寫操作.

使用這些操作類的一般方式如下:

初始化

將相關(guān)的操作注冊到服務(wù)處理器中,一般可通過調(diào)用其open方法實(shí)現(xiàn)。

發(fā)出IO操作

發(fā)出異步IO操作請求,該操作不會(huì)阻塞,具體的IO操作過程由操作系統(tǒng)異步完成。

IO操作完成回調(diào)處理

異步IO操作完成后,OS會(huì)觸發(fā)服務(wù)處理器中的相應(yīng)回調(diào)函數(shù),可通過該函數(shù)的ACE_Asynch_Result參數(shù)獲取相應(yīng)的返回值。

3 使用連接器或接受器和遠(yuǎn)端進(jìn)行連接

ACE為Proactor框架提供了兩個(gè)工廠類來建立TCP/IP連接。

ACE_Asynch_Acceptor, 用于被動(dòng)地建立連接

ACE_Asynch_Connector 用于主動(dòng)地建立連接

當(dāng)遠(yuǎn)端連接建立時(shí),連接器或接受器便會(huì)創(chuàng)建相應(yīng)的服務(wù)處理器,從而可以實(shí)現(xiàn)服務(wù)處理。

4 啟動(dòng)Proactor事件分發(fā)處理

啟動(dòng)事件分發(fā)處理只需如下調(diào)用:

while(true)

ACE_Proactor::instance ()->handle_events ();

ACE庫(見圖2)應(yīng)用中需要特別注意內(nèi)存泄漏問題,特別是與VC的MFC聯(lián)合使用時(shí)。我們采用的是以下方式檢測內(nèi)存泄漏:

(1)將下列內(nèi)容輸入到文件中:

//use MFC library

#define ACE_HAS_MFC 1

//use standard C++ library

#define ACE_HAS_STANDARD_CPP_LIBRARY 1

//define this, the application must create the ACE_Object_Manager.

//The recommended way is to call at the start of

//the program, and call at the end.

#define ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER

#include "ace/config-win32.h"

(2)在CWinApp的派生類的構(gòu)造函數(shù)或InitInstance()函數(shù)中加入ACE的初始化函數(shù)ACE::init(),在該派生類的析構(gòu)函數(shù)中加入ACE的清理函數(shù)ACE::fini()。

(3)若運(yùn)行時(shí)還檢測到有內(nèi)存泄漏,其輸出信息如下:

Detected memory leaks!

Dumping objects ->

{148} normal block at 0x003EBD90, 6 bytes long.

Data: < > 00 00 00 00 00 00

{61} client block at 0x003E3298, subtype c0, 64 bytes long.

a CDynLinkLibrary object at $003E3298, 64 bytes long

a CDynLinkLibrary object at $003E3298, 64 bytes long

Object dump complete.

這種現(xiàn)象一般是由于ACE庫和應(yīng)用程序的字符集不一致所造成的,ACE在VS2005項(xiàng)目選項(xiàng)中的字符集設(shè)置是“未設(shè)置”,可將其設(shè)成“使用Unicode字符集”(注:VS2005默認(rèn)的字符集設(shè)置是“使用Unicode字符集”)

(4)幾點(diǎn)說明:

1)ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER

應(yīng)用程序手動(dòng)創(chuàng)建ACE_Object_Manager,推薦的方式是在程序開始時(shí)調(diào)用ACE::init(),在結(jié)束時(shí)調(diào)用ACE::fini()。

2)若在文件中包括了config-win32.h之后加入以下語句

#undef ACE_HAS_NONSTATIC_OBJECT_MANAGER

說明應(yīng)用程序要使用靜態(tài)的對(duì)象管理器,ACE會(huì)為其創(chuàng)建,應(yīng)用程序無需手動(dòng)加入。

3)在Win32平臺(tái),ACE默認(rèn)使用非靜態(tài)的對(duì)象管理器,這個(gè)對(duì)象會(huì)被分配在main()函數(shù)的stack里;因main()函數(shù)已經(jīng)在MFC類庫里定義, 故ACE不能使用默認(rèn)的方法,可以按2)所說的使用靜態(tài)的對(duì)象管理器,或者按前面所說的自己定義ACE的初始化函數(shù)。

采用IOCP模式與ACE庫后,現(xiàn)有的機(jī)房環(huán)境監(jiān)控系統(tǒng)主站設(shè)備不需要新增昂貴的高性能服務(wù)器進(jìn)行大規(guī)模升級(jí)改造,可在現(xiàn)有硬件上通過軟件升級(jí),實(shí)現(xiàn)大量站點(diǎn)、大量通訊對(duì)象的接入。同時(shí)可節(jié)省大量的建設(shè)經(jīng)費(fèi)和人力物力投入。

大名县| 陕西省| 商南县| 新民市| 崇信县| 黑山县| 小金县| 芮城县| 栾川县| 晋城| 福州市| 广灵县| 奉化市| 安化县| 观塘区| 西峡县| 双峰县| 汝南县| 乳山市| 胶州市| 潍坊市| 宿迁市| 宁安市| 高邑县| 靖边县| 项城市| 巴彦淖尔市| 龙州县| 清新县| 岳西县| 台北市| 浠水县| 板桥市| 政和县| 大厂| 三门县| 桐梓县| 台湾省| 安吉县| 辽阳市| 育儿|