張旭彤
摘要:該文論述了一種實施高效的共享內(nèi)存技術(shù),它可用于高速磁浮交通仿真中仿真計算機或者仿真服務(wù)器內(nèi)部的多進程通信管理和信息傳輸,并且能夠滿足磁浮仿真環(huán)境中三層硬件架構(gòu)(頂層工作站、中間層服務(wù)器、底層管理計算機)之間的網(wǎng)絡(luò)通信要求,以完成對磁浮功能軟件的測試與驗證。在統(tǒng)一的報文格式下,該共享內(nèi)存技術(shù)使用配置文件記錄通信節(jié)點的起始端口和IP地址等信息,確保了通信進程的獨立性和實時性。此外,選取共享內(nèi)存技術(shù)以實現(xiàn)仿真環(huán)境中應(yīng)用層和通信層之間的數(shù)據(jù)傳輸,提高仿真環(huán)境處理數(shù)據(jù)的效率,確保高速磁浮交通仿真的傳輸性能。
關(guān)鍵詞:多進程通信;共享內(nèi)存技術(shù);高速磁浮交通仿真;網(wǎng)絡(luò)通信
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1009-3044(2016)26-0248-02
1研究背景
為了實現(xiàn)高速磁浮交通仿真中仿真計算機或仿真服務(wù)器內(nèi)部的信息傳輸或者數(shù)據(jù)傳輸,以完成對本機所運行的磁浮功能軟件進行環(huán)境故障注入條件下的系統(tǒng)功能和性能的測試與驗證,需要使用一種可在多進程之間切換的高效通信技術(shù)。高速磁浮仿真的硬件架構(gòu)分為三層:底層是子系統(tǒng)仿真管理計算機,中間層是仿真支撐服務(wù)器,頂層是工作站仿真計算機。由于仿真環(huán)境通過以太網(wǎng)相連,網(wǎng)絡(luò)中的每一臺機器不僅作為一個通信節(jié)點與網(wǎng)絡(luò)進行信息傳輸,而且需要與多種類的磁浮功能軟件進行數(shù)據(jù)交互。共享內(nèi)存技術(shù)作為最高效的本機進程間通信技術(shù),可以快速地將內(nèi)存中的數(shù)據(jù)映射到多個不同的進程中。因此,在磁浮交通仿真環(huán)境中使用共享內(nèi)存技術(shù),不僅可以實現(xiàn)仿真計算機內(nèi)部的多進程通信,還可以提高仿真環(huán)境處理數(shù)據(jù)的效率,減少信息傳遞或者故障注入的響應(yīng)時間,確保高速磁浮交通仿真的傳輸性能。
2 影響因素分析
由于高速磁浮交通仿真的功能特性與通信要求,數(shù)據(jù)傳輸?shù)母咝院蛯崟r性是通信時的重中之重。而且仿真環(huán)境中各個節(jié)點的端口信息、數(shù)量、IP地址等需要根據(jù)通信需求進行改變,因此通過對仿真環(huán)境中通信節(jié)點的信息傳輸要求分析,可以得到數(shù)據(jù)通信需具有以下特點:
1) 高速磁浮交通仿真環(huán)境中的數(shù)據(jù)傳輸是大批量、高頻率的,具體的要求要視仿真設(shè)備終端采集數(shù)據(jù)的頻率和請求發(fā)送的頻率而定;
2) 數(shù)據(jù)傳輸要具有實時性,將仿真設(shè)備采集的數(shù)據(jù)實時傳給網(wǎng)絡(luò)中的通信層,并且對異?;蛘哧惻f數(shù)據(jù)進行清除;
3) 仿真環(huán)境中磁浮計算機與通信節(jié)點采用“一對多”的關(guān)系;
4) 通信節(jié)點的端口信息、地址等可能改變,需要手動配置通信節(jié)點的信息;
5) 為了維護磁浮仿真環(huán)境的可擴展性,通信節(jié)點可能發(fā)生增加或刪除的情況,需要對通信節(jié)點做增刪操作。
3 方案設(shè)計
在高速磁浮交通仿真環(huán)境中,每一臺計算機中的軟件架構(gòu)分為通信層與應(yīng)用層。通信層進程主要負責(zé)為應(yīng)用層和其他通信節(jié)點提供通信服務(wù),并且監(jiān)控網(wǎng)絡(luò)中的通信狀態(tài),定時記錄通信日志等;應(yīng)用層進程即為環(huán)境中各個磁浮模塊運行的磁浮功能軟件,與用戶及通信層進程進行交互。為了確保高速磁浮交通仿真的傳輸性能,本機間進程通過共享內(nèi)存方式進行通信,并且同時為通信層與應(yīng)用層提供可讀寫的共享內(nèi)存接口,將共享內(nèi)存技術(shù)封裝為DLL動態(tài)鏈接庫的方式分別提供給通信層與應(yīng)用層以完成進程間的交互。其次,使用Windows系統(tǒng)的Initialization File(.ini文件)對可變化的通信節(jié)點進行配置和管理。
3.1 共享內(nèi)存技術(shù)
高速磁浮交通仿真的共享內(nèi)存技術(shù)采用一種“主—從式”的技術(shù)架構(gòu)。在高速磁浮交通仿真計算機中,共享內(nèi)存同時提供給計算機中的通信層和應(yīng)用層,由通信層進行統(tǒng)一地新建和管理,應(yīng)用層只能發(fā)送請求以獲得對共享內(nèi)存的讀寫權(quán)限。共享內(nèi)存技術(shù)主要是通過內(nèi)存映射文件的方式進行工作,內(nèi)存映射文件通過將文件內(nèi)容復(fù)制給虛擬地址空間,通過互斥鎖管理內(nèi)存的讀寫情況,完成多進程之間的通信。當(dāng)內(nèi)存映射文件被創(chuàng)建后,需要通信的線程分別將此對象載入自己的地址空間。此過程完成后,對此塊內(nèi)存的讀寫會實時的反映到另一個使用此共享內(nèi)存的進程中。
共享內(nèi)存技術(shù)以DLL動態(tài)鏈接庫中函數(shù)的形式提供給通信層與應(yīng)用層。載入動態(tài)鏈接庫文件并成功調(diào)用相應(yīng)的初始化函數(shù)之后,進程便有了對相應(yīng)共享內(nèi)存的讀寫權(quán)限。當(dāng)有報文到達時,進程將報文傳給對應(yīng)的共享內(nèi)存塊(從對應(yīng)的共享內(nèi)存塊中取出)。在每一個共享內(nèi)存塊中,使用互斥鎖Mutex控制一個進程內(nèi)多個線程對其的使用權(quán)。當(dāng)某一個線程對共享內(nèi)存塊進行讀(寫)操作時,將Mutex置為鎖狀態(tài),使其他調(diào)用相同共享內(nèi)存塊的線程置為阻塞狀態(tài),直到該讀(寫)操作結(jié)束并且Mutex為解鎖狀態(tài),再將內(nèi)存塊的使用權(quán)交給其他線程。在每一個共享內(nèi)存塊中,使用事件Event實現(xiàn)共享內(nèi)存的讀寫同步機制。當(dāng)某一個“寫入”共享內(nèi)存塊的Mutex為解鎖狀態(tài)并且內(nèi)存內(nèi)容為空時,則將SetEvent()函數(shù)置為掛起狀態(tài),等待線程的調(diào)用以及寫操作的信號。當(dāng)某一個“讀出”共享內(nèi)存塊的Mutex為解鎖狀態(tài)并且內(nèi)存內(nèi)容不為空時,無需線程調(diào)用自動將SetEvent()函數(shù)置為發(fā)信號狀態(tài)以進行讀操作。直到線程讀取完畢,解除發(fā)信號狀態(tài)以實現(xiàn)讀寫同步機制。通過實現(xiàn)共享內(nèi)存的讀寫同步機制,可以大大提高進程通信的實時性以保證磁浮仿真環(huán)境的傳輸效率。
3.2 共享內(nèi)存代理
在高速磁浮仿真環(huán)境中,由于通信節(jié)點的數(shù)量較多并且具有不確定性,對建立的大量共享內(nèi)存塊進行查找會降低進程通信的傳輸效率,進程可能會花費大量的時間查找對應(yīng)的共享內(nèi)存塊,即使該共享內(nèi)存塊可能早以銷毀。因此在建立一組共享內(nèi)存塊的基礎(chǔ)上,此共享內(nèi)存技術(shù)同時建立一個共享內(nèi)存代理Container。
共享內(nèi)存代理Container將所有的共享內(nèi)存塊組成一個Map,并且以窗口的形式存儲。共享內(nèi)存代理存儲共享內(nèi)存塊的數(shù)量、網(wǎng)絡(luò)狀態(tài)和地址指針等信息。進程只需提供通信節(jié)點名稱以及收發(fā)地址即可調(diào)用共享內(nèi)存代理,使用對應(yīng)的共享內(nèi)存塊進行通信。同時共享內(nèi)存代理使用3.1中的互斥體Mutex控制多進程對共享內(nèi)存塊的讀寫操作。共享內(nèi)存代理使用事件Event維護共享內(nèi)存塊的網(wǎng)絡(luò)狀態(tài),當(dāng)Mutex為鎖狀態(tài)時,代理向特定的共享內(nèi)存塊發(fā)送Event信號,將共享內(nèi)存塊置為“讀(寫)”狀態(tài)或者返回共享內(nèi)存塊不存在或錯誤信號給進程。
此外,共享內(nèi)存塊在建立的時候需要存儲名稱、ip地址、是否記錄日志等各種各樣的信息,但是共享內(nèi)存代理只存儲內(nèi)存塊的指針信息、是否可以讀寫的狀態(tài)等少量信息。所以進程只需要提供少量的信息就可以調(diào)用共享內(nèi)存代理,讓代理去處理讀寫的問題,進程只需等待反饋即可。因此,使用共享內(nèi)存代理解決了查找大量共享內(nèi)存塊所帶來的效率降低問題,加快了進程讀寫的速度。
3.3 配置文件
共享內(nèi)存使用Windows系統(tǒng)的Initialization File(.ini文件)對通信節(jié)點的端口信息、端口數(shù)量、起始地址、IP地址等其他信息進行配置和管理。由于高速磁浮交通仿真使用P2P通信協(xié)議作為通信架構(gòu),因此每一臺仿真計算機都擁有多個不同功能的通信節(jié)點。共享內(nèi)存通過讀取.ini文件中通信節(jié)點信息,使用CreateFileMapping()創(chuàng)建文件映射,新建出通信結(jié)點數(shù)量的兩倍的共享內(nèi)存塊。通過讀取通信節(jié)點的名稱,為每一個通信節(jié)點分配一個“讀出”共享內(nèi)存塊和一個“寫入”共享內(nèi)存塊,并且每一個共享內(nèi)存塊使用MapViewOfFile()或MapViewOfFileEx()函數(shù),將文件映射到調(diào)用的進程地址空間中。用戶只需要修改文本信息即可達到增刪改共享內(nèi)存的效果,以此提高了共享內(nèi)存技術(shù)的高效性。
4 實驗結(jié)果
根據(jù)共享內(nèi)存的設(shè)計方案,編寫對應(yīng)的.ini配置文件,將共享內(nèi)存技術(shù)封裝為DLL文件提供給通信層和應(yīng)用層之后,在傳輸速率為100Mbps的局域網(wǎng)中進行測試驗證,得到結(jié)果如下表:
5 結(jié)束語
文中論述的共享內(nèi)存技術(shù)確保了高速磁浮交通仿真環(huán)境可以實時高效的進行進程間通信,實現(xiàn)了頂層工作站、中層服務(wù)器與底層管理計算機之間的進程交互要求,并且在傳輸大量數(shù)據(jù)的前提下,確保了數(shù)據(jù)傳輸?shù)乃俣扰c效率。同時通信層與應(yīng)用層完全互相獨立,通信節(jié)點可根據(jù)用戶需求靈活配置,極大地增加了該共享內(nèi)存技術(shù)的可擴展性,為今后的磁浮仿真環(huán)境的通信需求調(diào)整、通信節(jié)點增刪提供了良好的基礎(chǔ)。并且該共享內(nèi)存技術(shù)不僅適用于此磁浮仿真環(huán)境中,還可應(yīng)用于類似的交通局域網(wǎng)的網(wǎng)絡(luò)通信中。
參考文獻:
[1] Ivar Jacobson, Martin Griss, Patrik Jonsson. Software Reuse—Architecture, Process and Organization for Business Success[M]. Addison Wesley Longman, 1997.
[2] 汪翔, 袁輝. Visual C++實踐與提高(網(wǎng)絡(luò)編程篇) [M]. 北京: 中國鐵道出版社, 2001.
[3] 余可曼, 陳平, 金連甫. 網(wǎng)絡(luò)通信中間件的設(shè)計及實現(xiàn)[J]. 計算機工程, 2001, 27(5).
[4] Gary B Shelly, Thomas J Cashman, Harry J Rosenblatt.系統(tǒng)分析與設(shè)計教程[M]. 李芳, 朱群雄, 陳軼群, 等,譯.北京: 機械工業(yè)出版社, 2004.
[5] 梁庚, 白焰. Windows下進程間通信方式探討[J]. 微型電腦應(yīng)用, 2006, 22(12).
[6] 馬魁濤, 蔡穎, 郭寶峰. Win32進程間信息共享的實現(xiàn)方法研究[J]. 計算機應(yīng)用與軟件, 2007, 23(12).
[7] 周偉明. 多核計算與程序設(shè)計[M]. 武漢: 華中科技大學(xué)出版社, 2009.