【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換

【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換

ID:37726548

大小:24.50 KB

頁數(shù):4頁

時間:2019-05-29

【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換_第1頁
【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換_第2頁
【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換_第3頁
【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換_第4頁
資源描述:

《【系統(tǒng)架構(gòu)設計師】共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫

1、共享內(nèi)存實現(xiàn)進程間大數(shù)據(jù)的交換  引言  進程間的數(shù)據(jù)交換和共享是一種非常重要和實用的技術(shù)。大、中型軟件的開發(fā)設計多是由眾多程序設計人員的合作完成,通常一個程序設計人員只負責其中一個或幾個模塊的開發(fā),這些模塊可以是動態(tài)鏈接庫也可以是應用程序或是其他形式的程序組件。這些獨立開發(fā)出來的程序模塊最終需要作為一個整體來運行,即組成一個系統(tǒng),在系統(tǒng)運行期間這些模塊往往需要頻繁地進行數(shù)據(jù)交換和數(shù)據(jù)共享,對于動態(tài)鏈接庫同其主調(diào)應用程序之間的數(shù)據(jù)交換是非常容易實現(xiàn)的,但是在兩個應用程序之間或是動態(tài)鏈接庫同其主調(diào)應用程序之外的其他應用

2、程序進行數(shù)據(jù)交換就比較困難了。尤其是在交換數(shù)據(jù)量過大、交換過于頻繁的情況下更是難以實現(xiàn),本文即對此展開討論,并提出了一種通過共享內(nèi)存來實現(xiàn)進程見大數(shù)據(jù)量快速交換的一種方法?! ⊥ㄓ嵎绞降谋容^和選擇  進程間通訊的方式有很多,常用的有共享內(nèi)存、命名管道和匿名管道、發(fā)送消息等幾種方法來直接完成,另外還可以通過socket口、配置文件和注冊表等來間接實現(xiàn)進程間數(shù)據(jù)通訊任務。以上這幾種方法各有優(yōu)缺點,具體到在進程間進行大數(shù)據(jù)量數(shù)據(jù)的快速交換問題上,則可以排除使用配置文件和注冊表的方法;另外,由于管道和socket套接字的使用

3、需要有網(wǎng)卡的支持,因此也可以不予考慮。這樣,可供選擇的通訊方式只剩下共享內(nèi)存和發(fā)送消息兩種。由于數(shù)據(jù)量比較大,這樣在使用消息進行通訊時就無法通過消息參數(shù)將數(shù)據(jù)直接攜帶到接收方,只能以地址傳送的方式進行。當一個應用程序向另一個應用程序發(fā)送數(shù)據(jù)時將會發(fā)出WM_COPYDATA系統(tǒng)消息,因此可以考慮通過向消息隊列插入WM_COPYDATA消息的方法來實現(xiàn)數(shù)據(jù)在進程間的拷貝?! ≡谑褂肳M_COPYDATA消息時,由第一個消息參數(shù)指定發(fā)送窗口的句柄,第二個消息參數(shù)則為一同數(shù)據(jù)相關(guān)的數(shù)據(jù)結(jié)構(gòu)COPYDATASTRUCT的指針,

4、此結(jié)構(gòu)原形聲明如下:  typedefstructtagCOPYDATASTRUCT{  DWORDdwData;  DWORDcbData;  PVOIDlpData;  }COPYDATASTRUCT;  其中,只需將待發(fā)送數(shù)據(jù)的首地址賦予lpData、并由cbData指明數(shù)據(jù)塊長度即可。消息發(fā)出后,接收方程序在WM_COPYDATA消息的響應函數(shù)中通過隨消息傳遞進來的第二個參數(shù)完成對數(shù)據(jù)塊的接收。但是在使用WM_COPYDATA消息時,只能用SendMessage()函數(shù)發(fā)送而不能使用PostMessage()

5、,這兩個函數(shù)雖然功能非常相似都是負責向指定的窗口發(fā)送消息,但是SendMessage()函數(shù)發(fā)出消息后不是馬上返回,而是在接收方的消息響應函數(shù)處理完之后才能返回,并能夠得到返回結(jié)果。在此期間發(fā)送方程序?qū)⒈蛔枞琒endMessage()后面的語句不能被繼續(xù)執(zhí)行。而PostMessage()函數(shù)在發(fā)出消息后馬上返回,其后語句能夠被立即執(zhí)行,但是無法獲取消息的執(zhí)行結(jié)果??梢姡诮粨Q數(shù)據(jù)量較大的情況下實現(xiàn)數(shù)據(jù)頻繁而又快速的交換用發(fā)送WM_COPYDATA消息的方法也是不合適的,當數(shù)據(jù)傳輸過于頻繁時將有可能導致數(shù)據(jù)的丟失?!?/p>

6、 比之以上幾種進程間通訊方法,共享內(nèi)存有著明顯的優(yōu)勢。共享內(nèi)存是通過直接操作內(nèi)存映射文件來進行的,而內(nèi)存映射文件又是進行單機數(shù)據(jù)共享的最低層機制,前面幾種數(shù)據(jù)交換方式在低層都是通過內(nèi)存映射文件來進行的。因此使用共享內(nèi)存可以以較小的開銷獲取較高的性能,是進行大數(shù)據(jù)量數(shù)據(jù)快速交換的最佳方案?! 」蚕韮?nèi)存的使用  在Windows操作系統(tǒng)下,任何一個進程不允許讀取、寫入或是修改另一個進程的數(shù)據(jù)(包括變量、對象和內(nèi)存分配等),但是在某個進程內(nèi)創(chuàng)建的文件映射對象的視圖卻能夠為多個其他進程所映射,這些進程共享的是物理存儲器的同一

7、個頁面。因此,當一個進程將數(shù)據(jù)寫入此共享文件映射對象的視圖時,其他進程可以立即獲取數(shù)據(jù)變更情況。為了進一步提高數(shù)據(jù)交換的速度,還可以采用由系統(tǒng)頁文件支持的內(nèi)存映射文件而直接在內(nèi)存區(qū)域使用,顯然這種共享內(nèi)存的方式是完全可以滿足在進程間進行大數(shù)據(jù)量數(shù)據(jù)快速傳輸任務要求的。下面給出在兩個相互獨立的進程間通過文件映射對象來分配和訪問同一個共享內(nèi)存塊的應用實例。在本例中,由發(fā)送方程序負責向接收方程序發(fā)送數(shù)據(jù),文件映射對象由發(fā)送方創(chuàng)建和關(guān)閉,并且指定一個唯一的名字供接收程序使用。接收方程序直接通過這個唯一指定的名字打開此文件映射

8、對象,并完成對數(shù)據(jù)的接收。  在發(fā)送方程序中,首先通過CreateFileMapping()函數(shù)創(chuàng)建一個內(nèi)存映射文件對象,如果創(chuàng)建成功則通過MapViewOfFile()函數(shù)將此文件映射對象的視圖映射進地址空間,同時得到此映射視圖的首址??梢姡蚕韮?nèi)存的創(chuàng)建主要是通過這兩個函數(shù)完成的。這兩個函數(shù)原形聲明如下:  HANDLECreateFile

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。