王 皓,王欣然,過其峰,李 宇,楊建旭
(1.南瑞集團公司 國網電力科學研究院,江蘇 南京 211106;2.安徽南瑞繼遠電網技術有限公司,安徽 合肥 230088)
一種基于共享內存的消息總線設計與實現
王 皓1,2,王欣然1,2,過其峰2,李 宇1,2,楊建旭1,2
(1.南瑞集團公司 國網電力科學研究院,江蘇 南京 211106;2.安徽南瑞繼遠電網技術有限公司,安徽 合肥 230088)
針對現代數據信息通信方式中管道通信和Socket通信存在易阻塞和效率低的問題,文中利用共享內存空間原理,開辟由FRAG碎片和Block組成的緩沖池,設計了基于共享內存的消息總線通信方式。實驗結果表明,該消息總線滿足了數據信息通信中數據信息傳遞快速高效的要求,并具有較強的自適應能力。
共享內存;消息總線;Block;FRAG碎片
管道通信即發(fā)送進程以字符流形式將大量數據送入管道,接收進程可從管道接收數據;Socket通信是網絡通信中的一種,這兩種通信方式是目前運用最普遍的兩種。但他們共存的問題就是易阻塞和效率低的問題,為此本文參考多方資料[1-6],嘗試將共享內存與消息總線相結合解決上述問題。
消息總線通信方式的問題在于網絡通信中不同機器緊密耦合、配置和引用混亂、服務調用關系錯綜復雜、難以統(tǒng)一管理、異構系統(tǒng)之間存在不兼容。本文將共享內存空間的原理結合起來,開辟了一塊由FRAG碎片和Block組成的緩沖池,提出了一種基于共享內存的消息總線設計。這種設計結果表明該通信方式可以避免消息總線本身的缺點,在通信成功率和通信延遲時間方面有較大改進,具有廣闊的應用前景。
數據信息通信關鍵在于傳遞數據信息,無論是管道通信、Socket通信還是消息總線通信方式[7]都要為了這一目的服務。本系統(tǒng)正是基于這一目標而實現同一臺主機系統(tǒng)內兩個進程通過消息總線子功能共享內存完成通信;不同主機系統(tǒng)內兩個進程通過消息總線子功能TCP、UDP實現通信;同時實現進程信息的注冊、進程發(fā)送和接收消息的接口設計;并且要克服管道、Socket通信中存在的易阻塞和傳輸效率低等問題,從而做到通信最優(yōu)化。
2.1 消息總線結構
消息總線結構如圖1所示。其中結構設計流程[8]首先根據目標主機名獲得相應的主機數量和編號;再創(chuàng)建消息,判斷是本機通信還是異機通信并根據消息類型選擇發(fā)送方式;接著將消息寫入進程接收鏈表;然后讀取進程接收鏈表;最后如果是異機通信則跟每個主機建立一個虛擬進程,通過TCP連接完成發(fā)送和接收消息。
圖1 消息總線結構圖
2.2 數據流向
圖2 本機數據流向圖
本機內兩個進程間的通信主要是將數據消息通過接收鏈表內存的轉存方式完成的。異機數據流向如圖3所示。
圖3 異機數據流向圖
如圖3所示,系統(tǒng)內異機間兩個進程主要通過消息總線子功能TCP、UDP方式來實現通信。
2.3 消息服務管理進程設計
消息服務管理進程的設計分為:(1)處理本機消息包括巡檢已注冊進程(需要處理消息的進程必須向消息總線[9]進行注冊)、本機進程間消息發(fā)送和接收;(2)異機間消息發(fā)送和接收線程(通過建立TCP實現);(3)異機間消息服務鏈路管理(通過UDP發(fā)送和處理廣播報文)。
2.4 接口設計
接口設計主要包括:注冊接口—通過類實例完成注冊,通過注冊使消息總線保存了該進程的ID;消息發(fā)送接口—標定發(fā)送類型、消息類型、目標進程、數據體、數據長度幾個主要參數;消息接收接口—標定消息頭和消息數據體兩個參數;消息訂閱接口—應用進程向消息管理進行訂閱,只接收特定的消息;消息取消訂閱接口—應用進程向消息管理進行訂閱取消,取消已注冊的接收消息類型。
柳紅不響。蘇秋琴說:“你擔心什么呢?白天明敢在城里找野女人,我就敢給他戴綠帽子;再說在城里你只要掰掰大腿就是錢,錢來得不要太容易呵。”
2.5 共享內存設計
為解決網絡通信時的消息易阻塞問題,本文在消息總線的共享內存設計中添加緩沖池設計。緩沖池[10]開辟了服務端10 MB和客戶端5 MB共享內存空間,并完成共享內存的操作指針指向特定內存塊及操作指針和信號量的對應,在創(chuàng)建時生成。共享內存的分配如圖4所示。
圖4 共享內存分配圖
再把緩沖池分為多個Block,大小為4 096 Byte,并給緩沖池指定一個起始地址,進而每個Block的起始地址已知。每個Block又分為11個不同種類的FRAG碎片,每種碎片的大小可分為2、4、…、2 048 Byte等類型,每個FRAG碎片的地址通過鏈表串聯起來,且第一個FRAG碎片的首地址指向該Block的起始地址,最后一個FRAG碎片[11]的尾地址指向空。Block中FRAG數據的寫入過程如圖5所示。
圖5 Block中FRAG數據寫入圖
每個Block里面初始化的FRAG碎片類型與存儲在該Block的第一個消息長度有關,如果一個種類FRAG的Block存儲已滿,則開辟下一個相應種類FRAG的Block,Block間按順序開辟,這里開辟重點是根據消息長度初始化特定FRAG類型的鏈表[12],同時將該FRAG的鏈表連接于已有FRAG鏈表中,即每種FRAG碎片只有一個雙向鏈表。
如果Block已利用完,則報錯提示緩沖池已沒有空間,新的消息不存儲進緩沖池。每個Block里的FARG消息被取走后,更新該Block下的鏈表,只更新鏈表的前后指針,同時更新下個消息寫入指針到鏈表下空FRAG里,如圖6所示。
封裝后的消息根據大小存儲在對應Block的FRAG里,對應的FRAG地址返回給對應進程下的rlist鏈表保存。發(fā)送的原始消息經過壓縮后再封裝成傳送的消息結構體,到接收端再解壓為原始消息。FRAG的消息有3種方式被更新,第一種是被讀?。坏诙N是超時(5 min內);第三種是進程退出,則進程下的rlist執(zhí)行的FRAG被更新。
圖6 Block內數據塊更新圖
該設計方案實現,主要包括消息總線初始化、進程消息管理模塊、進程管理模塊、消息服務廣播模塊(UDP的發(fā)送和接收線程)、消息服務TCP功能模塊(TCP的發(fā)送和接收線程)等模塊功能的設計實現。
3.1 初始化共享內存
初始化共享內存分為6步依次是先計算初始化內存長度,包括系統(tǒng)服務信息,管理多個主機信息,管理主機內多個進程信息;再根據指定長度初始化內存塊,返回對應內存ID;然后把內存ID映射到某一指針;接著創(chuàng)建內存操作向量;再次把內存內存塊信息分別映射到具體操作指針上;最后初始化消息服務參數內存信息和主機參數。
3.2 進程消息管理模塊
進程消息管理模塊實現依次分3步:
(1)進程注冊。包括初始化進程參數內存信息以及注冊本機進程名和ID;
(2)進程消息發(fā)送接口。先判斷傳入的參數是否正確有效;再根據源主機名和消息發(fā)送類型查找目標客戶端主機;然后根據傳入的發(fā)送類型、消息類型、目標進程、數據結構體等參數創(chuàng)建消息結構體;最后根據目標進程ID是否在本機,確定是發(fā)送本機對應的目標還是存儲到待網絡發(fā)送數據區(qū);
(3)進程消息接收接口。先檢查進程是否為當前進程且是否有可讀消息數;再讀取接收列表的最新值;最后把讀取過的消息刪除,同時接收列表移動到下一個。
3.3 進程管理模塊
實現進程管理需要創(chuàng)建兩個線程—偵測線程和任務調度:
(1)偵測線程模塊實現兩個功能分別是通過輪詢檢查注冊進程處理的信息是否在規(guī)定的時間內(1 min)被處理和通過系統(tǒng)函數檢查注冊進程是否在線。偵測線程模塊實現方式依次為先檢查進程是否在用;再判斷消息是否接收超時;最后5 s掃描一次,檢查進程是否存在,不存在重置進程參數,存在就不處理;
(2)任務調度模塊為輪詢發(fā)送的消息,判斷目標主機是否在本機。
任務調度模塊[13]實現方式有兩步:先輪詢主機列表信息;再判斷消息發(fā)送目的。再根據目的的不同分為3種調度方式:第一是根據消息類型是否為廣播類型,是的則歸為廣播消息,全系統(tǒng)內都發(fā);第二是判斷是否為本機進程,是本機進程則直接存儲到相應進程接收列表;第三是如果非本機目標進程則存儲到指定進程下的發(fā)送列表。
3.4 消息服務廣播模塊
消息服務廣播模塊的實現主要依靠創(chuàng)建兩個線程:接收線程實現接收心跳包和其它廣播報文,并存儲到本地消息接收區(qū);發(fā)送線程實現發(fā)送心跳包和其它廣播報文,如圖7所示。
圖7 消息服務廣播
3.5 消息服務TCP模塊
異機通信中用到的TCP模塊[14]實現也需要創(chuàng)建接收線程和發(fā)送調度兩個線程,接收線程實現接收消息,并存儲到本地消息接收區(qū);發(fā)送線程實現發(fā)送消息;監(jiān)聽線程為TCP服務端實現監(jiān)聽連接。如圖8所示。
圖8 消息服務TCP模塊
為更好的體現這種基于共享內存的消息總線通信方式的在效率和阻塞問題上的優(yōu)越性,本文應用MFC框架編寫了消息總線測試程序,如圖9所示。上面的DOS界面是消息總線程序,下面兩個MFC程序依次是測試發(fā)送進程和測試接收進程。
圖9 消息總線測試程序收發(fā)進程
分別在無壓力和有壓力的測試環(huán)境下對消息總線進行了1 000次實驗,記錄3種通信方式在相同條件下的通信成功次數和平均延遲時間,數據如表1和表2所示。
表1 無壓力環(huán)境3種通信方式對比
表2 有壓力環(huán)境3種通信方式對比
如表1所示,在無壓力測試環(huán)境下,消息總線通信方式的通信成功率達到了98.5%高于其余兩種通信方式,并且平均延遲時間只有121 ms也是三者中最低的;如表2所示,在有壓力測試環(huán)境下,3種測試方式的通信成功次數都有下降但消息總線通信方式的通信成功率97.7%依然是最高的,且其余兩種通信方式的平均延遲時間也比消息總線通信方式的146 ms要多。綜上所述,在傳輸效率和速度兩方面消息總線通信方式較其他兩種通信方式具有優(yōu)越性,且消息總線對通信異常的處理更高效、更安全,具有較強的自適應性。
本文針對管道、Socket通信方式具有易阻塞、效率低及安全性差等缺點,將共享內存與消息總線結合起來,開辟了由FRAG碎片和Block組成的緩沖池,設計了基于共享內存的消息總線通信方式,利用共享內存可以解決消息總線不同機器之間緊密耦合、配置和引用混亂、服務調用關系錯綜復雜、難以統(tǒng)一管理、異構系統(tǒng)之間存在不兼容的問題,實現了總線則作為中樞系統(tǒng),提供了統(tǒng)一的服務入口,滿足了信息通信中數據信息傳遞快速高效的要求。并且編寫測試程序對消息總線進行測試,通過結果表明該消息總線在信息傳輸的高效性問題上要高于另外兩種通信方式,同時傳輸方式也具有較強的自適應能力,市場應用前景廣闊。
[1] Noh D H, Kim D S. Message scheduling on CAN bus for large-scaled ship engine systems[J].IFAC Proceedings Volumes,2014(3):473-479.
[2] Sridi M, Raffin B, Faucher V. Cache aware dynamics data layout for efficient shared memory parallelisation of EUROPLEXUS [J]. Procedia Computer Science, 2016, 80(2):1083-1092.
[3] 王健,丁學明,董新燕.基于量子策略的布谷鳥搜索算法研究[J].電子科技,2015,28(12):40-44.
[4] 高念高,顧國強.一種多源異構電子政務系統(tǒng)整合模型[J].計算機應用與軟件,2013(10):96-98.
[5] 劉虎球,趙鵬.一種多核間內存公平調度模型[J].計算機學報,2013(11):2191-2199.
[6] 苗乾坤.面向共享存儲系統(tǒng)的計算模型及性能優(yōu)化[D].合肥:中國科學技術大學,2012.
[7] 王見強.基于Web的風電SCADA系統(tǒng)數據服務的研究與實現[D].南京:東南大學,2015.
[8] Chen Licheng,Chen Mingyu,Yuan Ruan,et al.MIMS:towards a message interface based memory system[J].Journal of Computer Science and Technology,2014(7):292-297.
[9] Anonymous.Mission services evol-ution center message bus[J].NASA Technology Briefs,2011(8):351-358.
[10] 王伯天.基于ACE框架的并發(fā)消息總線的研究與設計[D]. 北京:北京郵電大學,2012.
[11] 余翔湛,殷麗華.動態(tài)共享內存緩沖池技術[J].哈爾濱工業(yè)大學學報,2014(3):380-383.
[12] 李小龍,孟李林,邵瑞瑞,等.基于FPGA的PCI Express應用平臺設計[J].電子科技,2014,27(12):108-111.
[13] 蘇勇,曹政,劉飛龍,等.一種低開銷的面向節(jié)點內互連的網絡接口控制器[J].計算機學報,2015(5):909-922.
[14] 崔登士.基于ACE框架的并發(fā)消息總線服務器子系統(tǒng)研究與實現[D].武漢:華中科技大學,2014.
[15] 辛利斌,張振國,王順平,等.自動指紋識別系統(tǒng)算法的優(yōu)化改良[J].電子科技,2016,29(6):41-43.
Design and Implementation of A Kind of Message Bus Based on Shared Memory
WANG Hao1,2,WANG Xinran1,2,GUO Qifeng2, LI Yu1,2, YANG Jianxu1,2
(1.NARI Group Corporation, Nanjing 210003,China;2.Anhui NARI Jiyuan Electric Co, Ltd,Hefei 230088,China)
Among current data communication modes, pipeline communication and socket communication are easy to be blocked. What’s worse, their efficiency are low. In this regard, according to the principle of shared memory, this paper develops a buffer pool consisted of fragments and blocks and designs a message bus communication mode based on shared memory. The design result indicates that the message bus faciliates quick and efficient data transfer in data communication and has strong self-adaptability.
shared memory;message bus;Block;FRAG fragment
2016- 11- 14
王皓(1970-),男,正高級工程師。研究方向:電力系統(tǒng)調度自動化以及繼電保護。王欣然(1986-),男,經濟師。研究方向:電力新技術應用。
10.16180/j.cnki.issn1007-7820.2017.09.026
TN915;TP311.1
A
1007-7820(2017)09-093-04