一種多進程共享數(shù)據(jù)的方法和裝置的制造方法
【技術領域】
[0001]本發(fā)明涉及通信領域,尤其涉及一種多進程共享數(shù)據(jù)的方法和裝置。
【背景技術】
[0002]在多核對稱多處理機(Symmetrical Mult1-Processing,SMP)系統(tǒng),尤其是需要有較高隔離度和可靠性的系統(tǒng)中,多進程是典型的軟件模型,多進程之間地址空間隔離,進程擁有自己私有的數(shù)據(jù)區(qū)域,這樣,進程相互之間互不干擾,而且異常后能有效隔離故障,并恢復系統(tǒng)正常運行。
[0003]在大容量并行處理的系統(tǒng)上,多進程實例是典型的并發(fā)設計模型,多進程實例是指多個進程運行完全相同的程序代碼,并且將不同實例親和到不同的中央處理器(CentralProcessing Unit,CPU)核上以充分發(fā)揮并發(fā)的性能優(yōu)勢。多進程實例可以實現(xiàn)在多實例之間完全隔離,互不干擾。但是,多進程實例往往不可避免需要共享數(shù)據(jù),例如共享全局控制變量、共享內(nèi)存池等。在共享數(shù)據(jù)時通常的實現(xiàn)方式有兩種:
[0004]第一種方法:第一個進程實例(以下稱為主進程)通過操作系統(tǒng)接口獲取一段共享內(nèi)存;主進程將共享內(nèi)存映射到自己的地址空間;其余進程調(diào)用操作系統(tǒng)接口將共享內(nèi)存分別映射到本進程的地址空間;各進程通過將數(shù)據(jù)拷貝到共享內(nèi)存進行交互數(shù)據(jù),參閱圖1所示。
[0005]然而,這種方法如果需要進程間共享變量和緩沖區(qū),第一個進程實例需要將數(shù)據(jù)拷貝到共享內(nèi)存區(qū)域,其他進程實例需要從共享內(nèi)存提取數(shù)據(jù),由于此過程涉及數(shù)據(jù)拷貝,在大數(shù)據(jù)共享時效率很低。
[0006]例如,假設用戶代碼中有一個全局變量g_ControlCb表示全局控制結構,當運行多進程實例時,由于用戶代碼的復用性,每個進程中都存在一個全局變量g_ControlCb,每次當一個進程修改了全局變量8_(:011廿0103后,將這個全局變量整體拷貝到共享內(nèi)存區(qū)域(假設地址為PShareDataAddr),然后采用某種機制通知其它進程這個全局數(shù)據(jù)已經(jīng)發(fā)生修改,當其它進程檢測到全局變量修改后,再從PShareDataAddr將全局數(shù)據(jù)拷貝回g_ControlCb,這樣兩邊的進程仍然能直接使用g_ControlCb這個全局變量,但是修改、通知、同步機制較為復雜。
[0007]第二種方法:第一個進程實例(以下稱為主進程)通過操作系統(tǒng)接口獲取一段共享內(nèi)存;主進程將共享內(nèi)存映射到自己的地址空間;其余進程調(diào)用操作系統(tǒng)接口將共享內(nèi)存分別映射到本進程的地址空間;各進程通過指針訪問的方式來共享內(nèi)存進行交互數(shù)據(jù),參閱圖2所示。
[0008]然而,通過指針方式來存取共享內(nèi)存的方式需要對原始代碼進行改造,將需要共享的全局變量全部替換為指針,代碼兼容性較差。
[0009]例如,假設用戶代碼中有一個全局變量g_ControlCb表示全局控制結構,當運行多進程實例時,由于用戶代碼的復用性,每個進程中都存在一個全局變量g_ControlCb,修改所有的代碼,放棄直接使用g_ControlCb,當需要訪問共享控制數(shù)據(jù)g_ControlCb時,改為直接使用共享內(nèi)存pShareDataAddr,這種修改對代碼結構影響較大,并且需要人為維護全局變量在共享內(nèi)存中的地址關系。
【發(fā)明內(nèi)容】
[0010]本發(fā)明實施例提供了一種多進程共享數(shù)據(jù)的方法和裝置,用以解決在數(shù)據(jù)共享的過程中,由于采用數(shù)據(jù)拷貝導致效率偏低的問題,以及采用指針方式時需要修改原始代碼導致的靈活性差以及可維護性差的問題,
[0011]本發(fā)明實施例提供的具體技術方案如下:
[0012]一種多進程共享數(shù)據(jù)的方法,包括:
[0013]將各個進程中的共享數(shù)據(jù)存入自定義段中,并將所述自定義段加載到虛擬地址空間中;
[0014]獲取所述自定義段的大小,并為所述共享數(shù)據(jù)在物理內(nèi)存中分配一個與所述自定義段相等大小的共享物理內(nèi)存,以及在所述自定義段與所述共享物理內(nèi)存之間建立映射關系;
[0015]基于所述映射關系,在所述自定義段和所述共享物理內(nèi)存之間,實現(xiàn)各個進程之間的共享數(shù)據(jù)的交互。
[0016]這樣,通過將共享數(shù)據(jù)匯聚存放在自定義段中來實現(xiàn)對自定義段的直接共享,避免了采用數(shù)據(jù)拷貝實現(xiàn)數(shù)據(jù)共享時導致效率偏低的問題,也避免了采用指針方式實現(xiàn)數(shù)據(jù)共享時需要修改原始代碼導致的靈活性差以及可維護性差的問題。
[0017]較佳的,獲取所述自定義段的大小,包括:
[0018]編譯第一文件,形成可執(zhí)行連接格式ELF文件,通過所述ELF文件獲取所述自定義段的初始大??;其中,所述第一文件為所述至少一個進程的源文件;
[0019]臨時生成第二文件,在所述第二文件中調(diào)整所述自定義段的初始大小為頁大小的整數(shù)倍,然后設置一個變量,并賦予所述變量的值為調(diào)整后的自定義段的初始大小,通過讀取所述變量獲取自定義段的大小。
[0020]較佳的,在所述自定義段與所述共享物理內(nèi)存之間建立映射關系,包括:
[0021]針對所述自定義段的地址和所述物理共享內(nèi)存的地址分別執(zhí)行頁對齊操作;
[0022]基于頁對齊操作結果,確定所述自定義段與所述共享物理內(nèi)存之間的地址映射。
[0023]較佳的,基于所述映射關系,在所述自定義段和所述共享物理內(nèi)存之間,實現(xiàn)各個進程之間的共享數(shù)據(jù)的交互,包括:
[0024]當檢測到所述至少一個進程訪問所述自定義段時,基于所述映射關系,在所述共享物理內(nèi)存中存取所述共享數(shù)據(jù)。
[0025]較佳的,進一步包括:
[0026]當檢測到所述共享物理內(nèi)存已被釋放時,則解除所述自定義段與所述共享物理內(nèi)存之間的映射關系。
[0027]一種多進程共享數(shù)據(jù)的裝置,包括:
[0028]加載單元,用于將各個進程中的共享數(shù)據(jù)存入自定義段中,并將所述自定義段加載到虛擬地址空間中;
[0029]處理單元,用于獲取所述自定義段的大小,并為所述共享數(shù)據(jù)在物理內(nèi)存中分配一個與所述自定義段相等大小的共享物理內(nèi)存,以及在所述自定義段與所述共享物理內(nèi)存之間建立映射關系;
[0030]共享單元,用于基于所述映射關系,在所述自定義段和所述共享物理內(nèi)存之間,實現(xiàn)各個進程之間的共享數(shù)據(jù)的交互。
[0031]這樣,通過將共享數(shù)據(jù)匯聚存放在自定義段中來實現(xiàn)對自定義段的直接共享,避免了采用數(shù)據(jù)拷貝實現(xiàn)數(shù)據(jù)共享時導致效率偏低的問題,也避免了采用指針方式實現(xiàn)數(shù)據(jù)共享時需要修改原始代碼導致的靈活性差以及可維護性差的問題。
[0032]較佳的,獲取所述自定義段的大小時,所述處理單元用于:
[0033]編譯第一文件,形成可執(zhí)行連接格式ELF文件,通過所述ELF文件獲取所述自定義段的初始大??;其中,所述第一文件為所述至少一個進程的源文件;
[0034]臨時生成第二文件,在所述第二文件中調(diào)整所述自定義段的初始大小為頁大小的整數(shù)倍,然后設置一個變量,并賦予所述變量的值為調(diào)整后的自定義段的初始大小,通過讀取所述變量獲取自定義段的大小。
[0035]較佳的,在所述自定義段與所述共享物理內(nèi)存之間建立映射關系時,所述處理單元用于:
[0036]針對所述自定義段的地址和所述物理共享內(nèi)存的地址分別執(zhí)行頁對齊操作;
[0037]基于頁對齊操作結果,確定所述自定義段與所述共享物理內(nèi)存之間的地址映射。
[0038]較佳的,基于所述映射關系,在所述自定義段和所述共享物理內(nèi)存之間,實現(xiàn)各個進程之間的共享數(shù)據(jù)的交互時,所述共享單元用于:
[0039]當檢測到所述至少一個進程訪問所述自定義段時,基于所述映射關系,在所述共享物理內(nèi)存中存取所述共享數(shù)據(jù)。
[0040]較佳的,所述共享單元進一步用于:
[0041]當檢測到所述共享物理內(nèi)存已被釋放時,則解除所述自定義段與所述共享物理內(nèi)存之間的映射關系。
【附圖說明】
[0042]圖1為現(xiàn)有技術下采用數(shù)據(jù)拷貝方式進行多進程數(shù)據(jù)共享的結構示意圖;
[0043]圖2為現(xiàn)有技術下采用數(shù)據(jù)拷貝方式進行多進程數(shù)據(jù)共享的結構示意圖;
[0044]圖3為本發(fā)明實施例中多進程數(shù)據(jù)共享的具體流程示意圖;
[0045]圖4為本發(fā)明實施例中多進程數(shù)據(jù)共享的自定義段的結構