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