專利名稱:一種進(jìn)程通信方法和裝置的制作方法
技術(shù)領(lǐng)域:
本申請涉及通信技術(shù)領(lǐng)域,特別是涉及一種進(jìn)程通信方法和裝置。
背景技術(shù):
目前隨著時代的發(fā)展,單進(jìn)程程序在很多場合已不能滿足人們的需求。如何編寫 多進(jìn)程程序已成為現(xiàn)代程序設(shè)計技術(shù)的重點。在多進(jìn)程程序中,數(shù)據(jù)的交互和共享是不可 避免的。例如,某些瀏覽器支持多進(jìn)程模式,頁面A、頁面B不在同一個進(jìn)程運行,而需要經(jīng) 常在它們之間進(jìn)行數(shù)據(jù)共享。Microsoft Win32API提供了多種進(jìn)程通信的方式,如共享內(nèi)存方式、剪貼板方式 等。參照圖1,示出了現(xiàn)有技術(shù)一種共享內(nèi)存方式的進(jìn)程通信方法的流程示意圖,其中,進(jìn)程 A和進(jìn)程B使用同一共享內(nèi)存區(qū),進(jìn)程A發(fā)送數(shù)據(jù)1到共享內(nèi)存區(qū)中去,并通知進(jìn)程B去接 收,此時進(jìn)程B可能正忙于其他事務(wù),而沒有及時對共享內(nèi)存區(qū)中的數(shù)據(jù)進(jìn)行操作;此時若 進(jìn)程A發(fā)送數(shù)據(jù)2到共享內(nèi)存中,進(jìn)程B現(xiàn)在開始處理消息,并對共享內(nèi)存區(qū)中的數(shù)據(jù)進(jìn)行 操作就會出現(xiàn)讀寫錯亂的問題,影響進(jìn)程的執(zhí)行準(zhǔn)確率。為了避免讀寫錯亂的問題,現(xiàn)有一種共享內(nèi)存方式的進(jìn)程通信方法采用一定的補(bǔ) 救機(jī)制,也即,進(jìn)程A發(fā)送數(shù)據(jù)到共享內(nèi)存區(qū)中,進(jìn)程B收到消息并操作,在執(zhí)行完畢后通知 進(jìn)程A,此時進(jìn)程A才能再次進(jìn)行對共享內(nèi)存區(qū)的讀寫。但如果采用上述補(bǔ)救機(jī)制,進(jìn)程A 就不能在需要寫數(shù)據(jù)的時候隨時寫入,而是需要等待進(jìn)程B執(zhí)行完畢才可以進(jìn)行下一次的 操作,這就嚴(yán)重影響了進(jìn)程A的執(zhí)行效率和進(jìn)程的通信效率,例如加載瀏覽器頁面的效率 等都會受到影響。總之,需要本領(lǐng)域技術(shù)人員迫切解決的一個技術(shù)問題就是如何能夠提高進(jìn)程的 執(zhí)行準(zhǔn)確率、執(zhí)行效率和進(jìn)程的通信效率。
發(fā)明內(nèi)容
本申請所要解決的技術(shù)問題是提供一種進(jìn)程通信方法和裝置,能夠提高進(jìn)程的執(zhí) 行準(zhǔn)確率、執(zhí)行效率和進(jìn)程的通信效率。為了解決上述問題,本申請公開了一種進(jìn)程通信方法,包括源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間段;源進(jìn)程向目標(biāo)進(jìn)程發(fā)送數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帶有該內(nèi)存空間段的 地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。優(yōu)選的,所述源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空 間段的步驟,包括對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作,并將序列化操作完畢后的數(shù)據(jù)存儲至 相應(yīng)的序列化內(nèi)存;所述序列化內(nèi)存的序列化對象中記錄有序列化內(nèi)存的首地址和當(dāng)前地 址;分配長度與所述序列化內(nèi)存的長度相等的相應(yīng)的內(nèi)存空間段;
將所述序列化內(nèi)存中存儲的數(shù)據(jù)拷貝至該內(nèi)存空間段。優(yōu)選的,所述對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作的步驟,包括采用重載運算符對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作,其中不同數(shù)據(jù)類型的 數(shù)據(jù)對應(yīng)不同的重載運算符。優(yōu)選的,所述方法還包括源進(jìn)程接收來自目標(biāo)進(jìn)程的數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帶有該 內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的該內(nèi)存空間段的地址信息以及源進(jìn)程 的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段。優(yōu)選的,所述源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的該內(nèi)存空間段的地址信息 以及源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段的步驟,包括源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程的進(jìn)程 對象句柄;源進(jìn)程依據(jù)源進(jìn)程的進(jìn)程對象句柄及該內(nèi)存空間段的地址信息,釋放相應(yīng)的內(nèi)存 空間段。優(yōu)選的,所述地址信息包括內(nèi)存空間段的首地址以及長度。另一方面,本申請還公開了一種進(jìn)程通信方法,包括目標(biāo)進(jìn)程接收來自源進(jìn)程的數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帶有源進(jìn)程的相 應(yīng)內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帶的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn) 程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。優(yōu)選的,所述目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帶的相應(yīng)的內(nèi)存空間段的地址信 息以及源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)的步驟,包括目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帶的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程的進(jìn)程對 象句柄;目標(biāo)進(jìn)程依據(jù)源進(jìn)程的進(jìn)程對象句柄及該數(shù)據(jù)接收消息中攜帶的該內(nèi)存空間段 的地址信息,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。優(yōu)選的,所述方法還包括目標(biāo)進(jìn)程向源進(jìn)程發(fā)送數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帶有該內(nèi)存 空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。優(yōu)選的,所述地址信息包括內(nèi)存空間段的首地址以及長度。另一方面,本申請還公開了一種進(jìn)程通信裝置,包括序列化內(nèi)存空間獲取模塊,用于將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空 間的內(nèi)存空間段;及數(shù)據(jù)接收消息發(fā)送模塊,用于向目標(biāo)進(jìn)程發(fā)送數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中 攜帶有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。優(yōu)選的,所述序列化內(nèi)存空間獲取模塊包括數(shù)據(jù)序列化子模塊,用于對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作;序列化存儲子模塊,用于將序列化操作完畢后的數(shù)據(jù)存儲至相應(yīng)的序列化內(nèi)存;所述序列化內(nèi)存的序列化對象中記錄有序列化內(nèi)存的首地址和當(dāng)前地址;內(nèi)存空間段分配子模塊,用于分配長度與所述序列化內(nèi)存的長度相等的相應(yīng)的內(nèi) 存空間段 '及數(shù)據(jù)拷貝子模塊,用于將所述序列化內(nèi)存中存儲的數(shù)據(jù)拷貝至該內(nèi)存空間段。優(yōu)選的,所述數(shù)據(jù)序列化子模塊,具體用于采用重載運算符對發(fā)送給目標(biāo)進(jìn)程的 數(shù)據(jù)進(jìn)行序列化操作,其中不同數(shù)據(jù)類型的數(shù)據(jù)對應(yīng)不同的重載運算符。優(yōu)選的,所述裝置還包括接收模塊,用于接收來自目標(biāo)進(jìn)程的數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中 攜帶有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;釋放模塊,用于依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的該內(nèi)存空間段的地址信息以及 源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段。優(yōu)選的,所述釋放模塊包括句柄獲取子模塊,用于依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的源進(jìn)程的進(jìn)程標(biāo)識,獲 得源進(jìn)程的進(jìn)程對象句柄;及釋放子模塊,用于依據(jù)源進(jìn)程的進(jìn)程對象句柄及該內(nèi)存空間段的地址信息,釋放 相應(yīng)的內(nèi)存空間段。優(yōu)選的,所述地址信息包括內(nèi)存空間段的首地址以及長度。另一方面,本申請還公開了一種進(jìn)程通信裝置,包括數(shù)據(jù)接收消息接收模塊,用于接收來自源進(jìn)程的數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息 中攜帶有源進(jìn)程的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;及讀取模塊,用于依據(jù)該數(shù)據(jù)接收消息中攜帶的相應(yīng)的內(nèi)存空間段的地址信息以及 源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。優(yōu)選的,所述讀取模塊包括句柄獲取子模塊,用于依據(jù)該數(shù)據(jù)接收消息中攜帶的源進(jìn)程的進(jìn)程標(biāo)識,獲得源 進(jìn)程的進(jìn)程對象句柄 '及讀取子模塊,用于依據(jù)源進(jìn)程的進(jìn)程對象句柄及該數(shù)據(jù)接收消息中攜帶的該內(nèi)存 空間段的地址信息,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。優(yōu)選的,所述裝置還包括消息發(fā)送模塊,用于向源進(jìn)程發(fā)送數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜 帶有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。優(yōu)選的,所述地址信息包括內(nèi)存空間段的首地址以及長度。與現(xiàn)有技術(shù)相比,本申請具有以下優(yōu)點本申請的源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間 段,再發(fā)送消息通知目標(biāo)進(jìn)程;因為不同的數(shù)據(jù)(例如數(shù)據(jù)1和數(shù)據(jù)2)分別存放在不同的 相應(yīng)的內(nèi)存空間段(例如內(nèi)存空間段1和內(nèi)存空間段2),這樣,即使源進(jìn)程在目標(biāo)進(jìn)程讀取 數(shù)據(jù)1之前將數(shù)據(jù)2寫入了內(nèi)存空間段2,并發(fā)消息通知目標(biāo)進(jìn)程去讀取數(shù)據(jù)2,目標(biāo)進(jìn)程 也不會讀取錯數(shù)據(jù),并且,源進(jìn)程不必等待目標(biāo)進(jìn)程執(zhí)行完讀取等處理操作,即可發(fā)送新的 數(shù)據(jù),總之,本申請能夠在保證讀寫數(shù)據(jù)不錯亂的同時提高進(jìn)程的執(zhí)行效率和進(jìn)程的通信 效率。
另外,本申請將序列化操作完畢后的數(shù)據(jù)作為內(nèi)存空間段的存儲對象,故本申請 可以支持無限深度數(shù)據(jù)的存儲,能夠方便大量復(fù)雜數(shù)據(jù)結(jié)構(gòu)的交互。
圖I是現(xiàn)有技術(shù)ー種共享內(nèi)存方式的進(jìn)程通信方法的流程示意圖;圖2是本申請ー種共享內(nèi)存方式的進(jìn)程通信方法的流程示意圖;圖3是本申請ー種進(jìn)程通信方法實施例I的流程圖;圖4是本申請ー種進(jìn)程通信方法實施例2的流程圖;圖5是本申請ー種進(jìn)程通信裝置實施例I的流程圖;圖6是本申請ー種進(jìn)程通信裝置實施例2的流程圖。
具體實施例方式為使本申請的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖和具體實 施方式對本申請作進(jìn)一步詳細(xì)的說明。本申請的源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間 段,再發(fā)送消息通知目標(biāo)進(jìn)程。參照圖2,示出了本申請ー種共享內(nèi)存方式的進(jìn)程通信方法的流程示意圖,其中, 進(jìn)程A和進(jìn)程B使用同一共享內(nèi)存區(qū),進(jìn)程A將數(shù)據(jù)I序列化至共享內(nèi)存區(qū)中的內(nèi)存空間 段1,并通知進(jìn)程B去接收,此時進(jìn)程B可能正忙于其他事務(wù),而沒有及時對共享內(nèi)存區(qū)中的 數(shù)據(jù)進(jìn)行操作;此時若進(jìn)程A將數(shù)據(jù)2序列化至內(nèi)存空間段2,進(jìn)程B現(xiàn)在開始處理消息,并 對共享內(nèi)存區(qū)中的數(shù)據(jù)進(jìn)行操作。因為不同的數(shù)據(jù)(例如數(shù)據(jù)I和數(shù)據(jù)2)分別存放在不 同的相應(yīng)的內(nèi)存空間段(例如內(nèi)存空間段I和內(nèi)存空間段2),這樣,即使進(jìn)程A在進(jìn)程B讀 取數(shù)據(jù)I之前將數(shù)據(jù)2寫入了內(nèi)存空間段2,并發(fā)消息通知B進(jìn)程去讀取數(shù)據(jù)2,進(jìn)程B也 不會讀取錯數(shù)據(jù),并且,進(jìn)程A不必等待進(jìn)程B執(zhí)行完讀取等處理操作即可發(fā)送新的數(shù)據(jù), 總之,本申請能夠在保證讀寫數(shù)據(jù)不錯亂的同時提高進(jìn)程的執(zhí)行效率和進(jìn)程的通信效率。參照圖3,示出了本申請ー種進(jìn)程通信方法實施例I的流程圖,所述進(jìn)程作為進(jìn)程 通信的源進(jìn)程,具體可以包括步驟301、源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間 段;步驟302、源進(jìn)程向目標(biāo)進(jìn)程發(fā)送數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帯有該內(nèi)存 空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。本申請可以用于任意進(jìn)程間的通信,雖然進(jìn)程的用戶空間是互相獨立的,但源進(jìn) 程可以在共享內(nèi)存區(qū)開放若干個內(nèi)存空間段以在不同進(jìn)程間傳播或交換數(shù)據(jù)。在本申請的ー種優(yōu)選實施例中,所述地址信息具體可以包括內(nèi)存空間段的首地 址以及長度。在本申請的ー種優(yōu)選實施例中,所述源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其 虛擬地址空間的內(nèi)存空間段的步驟,具體可以包括步驟Al、對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作,并將序列化操作完畢后的數(shù) 據(jù)存儲至相應(yīng)的序列化內(nèi)存;所述序列化內(nèi)存的序列化對象中記錄有序列化內(nèi)存的首地址和當(dāng)前地址;在將數(shù)據(jù)存放至共享內(nèi)存區(qū)前,首先對數(shù)據(jù)進(jìn)行序列化操作,并存儲在源進(jìn)程的 獨立內(nèi)存區(qū)(本申請中指序列化內(nèi)存)中。本申請將序列化操作完畢后的數(shù)據(jù)作為內(nèi)存空 間段的存儲對象,故本申請可以支持無限深度數(shù)據(jù)的存儲,能夠方便大量復(fù)雜數(shù)據(jù)結(jié)構(gòu)的 交互。在具體實現(xiàn)中,可以創(chuàng)建序列化對象,并在該序列化對象中記錄序列化內(nèi)存的首 地址和當(dāng)前地址和內(nèi)存總大小等信息。這樣,可以根據(jù)內(nèi)存總大小,依次向?qū)?yīng)的序列化 內(nèi)存中存放序列化操作完畢后的數(shù)據(jù)。例如,對應(yīng)的序列化內(nèi)存的內(nèi)存總大小為4GB,首地 址為0x00000000,假設(shè)發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)有5條,序列化操作后的大小分別為0. 1G、 0. 2G、0. 5G、0. 6G、0. 8G,假設(shè)依次往該序列化內(nèi)存中存放這5條數(shù)據(jù),則當(dāng)前地址隨著每次 存放而不斷變化。序列化操作是將對象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程。本申請可以適用于 各種各樣的序列化操作。在本申請的一種優(yōu)選實施例中,所述對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn) 行序列化操作的步驟,可以進(jìn)一步包括采用重載運算符對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序 列化操作,其中不同數(shù)據(jù)類型的數(shù)據(jù)對應(yīng)不同的重載運算符。本優(yōu)選實施例使用重載運算符<<,將要發(fā)送的數(shù)據(jù)序列化。假設(shè)序列化對象的 名稱為 CSerializeObject&obj,則可以米用 obj < < m_nld ;obj < < m_strGenName 等重 載運算符?!?< < ”運算符經(jīng)過多次重載,可以針對不同的數(shù)據(jù)類型執(zhí)行了不同的內(nèi)存分 配。例如針對int類型的數(shù)據(jù),分配方式可以為memcpy (pBuff, &nValue, sizeof (int)); 而針對string類型的數(shù)據(jù),分配方式可以為_tcscpy (pStr, strValue. c_str ());對于 vector<int>這種向量類型的數(shù)據(jù),采用的分配方式則可以是
std::vector<int>::const iterator it = vectorValue.beginQ; for(; it != vectorValue.end(); it++)
{
(Hhis) Ht;
}對于其他類型的數(shù)據(jù)所采用的重載運算符請相互參照即可,在此不進(jìn)行一一列舉。步驟A2、分配長度與所述序列化內(nèi)存的長度相等的相應(yīng)的內(nèi)存空間段;b.在序列化操作完畢之后,需要調(diào)用obj. GetBuffer (&lpData, &dwLength)當(dāng)前 地址減去首地址即為所述序列化內(nèi)存的長度,然后可以在共享內(nèi)存空間上分配長度與所述 序列化內(nèi)存的長度相等的相應(yīng)的內(nèi)存空間段。在本申請的一種應(yīng)用不例中,可以調(diào)用VirtualAllocEx (GetCurrentProcess (), NULL, sizeof (TWHMessage), MEM_C0MMIT, PAGE_READWRITE)在進(jìn)程的共享內(nèi)存空間上獲得 一塊內(nèi)存,其中,第一個參數(shù)GetCurrentProcess ()可以獲得進(jìn)程句柄,第二個參數(shù)為NULL 表示由函數(shù)自己決定分配到哪兒,第三個參數(shù)是內(nèi)存的大小,第四個參數(shù)表示分配一塊內(nèi)存空間,第五個參數(shù)表示允許讀寫操作。通常VirtualAllocEx函數(shù)的返回值就是該內(nèi)存空 間段的地址信息。步驟A3、將所述序列化內(nèi)存中存儲的數(shù)據(jù)拷貝至該內(nèi)存空間段。在實際應(yīng)用中,可以調(diào)用memcpy函數(shù)將所述序列化內(nèi)存中存儲的數(shù)據(jù)拷貝到步 驟A2分配的內(nèi)存空間中。在目標(biāo)進(jìn)程讀取并處理完數(shù)據(jù)后,源進(jìn)程需要清理相應(yīng)的內(nèi)存空間段,否則只分 配不釋放會造成內(nèi)存泄露問題。于是,在本申請的一種優(yōu)選實施例中,所述方法還可以包 括步驟B1、源進(jìn)程接收來自目標(biāo)進(jìn)程的數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中 攜帶有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;步驟B2、源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的該內(nèi)存空間段的地址信息以及 源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段。在本申請的一種優(yōu)選實施例中,所述源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的該 內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段的步驟,具體可以 包括步驟B21、源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn) 程的進(jìn)程對象句柄;步驟B22、源進(jìn)程依據(jù)源進(jìn)程的進(jìn)程對象句柄及該內(nèi)存空間段的地址信息,釋放相 應(yīng)的內(nèi)存空間段。需要說明的是,在本申請的一種優(yōu)選實施例中,在使用完源進(jìn)程的進(jìn)程對象句柄 之后需要通過CloSeHandle()函數(shù)將其關(guān)閉。如果忘記關(guān)閉源進(jìn)程的進(jìn)程對象句柄,在程 序繼續(xù)運行時將會出現(xiàn)資源泄漏,雖然在程序退出運行時,操作系統(tǒng)會自動關(guān)閉在進(jìn)程中 已經(jīng)打開但未關(guān)閉的任何內(nèi)核對象。但是在進(jìn)程的運行過程中,勢必會積累過多的資源句 柄。因此在不再需要使用對象的時候通過CloSeHandle()將其予以關(guān)閉。參照圖4,示出了本申請一種進(jìn)程通信方法實施例2的流程圖,所述進(jìn)程作為進(jìn)程 通信的目標(biāo)進(jìn)程,具體可以包括步驟401、目標(biāo)進(jìn)程接收來自源進(jìn)程的數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帶有源 進(jìn)程的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;步驟402、目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帶的相應(yīng)的內(nèi)存空間段的地址信息 以及源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。在本申請的一種優(yōu)選實施例中,所述地址信息具體可以包括內(nèi)存空間段的首地 址以及長度。在本申請的一種優(yōu)選實施例中,所述目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帶的相應(yīng) 的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù) 據(jù)的步驟,可以進(jìn)一步包括步驟C1、目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帶的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程 的進(jìn)程對象句柄;步驟C2、目標(biāo)進(jìn)程依據(jù)源進(jìn)程的進(jìn)程對象句柄及該數(shù)據(jù)接收消息中攜帶的該內(nèi)存 空間段的地址信息,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。
在本申請的一種優(yōu)選實施例中,所述方法還可以包括目標(biāo)進(jìn)程向源進(jìn)程發(fā)送數(shù) 據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帶有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn) 程標(biāo)識。該數(shù)據(jù)處理完畢消息可以通知源進(jìn)程數(shù)據(jù)處理完畢,方便源進(jìn)程及時釋放相應(yīng)的 內(nèi)存。需要說明的是,在從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)后,由于讀取的數(shù)據(jù) 為序列化操作完畢后的數(shù)據(jù),在處理數(shù)據(jù)的過程中,目標(biāo)進(jìn)程可以根據(jù)需要選擇是否將所 讀取的數(shù)據(jù)進(jìn)行反序列化,也即可以將流轉(zhuǎn)換為對象。同理,為了避免程序運行過程中出現(xiàn)資源泄漏,在本申請的一種優(yōu)選實施例中,在 使用完源進(jìn)程的進(jìn)程對象句柄之后需要通過CloSeHandle()函數(shù)將其關(guān)閉。為使本領(lǐng)域技術(shù)人員更好地理解本申請,現(xiàn)提供一種進(jìn)程通信方法的示例,該示 例具體可以包括如下步驟步驟SI、源進(jìn)程在進(jìn)程的共享內(nèi)存空間上分配一個內(nèi)存空間段,并將序列化操作 完畢的數(shù)據(jù)存儲至該內(nèi)存空間段,該序列化操作可以保證將結(jié)構(gòu)體中任意深度的數(shù)據(jù)結(jié)構(gòu) 分配至內(nèi)存空間,保證數(shù)據(jù)的深層拷貝;具體可以報考步驟S11、在發(fā)送數(shù)據(jù)前,對要發(fā)送的數(shù)據(jù)進(jìn)行序列化操作,并將序列化操作完畢 后的數(shù)據(jù)存儲至相應(yīng)的序列化內(nèi)存,倉Il建CSerializeObject&obj對象,該對象中記錄了序 列化內(nèi)存的首地址,當(dāng)前地址,內(nèi)存總大小等信息;步驟S12、在序列化操作完畢之后,調(diào)用obj. GetBuffer (&lpData, &dwLength)來 取得對數(shù)據(jù)序列化后的內(nèi)存首地址及長度;步驟S13、調(diào)用 VirtualAl IocEx (GetCurrentProcess O,NULL, sizeof (TffHMessage),MEM_C0MMIT,PAGE_READWRITE)在進(jìn)程的共享內(nèi)存空間上獲得一個內(nèi) 存空間段,該內(nèi)存空間段的長度與所述序列化內(nèi)存的長度相等,VirtualAllocEx函數(shù)的返 回值就是該內(nèi)存空間段的地址信息;步驟S14、調(diào)用memcpy將之前序列化的內(nèi)存拷貝到上一步分配的內(nèi)存空間中;步驟S2、源進(jìn)程發(fā)送消息通知目標(biāo)進(jìn)程進(jìn)行數(shù)據(jù)接收,并且在消息的參數(shù)中附帶 了上一步分配的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程ID ;步驟S3、目標(biāo)進(jìn)程收到消息后,讀取數(shù)據(jù);具體可以包括步驟S31、目標(biāo)進(jìn)程調(diào)用OpenProcess函數(shù)(重要參數(shù)為上一步中的源進(jìn)程進(jìn)程 ID)獲得源進(jìn)程的進(jìn)程對象句柄;步驟S32、目標(biāo)進(jìn)程調(diào)用ReadProcessMemory函數(shù)(重要參數(shù)為上一步的源進(jìn)程的 進(jìn)程對象句柄及地址信息),獲得數(shù)據(jù);步驟S33、調(diào)用CloSeHandle()函數(shù)關(guān)閉源進(jìn)程的進(jìn)程對象句柄;步驟S34、處理數(shù)據(jù);步驟S4、目標(biāo)進(jìn)程發(fā)消息通知源進(jìn)程數(shù)據(jù)處理完;步驟S5、源進(jìn)程調(diào)用StructVirtualFree函數(shù)釋放分配的內(nèi)存;步驟S51、調(diào)用OpenProcess函數(shù)(重要參數(shù)為源進(jìn)程進(jìn)程ID),獲得源進(jìn)程的進(jìn) 程對象句柄;步驟S52、調(diào)用VirtualFreeEx函數(shù)釋放(重要參數(shù)為上一步取得的進(jìn)程句柄,以 及之前分配內(nèi)存的地址信息);
步驟S53、調(diào)用CloSeHandle()函數(shù)關(guān)閉源進(jìn)程的進(jìn)程對象句柄。本申請進(jìn)程通信的方法可以應(yīng)用于各種程序中,現(xiàn)提供一種瀏覽器中進(jìn)程通信的 方法流程不例;參照表1,示出了本示例中用到的一些函數(shù)的功能和參數(shù)釋義。
權(quán)利要求
1.一種進(jìn)程通信方法,其特征在于,包括 源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間段; 源進(jìn)程向目標(biāo)進(jìn)程發(fā)送數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帯有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。
2.如權(quán)利要求I所述的方法,其特征在于,所述源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間段的步驟,包括 對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作,并將序列化操作完畢后的數(shù)據(jù)存儲至相應(yīng)的序列化內(nèi)存;所述序列化內(nèi)存的序列化對象中記錄有序列化內(nèi)存的首地址和當(dāng)前地址;分配長度與所述序列化內(nèi)存的長度相等的相應(yīng)的內(nèi)存空間段; 將所述序列化內(nèi)存中存儲的數(shù)據(jù)拷貝至該內(nèi)存空間段。
3.如權(quán)利要求2所述的方法,其特征在干,所述對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作的步驟,包括 采用重載運算符對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作,其中不同數(shù)據(jù)類型的數(shù)據(jù)對應(yīng)不同的重載運算符。
4.如權(quán)利要求I至3中任一項所述的方法,其特征在于,還包括 源進(jìn)程接收來自目標(biāo)進(jìn)程的數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帯有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識; 源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帯的該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段。
5.如權(quán)利要求4所述的方法,其特征在于,所述源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帶的該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段的步驟,包括 源進(jìn)程依據(jù)該數(shù)據(jù)處理完畢消息中攜帯的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程的進(jìn)程對象句柄; 源進(jìn)程依據(jù)源進(jìn)程的進(jìn)程對象句柄及該內(nèi)存空間段的地址信息,釋放相應(yīng)的內(nèi)存空間段。
6.如權(quán)利要求I所述的方法,其特征在于,所述地址信息包括內(nèi)存空間段的首地址以及長度。
7.—種進(jìn)程通信方法,其特征在于,包括 目標(biāo)進(jìn)程接收來自源進(jìn)程的數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帯有源進(jìn)程的相應(yīng)內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識; 目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帯的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。
8.如權(quán)利要求7所述的方法,其特征在于,所述目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帯的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)的步驟,包括 目標(biāo)進(jìn)程依據(jù)該數(shù)據(jù)接收消息中攜帯的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程的進(jìn)程對象句柄; 目標(biāo)進(jìn)程依據(jù)源進(jìn)程的進(jìn)程對象句柄及該數(shù)據(jù)接收消息中攜帯的該內(nèi)存空間段的地址信息,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。
9.如權(quán)利要求7或8所述的方法,其特征在于,還包括 目標(biāo)進(jìn)程向源進(jìn)程發(fā)送數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帯有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。
10.如權(quán)利要求7所述的方法,其特征在于,所述地址信息包括內(nèi)存空間段的首地址以及長度。
11.一種進(jìn)程通信裝置,其特征在于,包括 序列化內(nèi)存空間獲取模塊,用于將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間段;及 數(shù)據(jù)接收消息發(fā)送模塊,用于向目標(biāo)進(jìn)程發(fā)送數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帯有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。
12.如權(quán)利要求11所述的裝置,其特征在于,所述序列化內(nèi)存空間獲取模塊包括 數(shù)據(jù)序列化子模塊,用于對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作; 序列化存儲子模塊,用于將序列化操作完畢后的數(shù)據(jù)存儲至相應(yīng)的序列化內(nèi)存;所述序列化內(nèi)存的序列化對象中記錄有序列化內(nèi)存的首地址和當(dāng)前地址; 內(nèi)存空間段分配子模塊,用于分配長度與所述序列化內(nèi)存的長度相等的相應(yīng)的內(nèi)存空間段 '及 數(shù)據(jù)拷貝子模塊,用于將所述序列化內(nèi)存中存儲的數(shù)據(jù)拷貝至該內(nèi)存空間段。
13.如權(quán)利要求12所述的裝置,其特征在于,所述數(shù)據(jù)序列化子模塊,具體用于采用重載運算符對發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)進(jìn)行序列化操作,其中不同數(shù)據(jù)類型的數(shù)據(jù)對應(yīng)不同的重載運算符。
14.如權(quán)利要求11至13中任一項所述的裝置,其特征在于,還包括 接收模塊,用于接收來自目標(biāo)進(jìn)程的數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帯有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識; 釋放模塊,用于依據(jù)該數(shù)據(jù)處理完畢消息中攜帯的該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,釋放相應(yīng)的內(nèi)存空間段。
15.如權(quán)利要求14所述的裝置,其特征在于,所述釋放模塊包括 句柄獲取子模塊,用于依據(jù)該數(shù)據(jù)處理完畢消息中攜帯的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程的進(jìn)程對象句柄 '及 釋放子模塊,用于依據(jù)源進(jìn)程的進(jìn)程對象句柄及該內(nèi)存空間段的地址信息,釋放相應(yīng)的內(nèi)存空間段。
16.如權(quán)利要求11所述的裝置,其特征在于,所述地址信息包括內(nèi)存空間段的首地址以及長度。
17.—種進(jìn)程通信裝置,其特征在于,包括 數(shù)據(jù)接收消息接收模塊,用于接收來自源進(jìn)程的數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帶有源進(jìn)程的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識;及 讀取模塊,用于依據(jù)該數(shù)據(jù)接收消息中攜帯的相應(yīng)的內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。
18.如權(quán)利要求17所述的裝置,其特征在于,所述讀取模塊包括句柄獲取子模塊,用于依據(jù)該數(shù)據(jù)接收消息中攜帯的源進(jìn)程的進(jìn)程標(biāo)識,獲得源進(jìn)程的進(jìn)程對象句柄 '及 讀取子模塊,用于依據(jù)源進(jìn)程的進(jìn)程對象句柄及該數(shù)據(jù)接收消息中攜帯的該內(nèi)存空間段的地址信息,從相應(yīng)源進(jìn)程的相應(yīng)內(nèi)存空間段讀取數(shù)據(jù)。
19.如權(quán)利要求17或18所述的裝置,其特征在于,還包括 消息發(fā)送模塊,用于向源進(jìn)程發(fā)送數(shù)據(jù)處理完畢消息,該數(shù)據(jù)處理完畢消息中攜帯有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。
20.如權(quán)利要求17或18所述的裝置,其特征在于,所述地址信息包括內(nèi)存空間段的首地址以及長度。
全文摘要
本申請?zhí)峁┝艘环N進(jìn)程通信方法和裝置,其中的方法具體包括源進(jìn)程將發(fā)送給目標(biāo)進(jìn)程的數(shù)據(jù)序列化至其虛擬地址空間的內(nèi)存空間段;源進(jìn)程向目標(biāo)進(jìn)程發(fā)送數(shù)據(jù)接收消息,該數(shù)據(jù)接收消息中攜帶有該內(nèi)存空間段的地址信息以及源進(jìn)程的進(jìn)程標(biāo)識。本申請能夠提高進(jìn)程的執(zhí)行準(zhǔn)確率、執(zhí)行效率和進(jìn)程的通信效率。
文檔編號G06F9/54GK102662775SQ20121008958
公開日2012年9月12日 申請日期2012年3月29日 優(yōu)先權(quán)日2012年3月29日
發(fā)明者任寰, 杭程, 段培堃, 謝志宏 申請人:奇智軟件(北京)有限公司