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

?

基于橋接模式的多平臺共享內(nèi)存管理的設(shè)計與實現(xiàn)

2012-12-31 00:00:00唐燕韓愛慶
電腦知識與技術(shù) 2012年31期

摘要:在多平臺操作系統(tǒng)下,共享內(nèi)存的實現(xiàn)存在一些差異,在程序設(shè)計中通常依靠條件編譯來實現(xiàn),導(dǎo)致軟件耦合性太強,不利于擴充。該文結(jié)合設(shè)計模式中的橋接模式,提出了一種支持多操作系統(tǒng)平臺的共享內(nèi)存程序設(shè)計方案改進的新方法。

關(guān)鍵詞:多平臺;共享內(nèi)存;橋接模式

中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2012)31-7592-05

在實時控制系統(tǒng)中,大部分系統(tǒng)都要求支持多種操作系統(tǒng)平臺,并且經(jīng)常要進行大量的數(shù)據(jù)交換和共享。進程間的數(shù)據(jù)交換和共享可以采用共享內(nèi)存、管道、發(fā)送消息等幾種方法來直接完成,在這些方法中,共享內(nèi)存能夠很好的實現(xiàn)進程間大容量數(shù)據(jù)的快速交換。在不同操作系統(tǒng)下,共享內(nèi)存的實現(xiàn)存在一些差異,因此,在軟件設(shè)計中經(jīng)常需要判別操作系統(tǒng)的類型,分情況進行實現(xiàn),這樣極大地降低了軟件的可擴充性和實現(xiàn)細節(jié)對客戶的透明性。本文旨在結(jié)合設(shè)計模式中的Bridge模式,提出了一種多操作系統(tǒng)平臺下,共享內(nèi)存模塊的設(shè)計和實現(xiàn)方法。

1 Bridge模式

Bridge模式的用意是將抽象部分與實現(xiàn)部分分離,使它們都可以獨立的變化。主要適用于以下情況:在類的抽象和它的實現(xiàn)部分之間可以劃分開,相互獨立,還能動態(tài)結(jié)合;類的抽象以及它的實現(xiàn)都應(yīng)該可以通過生成子類的方法加以擴充。結(jié)構(gòu)圖如圖1所示。

2 各平臺共享內(nèi)存的實現(xiàn)

共享內(nèi)存(Shared Memory)是一種在Windows平臺或者Unix平臺下多個進程之間通訊的常用方法??捎糜谕粋€程序中多個進程之間通訊,也可以用于不同程序之間的信息傳遞。

2.1 Windows平臺下,共享內(nèi)存的實現(xiàn)

在Windows操作系統(tǒng)中,任何一個進程不允許讀取、寫入或是修改另一個進程的數(shù)據(jù),但是在某個進程內(nèi)創(chuàng)建的文件映射對象的視圖卻能夠為多個其他進程所映射,這些進程共享的是物理存儲器的同一個頁面。因此,當(dāng)一個進程將數(shù)據(jù)寫入此共享文件映射對象的視圖時,其他進程可以立即獲取數(shù)據(jù)變更情況。為了進一步提高數(shù)據(jù)交換的速度,還可以采用由系統(tǒng)頁文件支持的內(nèi)存映射文件而直接在內(nèi)存區(qū)域使用,顯然這種共享內(nèi)存的方式是完全可以滿足在進程間進行大數(shù)據(jù)量數(shù)據(jù)快速傳輸任務(wù)要求的。

具體步驟如下:

在發(fā)送進程中調(diào)用內(nèi)存映射API函數(shù)CreateFileMapping創(chuàng)建一個有名字標(biāo)識的共享內(nèi)存;函數(shù)CreateFileMapping原型如下所示:

HANDLE CreateFileMapping(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORDflProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName?。?;

如果多個進程都要對同一共享內(nèi)存進行寫訪問,則必須保持相互間同步。映射文件還可以指定PAGE_WRITECOPY標(biāo)志,可以保證其原始數(shù)據(jù)不會遭到破壞,同時允許其他進程在必要時自由的操作數(shù)據(jù)的拷貝。

在創(chuàng)建文件映射對象后,發(fā)送端進程調(diào)用MapViewOfFile函數(shù)映射到本進程的地址空間內(nèi);

接收端進程訪問共享內(nèi)存對象,需要通過內(nèi)存對象名調(diào)用OpenFileMapping函數(shù),以獲得共享內(nèi)存對象的句柄。然后調(diào)用MapViewOfFile函數(shù)來映射對象視圖。用戶可以使用該對象視圖來進行數(shù)據(jù)讀寫操作,以達到數(shù)據(jù)通訊的目的;

當(dāng)用戶進程結(jié)束使用共享內(nèi)存后,調(diào)用UnmapViewOfFile函數(shù)以取消其地址空間內(nèi)的視圖。

2.2 Unix平臺下,共享內(nèi)存的實現(xiàn)

在發(fā)送端進程中創(chuàng)建一塊共享內(nèi)存,并設(shè)置共享內(nèi)存的大小。

在創(chuàng)建文件映射對象后,發(fā)送端進程將這塊共享內(nèi)存區(qū)映射到本進程的地址空間內(nèi);

接收端進程訪問共享內(nèi)存對象,步驟同發(fā)送端。

當(dāng)用戶進程結(jié)束使用共享內(nèi)存后,調(diào)用函數(shù)取消其地址空間內(nèi)的視圖。

3 多平臺下,共享內(nèi)存的傳統(tǒng)實現(xiàn)方法

傳統(tǒng)方式下,多平臺共享內(nèi)存的實現(xiàn)主要依靠條件編譯。同一段函數(shù)的實現(xiàn)過程中,針對不同的平臺,要通過條件編譯來實現(xiàn)。也就是說,在實現(xiàn)共享內(nèi)存的類CSharedMemory中,每一個函數(shù)的具體實現(xiàn),都要使用條件編譯來區(qū)分到底是哪一個平臺。這種情況下,如果要修改某一平臺的程序,會影響其他平臺程序的運行。

下面是CShareMemory類的頭文件Sharedmemory.h:

從以上類CShareMemory的定義及實現(xiàn)過程可以看出,兩種平臺的共享內(nèi)存通過條件編譯來實現(xiàn),會有很多弊端。比如,修改某一種平臺的程序,使得另一種平臺也不能正常運行,耦合性太強。另外,如果系統(tǒng)要擴充到一種新的平臺運行,會嚴(yán)重影響當(dāng)前的系統(tǒng)運行,可擴展性很差。

4 用橋接模式對實現(xiàn)過程進行改進

利用橋接模式,將類的抽象和實現(xiàn)分開,共享內(nèi)存模塊的主要類的設(shè)計如圖2所示。

改進后,抽象類CShareMemory為應(yīng)用程序提供了共享內(nèi)存具有的一些接口,同時,維護指向CShareMemoryImp類對象的一個指針;CShareMemory定義了實現(xiàn)類的接口;CWinShareMemory是共享內(nèi)存在Windows平臺下的具體實現(xiàn)類;CUnixShareMemory是共享內(nèi)存在Unix平臺下的具體實現(xiàn)類。

改進后類的定義如下:

5 改進后的優(yōu)點

系統(tǒng)改進后主要的優(yōu)點有以下兩點:

極大地提高了程序的可擴充性。如果還有需要將系統(tǒng)移植到新的平臺,只需要再加入新平臺的實現(xiàn)類即可,而模塊對上層提供的接口不需要任何改變,已經(jīng)存在的系統(tǒng)也不會受到影響,大大降低了耦合性。

將接口部分和實現(xiàn)部分分離,分層設(shè)計,可以產(chǎn)生較好的程序結(jié)構(gòu)。對于模塊的調(diào)用者,只需提供接口類即可;對于具體不同平臺的實現(xiàn),對于調(diào)用者完全是透明的。

6 結(jié)束語

本文對實時控制系統(tǒng)中常用的共享內(nèi)存設(shè)計方案進行改進,在多平臺下,使用橋接模式設(shè)計和實現(xiàn)共享內(nèi)存。通過實時系統(tǒng)開發(fā)中實際應(yīng)用,效果非常好,優(yōu)點很明顯,值得參考。

參考文獻:

[1] Gamma E, Helm R, Johnson R,et al.設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英軍,馬曉星,蔡敏,等,譯.北京:機械工業(yè)出版社,2000.

[2] 陳傳波,黎蘭,宋荊漢.基于Unix共享內(nèi)存的實時信息發(fā)送模型[J].計算機工程與科學(xué),2005(8):78-80.

[3] 張中軍,張忠英.在VC++6.0下利用共享內(nèi)存、消息實現(xiàn)內(nèi)部進程通訊[J].電腦編程技巧與維護,2004(5):49-52.

[4] 陳亮.一種基于橋接模式的軟件設(shè)計方法和實例分析[J].軟件導(dǎo)刊,2010(7):104-106.

斗六市| 漠河县| 陇川县| 酒泉市| 萨嘎县| 紫金县| 衡山县| 棋牌| 随州市| 凌源市| 四川省| 辽宁省| 威远县| 宜兰市| 常德市| 新疆| 昔阳县| 泗水县| 肇庆市| 南华县| 陇川县| 色达县| 德庆县| 辽宁省| 博客| 海口市| 攀枝花市| 蒙山县| 双江| 广东省| 高尔夫| 即墨市| 乌拉特中旗| 达拉特旗| 昭通市| 晋州市| 无为县| 莱阳市| 莲花县| 德化县| 磐石市|