新四季網

跨進程數據傳輸方法、裝置及網絡設備的製作方法

2023-06-04 02:05:31 1

專利名稱:跨進程數據傳輸方法、裝置及網絡設備的製作方法
技術領域:
本發明涉及數據處理技術領域,尤指一種跨進程數據傳輸方法、裝置及網絡設備。
背景技術:
現有的嵌入式系統越來越多地使用基於進程管理的作業系統技術,不同的進程運 行在不同的地址空間中,每個進程都無法直接訪問其他進程中的數據,為了實現運行在不 同地址空間的不同進程之間的數據傳遞,通常有下面的幾種處理方式一是採用數據拷貝的方式。通過數據拷貝的方式,將一個進程中的數據複製到另外一個進程中供其訪問。例 如將報文數據直接從進程A (源進程)的地址空間複製到進程B(目的進程)的地址空間 中,供進程B訪問。頻繁的數據拷貝顯然非常耗時,使得這種共享數據的方式效率極其低 下,而且十分浪費內存空間。由於在網絡協議棧中各種應用協議的報文數據往往非常龐大, 具有大量報文傳輸需求,更是嚴重影響了網絡嵌入式系統的實時性。特別是使用IPv6協議 的網絡系統中,報文允許的有效載荷要比使用IPv4網絡系統大得多,進程間的數據拷貝對 系統性能的影響也尤為突出。二是共享內存(Shared Memory, SHM)傳遞的方式。該方式是通過創建的共享內存區,將需要在進程間傳遞的數據內容保存到所有進 程都可以訪問的共享物理內存中,實現進程間「零拷貝,,的傳遞數據。即將需要傳遞的數據 保存到其他進程也可以訪問的共享內存區中,然後將本進程地址空間使用的數據內存地址 (Data Memory Address, DMA)轉換為基於其他進程地址空間的內存地址,以供其他進程使 用,其他進程直接通過該內存地址去訪問共享內存區,獲取所需的數據。現有共享內存實現進程間數據傳遞的方式,在每次傳遞數據時臨時創建共享內存 區,傳遞完後就刪除的話,頻繁地創建和銷毀共享內存區所導致的頻繁的內存操作,降低了 數據傳遞的效率,同時造成內存資源的浪費,影響系統性能。如果創建包含多個內存塊的若 幹共享內存區,每次傳輸數據使用其中的一個內存塊,雖然可以在一定程度上減少創建和 刪除操作,但是只要有一個內存塊在使用,則共享內存區就不能釋放,從而導致內存資源的 浪費。且每次選擇合適大小的內存塊時都需要遍歷所有的內存塊來實現查找選擇,導致數 據跨進程傳輸的延時很長,且遍歷內存塊也導致系統資源浪費,影響了系統的性能。由於嵌入式系統的內存容量通常比較小,內存使用的不合理將大大降低網絡設備 對報文的處理能力,從而降低設備處理性能。因此,在使用共享內存機制進行進程間數據 傳輸時,如何有效地利用內存空間,提高數據傳遞效率和提高內存利用率,已成為嵌入式系 統,尤其是網絡嵌入式系統中迫切需要解決的一個問題。

發明內容
本發明實施例提供一種跨進程數據傳輸方法、裝置及網絡設備,用以解決現有技 術中通過共享內存方式實現進程間數據傳輸時存在數據傳輸延時長,系統資源浪費、影響系統性能的問題。一種跨進程數據傳輸方法,包括根據第一進程中待傳遞數據的大小和預先創建的各共享內存池中共享內存區所 包含的共享內存對象的大小,選擇適於存放所述待傳遞數據的共享內存池;每個所述共享 內存池中的各共享內存區包含的共享內存對象的大小相同;從選擇的內存池中選擇一個處於可使用狀態的共享內存區,將所述待傳遞數據存 放至所選擇的共享內存區中空閒的共享內存對象中並將存放數據後的共享內存對象標記 為佔用狀態;根據所述待傳遞數據在所述第一進程中的偏移地址,確定第二進程從共享內存區 中獲取所述待傳遞數據的指針地址。一種跨進程數據傳輸裝置,包括內存池選擇模塊,用於根據第一進程中待傳遞數據的大小和預先創建的各共享內 存池中共享內存區所包含的共享內存對象的大小,選擇適於存放所述待傳遞數據的共享內 存池;每個所述共享內存池中的各共享內存區包含的共享內存對象的大小相同;區域選擇模塊,用於從所述內存池選擇模塊選擇的內存池中選擇一個處於可使用 狀態的共享內存區;傳輸控制模塊,用於將所述待傳遞數據存放至所述區域選擇模塊選擇的共享內存 區中空閒的共享內存對象中並將存放數據後的共享內存對象標記為佔用狀態;地址確定模塊,用於根據所述數據傳遞模塊存儲的待傳遞數據在所述第一進程中 的偏移地址,確定第二進程從共享內存區中獲取所述待傳遞數據的指針地址。一種網絡設備,包括上述的跨進程數據傳輸裝置。本發明有益效果如下本發明實施例提供的跨進程數據傳輸方法、裝置及網絡設備,通過將相同大小的 共享內存對象設置在一個共享內存池中,實現了在第一進程需要傳遞數據時,根據數據大 小選擇則共享內存池,使用其中的共享內存對象,從而使得在需要傳輸數據時,能夠快速查 找到合適的共享內存區,不必再遍歷所有的共享內存區,方便了進程間的數據傳遞,減少了 數據傳輸時查找的時延,提高了跨區域數據傳輸的速度和效率;由於不用遍歷所有內存區, 節約了系統資源,大大提高了系統的處理性能。


圖1為本發明實施例一中跨進程數據傳輸方法的流程圖;圖2為本發明實施例一中共享內存區在進程地址空間的關係的示意圖;圖3為本發明實施例一中確定數據傳輸時的指針地址的原理示意圖;圖4為本發明實施例二中跨進程數據傳輸方法的流程圖;圖5為本發明實施例二中共享內存池的結構關係示意圖;圖6為本發明實施例二中共享內存區的共享內存對象結構示意圖;圖7為本發明實施例中跨進程數據傳輸裝置的結構示意圖。
具體實施例方式針對現有技術中存在的共享內存區實現進程間數據傳輸時存在的內存利用率低、 內存資源浪費,以及頻繁創建和刪除共享內存區影響系統性能的等問題,本申請實施例提 供一種跨進程數據傳輸方法,通過創建共享內存池實現對相同大小的共享內存對象的統一 管理和合理分配使用,實現節約內存資源,提高內存利用率的目的。下面通過具體的實施例 進行說明。本申請實施例提供的跨進程數據傳輸方法,需要創建若干包含相同大小的共享內 存對象的共享內存池用於數據的傳輸。其中一個共享內存池(Shared Memory Pool,SMP)中可以包含零到多個共享內存區,用 於對同一類型的共享內存區進行管理和配置。可以配置共享內存池的描述符來存儲共享內 存區的描述信息。本申請中所說的共享內存區(Shared Memory Area, SMA)不同於現有技術中的概 念,是指提供相同大小的共享內存對象(即內存塊)的共享內存區。一個共享內存區的共享 內存對象的大小都相同,而包含的共享內存對象的大小相同的所有共享內存區歸為一類, 放入一個共享內存池中。每個共享內存區的頭部也設置有該共享內存區的描述信息(即描 述符),包括分配和管理該共享內存區的共享內存對象時所需要的各種信息。可見,每個共享內存池中,僅包含同一類型的共享內存區,這些共享內存區中的共 享內存對象(Shared Memory Object, SM0)大小都是相同的。也就是說,預先創建的每個共 享內存池中的各共享內存區包含的共享內存對象的大小相同。大小不同的共享內存對象包 含在不同的共享內存池中,當需要傳遞數據時,從共享內存池中選擇一個共享內存區中的 空閒的共享內存對象。其中,上述每一類共享內存區包含一個或多個物理頁,具體需要包含多少物理頁, 由共享內存區內所包含的共享內存對象的大小來決定,以共享內存區完成相同大小的共享 內存對象劃分之後剩餘的共享內存碎片儘可能小為原則,以提高內存的利用率。其中,共享 內存碎片是指共享內存區劃分成固定大小的共享內存對象之後,剩餘的不足以分配一個對 應大小的共享內存對象的內存空間。優選的,在計算每一類共享內存區的大小時,根據對應的共享內存對象的大小進 行精確計算,以保證共享內存碎片儘可能地小。優選的,為了方便內存分配,共享內存池中的共享內存對象大小,按照2的N次冪 進行分類,每一類共享內存對象的大小都是2的整數次冪倍(大小從32B到32MB)。每個共 享內存池在初始化的時候,根據所包含共享內存對象的大小,對自身要創建的共享內存區 的大小進行計算,以劃分出共享內存對象後,剩餘的碎片不超過所包含物理頁內存空間的 設定比例(例如1/8)時認為可以接受。這樣做的好處是,可以儘可能減少共享內存碎片的 損耗,提高內存的利用率。實施例一本發明實施例一提供的跨進程數據傳輸方法,其流程如圖1所示,執行步驟如下步驟Sll 根據第一進程中待傳遞數據的大小和預先創建的各共享內存池中共享 內存區所包含的共享內存對象的大小,選擇適於存放待傳遞數據的共享內存池。較佳的,上述根據第一進程中待傳遞數據的大小和預先創建的各共享內存池中共享內存區所包含的共享內存對象的大小,選擇適於存放待傳遞數據的共享內存池,具體包括首先,根據第一進程中待傳遞數據的大小,確定包含的共享內存對象的大小大於 待傳遞數據的大小的共享內存池;因為只有大於待傳遞數據的大小的共享內存對象才能將 該待傳遞數據存儲起來。然後,從確定的共享內存池中選擇一個共享內存對象最小的共享內存池作為存放 待傳遞數據的共享內存池。在能夠存儲待傳遞數據的共享內存對象中選擇一個最小的是為 了更充分的利用內存空間。當然直接選用任何一個大於待傳遞數據大小的共享內存對象來 實現數據傳輸也是可以實現的。步驟S12 從選擇的內存池中選擇一個處於可使用狀態的共享內存區。根據共享內存區中的共享內存對象是否完全被佔用,共享內存池中的共享內存區 的狀態包括完全佔用狀態、部分佔用狀態和空閒狀態。在從選擇的內存池中選擇一個處於可使用狀態的共享內存區時,可以直接從處於 部分佔用狀態或空閒狀態的共享內存區中選擇。其中,共享內存區中所有的共享內存對象 都已經分配出去,即都已被佔用了(All objects allocated),則稱作完全佔用狀態的共享 內存區(Full Shared Memory Areas, Full SHM);共享內存區中的共享內存對象只有部分 已經分配出去(Partial objectsallocated),另一部分尚未分配出去的,稱作部分佔用狀 態的共享內存區(PartialShared Memory Areas,Partial SHM);共享內存區的所有共享內 存對象都處於空閒狀態(All objects free),尚未分配出去的,稱作空閒狀態的共享內存 區(FreeShared Memory Areas, Free SHM)。優選的,在從選擇的內存池中選擇一個處於可使用狀態的共享內存區時,優先查 找選擇的內存池中是否存在處於部分佔用狀態的共享內存區,若是,從處於部分佔用狀態 的共享內存區中選擇一個共享內存區;否則,從空閒狀態的共享內存區中選擇一個共享內 存區。優選的,可以通過建立的完全佔用鍊表、部分佔用鍊表和空閒狀態鍊表維護處於 完全佔用狀態、部分佔用狀態和空閒狀態的共享內存區。步驟S13 將待傳遞數據存放至所選擇的共享內存區中空閒的共享內存對象中。在選擇共享內存區後,將待傳遞數據存儲在所選擇的共享內存區中的任何一個空 閒的共享內存對象中即可。步驟S14 將存放數據後的共享內存對象標記為佔用狀態。在存放數據後對共享內存對象進行標記,使得下次再存儲數據時,不會選擇該已 經佔用的共享內存對象。其中,共享內存區在進程地址空間中的映射關係如圖2所示,其中共享內存區的 起始地址a和終止地址b分別映射到進程地址空間中的地址a』和b』。步驟S15 根據待傳遞數據在第一進程中的偏移地址,確定第二進程從共享內存 區中獲取所述待傳遞數據的指針地址。一般數據的指針在一個進程的內存地址空間中是一個絕對值,只能在該進程中使 用,因此共享內存區要想在進程中使用就必須實現如圖2所示的地址的映射。使用共享內 存區實現數據傳輸時,由於共享內存區在不同進程的地址空間映射的範圍通常是不一樣 的,因此,如果直接將數據指針從一個進程傳遞到另一個進程,對數據的訪問將會出錯,因為這個指針在另一個進程的地址空間中指向的可能是另外一個內存區域。此時,數據指針 不能直接在進程間傳遞,否則勢必引起應用程式錯誤,同樣需要實現數據指針在不同進程 的內存地址空間之間的映射和傳遞。由於共享內存區在不同進程中的映射地址(稱為共享內存區在進程中的基址)是 不同的,但是共享內存區中的同一個共享內存對象在進程中相對於基址的偏移地址確是一 致,因此,可以根據待傳遞數據在第一進程中的偏移地址,確定第二進程從共享內存區中獲 取待傳遞數據的指針地址,具體包括根據待傳遞數據第一進程中的指針地址和第一進程的基址,確定待傳遞數據在第 一進程中的偏移地址;根據該偏移地址和第二進程的基址,確定待傳遞數據在第二進程中 的指針地址。也就是說,在進程間進行數據傳遞時,第一進程只需要將共享內存對象的偏移地 址傳遞給第二進程(即目標進程)即可,第二進程將接收到的偏移地址加上共享內存區在 本進程中的基址,即可重新生成該共享內存對象中的數據在本進程中的指針地址,從而達 到進程間數據指針傳遞的目的。例如確定數據傳輸時的指針地址的原理如圖3所示,圖3中的第一進程(進程A) 向第二進程(進程B)傳遞數據,待傳遞的數據在共享內存對象(object)中存儲,該共享內 存對象所屬共享內存區在進程A中的基址為m,在進程B中的基址為η。存儲在該共享內存 對象中的數據在進程A中的指針地址為obj_ptr_a,因此,待傳遞數據在第一進程中的偏移 地址為obj_ptr_a-m,將這個偏移地址傳遞給進程B,進程B接收到偏移地址後,加上基址η 就是該共享內存對象(或說待傳遞數據)在進程B的地址空間中的指針地址,該指針地址 為 obj_ptr_a-m+n(即圖 3 中的 obj_ptr_b)。實施例二本發明實施例二提供的跨進程數據傳輸方法,可以通過一個共享內存守護進程 (Shared Memory Daemon Process, SMDP)實現動態創建、刪除等調整共享內存池中的共享 內存區的操作;並負責共享內存池中包含的共享內存區的管理和配置,包括相關數據結構 的初始化,以及共享內存對象的分配和回收等等。本實施例提供的跨進程數據傳輸方法的流程如圖4所示,執行步驟如下步驟S21 確定第一進程需要傳遞的待傳遞數據的大小。這裡是指待傳遞數據存儲時所需要的內存空間的大小,例如數據所佔用的字節數。步驟S22 在預先創建的共享內存池中查找適於存儲該待傳遞數據的共享內存 池。具體參見步驟Sll。步驟S23 在選擇的共享內存池中選擇一個處於可使用狀態共享內存區。具體參見步驟S12。優選的,為了能夠使共享內存池中的空閒內存對象維持在一個比較合理的數量, 可以監控共享內存池中處於空閒的共享內存對象的數量或比例,以便及時的對共享內存區 進行調整。具體包括當空閒的共享內存對象的數量低於設定的第一數量閾值時,在共享內存池中添加新的共享內存區;當空閒的共享內存對象的數量高於設定的第二數量閾值時,刪除共享內 存池中處於空閒狀態的共享內存區。或當空閒的共享內存對象的比例低於設置的第一比例 閾值時,在共享內存池中添加新的共享內存區;當空閒的共享內存對象的比例高於設置的 第二比例閾值時,刪除共享內存池中處於空閒狀態的共享內存區。以監控共享內存區中共享內存對象的數量為例,在共享內存池中維護監聽共享內 存分配情況的兩條水線低(low)水線和高(high)水線,當空閒的共享內存對象的數量 低於low水線時,共享內存守護進程就會觸發一次共享內存區的添加請求,新創建一個共 享內存區補充到該共享內存池中,以優化內存的使用。當空閒的共享內存對象的數量高 於high水線時,共享內存守護進程就會觸發一次共享內存區的回收請求,此時若有處於空 閒狀態的共享內存區則將其回收,每次從共享內存池的空閒狀態鍊表中銷毀一個共享內存 區,釋放其中佔據的物理頁回到系統內存中,以防止共享內存區的空閒內存太多而其他應 用程序的內存申請將出現申請不到的現象。步驟S24:將待傳遞數據存放至所選擇的共享內存區中空閒的共享內存對象中。步驟S12中描述了共享內存區的三種可能的狀態,在選擇時優先選擇的是處於部 分佔用狀態的共享內存區。而為了方便地管理共享內存池中的共享內存區,快速實現共享 內存對象的分配與釋放,在共享內存池中針對每一類共享內存區維護一條雙向鍊表。每個 共享內存池包含三條鍊表完全佔用鍊表、部分佔用鍊表和空閒狀態鍊表。上述共享內存池(SHM Pool)、共享內存區(SHM)、共享內存對象(SHMObject)三者 之間的關係如圖5所示。其中部分佔用狀態的共享內存區中的共享內存對象有一部分已經 佔用另一部分尚未佔用,完全佔用狀態的共享內存區中的都是佔用的共享內存對象(圖5 中點狀填充的共享內存對象),而空閒的共享內存中都是空閒的共享內存對象(圖5中未填 充的共享內存對象)。當應用程式向共享內存池申請一個空閒內存對象時,就可以根據部分佔用鍊表優 先選擇部分佔用狀態的共享內存區,如果不存在,在根據空閒狀態鍊表選擇空閒狀態的共 享內存區。選擇了共享內存區之後,根據所選擇的共享內存區頭部包括的共享內存對象起始 地址和第一個空閒的共享內存對象的下標,查找到第一個空閒的共享內存對象,存儲待傳 遞數據。具體在共享內存區的頭部設置描述符,用於描述共享內存區的共享內存對象的起 始地址以及第一個空閒的共享內存對象,如圖6所示。頭部描述符中包含的First obj即 為共享內存對象的起始地址,free = 2即為第一個空閒的內存對象的下標。從圖6中的對 象描述符數組,可以看出,該共享內存區包含的多個共享內存對象中下標為0、1、3、6、9的 共享內存對象是已經佔用的,下標為2、4、5、7、8的共享內存對象是沒有佔用的。其中空閒的共享內存對象通過下標數組管理以便分配,下標數組中每個空閒共享 內存對象的位置處存儲下一個空閒的共享內存對象的下標。即在頭部指定了第一個空閒的 共享內存對象的下標後,通過一個下標數組來維護和關聯後續的空閒共享內存對象。即每 個空閒的共享內存對象通過下標的方式關聯下一個空閒的共享內存對象,實現了 SHM內部 空閒對象的簡單關聯,這種利用下標數組來進行空閒內存對象維護的方法簡單、有效,既提 高了內存分配效率,又節約了內存空間。
例如圖6中,在共享內存區頭部描述符有一個指針指向第一個空閒的共享內存對 象,還有一個第一空閒的共享內存對象的下標(free欄位)指明了第一個空閒內存對象的 下標為2。以這個下標為索引,在下標為2的空閒的共享內存對象的位置處又可以找到下一 個空閒的共享內存對象的下標4,依此類推,一直到下標為END為止,表明下面沒有空閒的 共享內存對象了。如此,就構成了一個簡單的空閒共享內存對象鍊表。步驟S25 將存放數據後的共享內存對象標記為佔用狀態。優選的,將待傳遞數據存放至所選擇的共享內存區中空閒的共享內存對象中並將 所選擇的共享內存對象標記為佔用狀態,具體包括將將存儲了待傳遞數據的第一個空閒的共享內存對象標記為佔用狀態,並根據設 置的空閒共享內存對象的下標數組確定存儲了代傳遞數據的共享內存對象的下一個空閒 的共享內存對象的下標,將共享內存區頭部包括的第一個空閒的共享內存對象的下標更新 為確定出的下一個空閒的共享內存對象的下標。當存儲了待傳遞數據的第一個空閒的共享內存對象的下一個下標為END時,將共 享內存區頭部包括的第一個空閒的共享內存對象的下標更新為空或更新為END,以標識該 共享內存區的共享內存對象已被完全佔用,不存在空閒的共享內存對象了。沿用如圖6所示的共享內存區的共享內存區描述結構示意圖。每次分配出去一個 對象,只要把共享內存區頭部描述符中的free欄位更新為下一個空閒的共享內存對象的 下標即可。優選的,將待傳遞數據存放至所選擇的共享內存對象中之後,還包括若所選擇的共享內存區為部分佔用狀態的共享內存區,且存放待傳遞數據後所選 擇的共享內存對象所在的共享內存區的所有共享內存對象已被全部佔用,則將該共享內存 區更改為完全佔用狀態,並從部分佔用鍊表中轉移到完全佔用鍊表中;若所選擇的共享內 存區為空閒狀態的共享內存區,則將該共享內存區更改為部分佔用狀態,並從空閒狀態鏈 表中轉移到部分佔用鍊表中。也就是說,每從空閒狀態鍊表申請到一個空閒共享內存對象,就將該共享內存區 轉移到部分佔用鍊表中。當某個共享內存區中的空閒對象全部分配出去之後,該共享內存 區就從部分佔用鍊表中轉移到完全佔用鍊表中。步驟S26 根據待傳遞數據在第一進程中的偏移地址,確定第二進程從共享內存 區中獲取待傳遞數據的指針地址。具體實現過程參見步驟S15。步驟S27 第二進程根據確定的指針地址獲取共享內存區中的待傳遞數據。較佳的,上述跨區域數據傳輸方法,在第二進程獲取待傳遞數據釋放共享內存對 象後,還包括步驟S28 更新所選擇的共享內存區中的空閒的共享內存對象的下標數組。具體可以有兩種方式實現釋放的共享內存對象與已有的空閒共享內存對象的關 聯方式一將共享內存區頭部的第一個空閒的的共享內存對象的下標更換為釋放的 共享內存對象的下標,將更改前共享內存區頭部包括的第一個空閒的共享內存對象的下標 添加到下標數組中上述釋放的的共享內存對象的位置處,實現上述釋放的共享內存對象指向的下一個空閒狀態的內存對象為更改前共享內存區的第一個空閒的共享內存對象。方式二 將釋放的共享內存對象的下標添加到下標數組中最後一個空閒狀態的共 享內存對象的位置處,實現共享內存區中最後一個空閒狀態的對共享內存象指向的下一個 空閒狀態的共享內存對象為釋放的共享內存對象。以方式一為例,釋放一個共享內存對象的時候,只要將這個共享內存對象的下標 設置為第一個空閒共享內存對象的下標,然後再將共享內存區域中原來的第一個空閒共享 內存對象的下標添加到下標數組剛釋放的共享內存對象的對應位置處,就完成了共享內存 對象的釋放。這個過程相當於將共享內存對象釋放到空閒鍊表的頭部。這種表示方法,使 得共享內存對象的分配和釋放都要比直接採用鍊表操作快得多。優選的,在第二進程獲取所述待傳遞數據釋放共享內存對象後,還包括若釋放的 共享內存區為部分佔用狀態的共享內存區,且釋放共享內存區後所在的共享內存區的所有 共享內存對象已被全部釋放,則將該共享內存區更改為空閒狀態,並從部分佔用鍊表中轉 移到空閒狀態鍊表中;若所選擇的共享內存區為完全佔用狀態的共享內存區,則將該共享 內存區更改為部分佔用狀態,並從完全佔用鍊表中轉移到部分佔用鍊表中。也就是說,如果共享內存對象釋放回的是完全佔用的共享內存區,該共享內存區 就從完全佔用鍊表轉移到部分佔用鍊表中;如果內存對象釋放回一個部分佔用的共享內存 區之後,該共享內存區中所有對象都是空閒的共享內存對象了,則該共享內存區就從部分 佔用鍊表轉移到空閒狀態鍊表中。根據本發明實施例提供的上述跨進程數據傳輸方法可以構建一種跨進程數據傳 輸裝置,該裝置可以設置在任何具有多個進程處理數據的網絡設備中,實現多個進程之間 的數據傳輸,該裝置的結構如圖7所示,包括內存池選擇模塊10、區域選擇模塊20、傳輸控 制模塊30和地址確定模塊40。內存池選擇模塊10,用於根據第一進程中待傳遞數據的大小和預先創建的各共享 內存池中共享內存區所包含的共享內存對象的大小,選擇適於存放所述待傳遞數據的共享 內存池;每個共享內存池中的各共享內存區包含的共享內存對象的大小相同。優選的,上述內存池選擇模塊10,具體包括比較單元101和區域選擇單元102。比較單元101,用於根據第一進程中待傳遞數據的大小,確定包含的共享內存對象 的大小大於待傳遞數據的大小的共享內存池。區域選擇單元102,用於從確定的共享內存池中選擇一個共享內存對象最小的共 享內存池作為存放所述待傳遞數據的共享內存池。區域選擇模塊20,用於從內存池選擇模塊10選擇的內存池中選擇一個處於可使 用狀態的共享內存區。優選的,上述區域選擇模塊20,具體包括查找單元201和執行單元202。查找單元201,用於查找內存池選擇模塊10選擇的內存池中是否存在處於部分佔 用狀態的共享內存區。執行單元202,用於當選擇單元201查找到處於部分佔用狀態的共享內存區時,從 處於部分佔用狀態的共享內存區中選擇一個共享內存區;否則,從空閒狀態的共享內存區 中選擇一個共享內存區。傳輸控制模塊30,用於將待傳遞數據存放至區域選擇模塊20所選擇的共享內存
13區中空閒的共享內存對象中並將存放數據後的共享內存對象標記為佔用狀態。優選的,上述傳輸控制模塊30,具體包括數據傳輸單元301和第一標識單元302。數據傳輸單元301,用於根據區域選擇模塊20選擇共享內存區頭部包括的共享 內存對象起始地址和第一個空閒的共享內存對象的下標,查找到第一個空閒的共享內存對 象,存儲待傳遞數據。第一標識單元302,用於將存儲了待傳遞數據的第一個空閒的共享內存對象標記 為佔用狀態,並根據設置的空閒共享內存對象的下標數組確定存儲了代傳遞數據的共享內 存對象的下一個空閒的共享內存對象的下標,將共享內存區頭部包括的第一個空閒的共享 內存對象的下標更新為確定出的下一個空閒的共享內存對象的下標。優選的,上述傳輸控制模塊30,還包括第二標識單元303,用於若所選擇的共享內存區為部分佔用狀態的共享內存區,且 存放待傳遞數據後所選擇的共享內存對象所在的共享內存區的所有共享內存對象已被全 部佔用,則將該共享內存區更改為完全佔用狀態,並從部分佔用鍊表中轉移到完全佔用鏈 表中;若所選擇的共享內存區為空閒狀態的共享內存區,將待傳遞數據存放至所選擇的共 享內存對象中之後,將該共享內存區更改為部分佔用狀態,並從空閒狀態鍊表中轉移到部 分佔用鍊表中。優選的,上述傳輸控制模塊30,還包括第三標識單元304,用於在第二進程獲取待傳遞數據釋放共享內存對象後,更新共 享內存區中的空閒內存對象的下標數組。具體包括將共享內存區頭部的第一個空閒的的 共享內存對象的下標更換為釋放的共享內存對象的下標,將更改前共享內存區頭部包括的 第一個空閒的共享內存對象的下標添加為下標數組中上述釋放的的共享內存對象的下標 的後一位下標,實現上述釋放的共享內存對象指向的下一個空閒狀態的內存對象為更改前 共享內存區的第一個空閒的共享內存對象;或將釋放的共享內存對象的下標添加到下標數 組的末尾,實現共享內存區中最後一個空閒狀態的共享內存對象指向的下一個空閒狀態的 共享內存對象為釋放的共享內存對象。優選的,上述傳輸控制模塊30,還包括第四標識單元305,用於在第二進程獲取待傳遞數據釋放所述共享內存對象後,若 釋放的共享內存區為部分佔用狀態的共享內存區,且釋放共享內存區後所在的共享內存區 的所有共享內存對象已被全部釋放,則將該共享內存區更改為空閒狀態,並從部分佔用鏈 表中轉移到空閒狀態鍊表中;若所選擇的共享內存區為完全佔用狀態的共享內存區,則將 該共享內存區更改為部分佔用狀態,並從完全佔用鍊表中轉移到部分佔用鍊表中。地址確定模塊40,用於根據數據傳遞模塊存儲的待傳遞數據在第一進程中的偏移 地址,確定第二進程從共享內存區中獲取所述待傳遞數據的指針地址。優選的,上述地址確定模塊40,具體用於根據待傳遞數據第一進程中的指針地 址和第一進程的基址,確定待傳遞數據在所述第一進程中的偏移地址;根據該偏移地址和 第二進程的基址,確定待傳遞數據在第二進程中的指針地址。優選的,上述跨進程數據傳輸裝置,還包括狀態監控模塊50和區域調整模塊60。狀態監控模塊50,用於監控共享內存池中處於空閒的共享內存對象的數量或比 例。
區域調整模塊60,用於當空閒的共享內存對象的數量低於設定的第一數量閾值或 空閒的共享內存對象的比例低於設置的第一比例閾值時,在共享內存池中添加新的共享內 存區;當空閒的共享內存對象的數量高於設定的第二數量閾值或空閒的共享內存對象的比 例高於設置的第二比例閾值時,刪除共享內存池中處於空閒狀態的共享內存區。本發明實施例提供的上述跨區域數據傳輸方法,是一個通用的、快速實現數據報 文跨進程傳遞的方法。除了應用於協議數據報文的跨進程傳輸以外,還可以應用於其他各 種系統數據的跨進程傳輸,在需要大批量數據傳輸的系統中應用時具有明顯的優勢。本發 明實施例提供的上述方法中包含的多個共享內存區的管理和配置策略,可應用於系統中多 個共享內存區的管理以外,還可應用於進程內部的堆內存管理。本發明實施例提供的上述跨區域數據傳輸方法及裝置,通過將相同大小的共享內 存對象設置在一個共享內存池中,實現了在第一進程需要傳遞數據時,根據數據大小選擇 共享內存池,使用其中的共享內存對象,從而使得在需要傳輸數據時,能夠快速查找到合適 的共享內存區,不必再遍歷所有的共享內存區,方便了進程間的數據傳遞,在實現數據傳輸 零拷貝的情況下,減少了數據傳輸時查找的時延,提高了報文處理效率。該方法實現數據 的跨進程傳輸,既高效又可靠,很好的解決了進程間數據共享的低效問題,在傳遞諸如使用 IPv6協議的報文數據量可能非常龐大的數據包時,優勢尤為明顯。將相同大小的共享內存對象統一管理、分配,可以從很大程度上避免設置很多的 共享內存區,節約了內存資源;優先使用處於部分佔用狀態的共享內存區,從而使得處於空 閒狀態的共享內存區可以處於可刪除狀態,便於創建和刪除操作的執行,提高共享內存區 中的共享內存對象的利用率,且能夠快速實現內存分配,提高了內存分配和釋放效率,並有 效地節約系統內存,從而大幅提高內存利用率,大大提高了系統的處理性能,在對報文處理 性能和內存使用要求較高的網絡嵌入式系統中尤為適用。上述方式將協議報文的傳輸時間和內存空間利用率都有較高提升,因此可在網絡 嵌入式系統中大幅度提高應用協議的報文處理能力。在空閒的共享內存對象不夠用時,可 以及時添加,在空閒的共享內存對象比較多時,可以及時的釋放,同時避免了頻繁的共享內 存區的創建和刪除,也避免了過多的佔用內存空間導致佔據的物理頁將一直得不到真正釋 放,無法供應用程式申請的問題。顯然,本領域的技術人員可以對本發明進行各種改動和變型而不脫離本發明的精 神和範圍。這樣,倘若本發明的這些修改和變型屬於本發明權利要求及其等同技術的範圍 之內,則本發明也意圖包含這些改動和變型在內。
1權利要求
1.一種跨進程數據傳輸方法,其特徵在於,包括根據第一進程中待傳遞數據的大小和預先創建的各共享內存池中共享內存區所包含 的共享內存對象的大小,選擇適於存放所述待傳遞數據的共享內存池;每個所述共享內存 池中的各共享內存區包含的共享內存對象的大小相同;從選擇的內存池中選擇一個處於可使用狀態的共享內存區,將所述待傳遞數據存放至 所選擇的共享內存區中空閒的共享內存對象中並將存放數據後的共享內存對象標記為佔 用狀態;根據所述待傳遞數據在所述第一進程中的偏移地址,確定第二進程從共享內存區中獲 取所述待傳遞數據的指針地址。
2.如權利要求1所述的方法,其特徵在於,所述根據第一進程中待傳遞數據的大小和 預先創建的各共享內存池中共享內存區所包含的共享內存對象的大小,選擇適於存放所述 待傳遞數據的共享內存池,包括根據第一進程中待傳遞數據的大小,確定包含的共享內存對象的大小大於待傳遞數據 的大小的共享內存池;從確定的共享內存池中選擇一個共享內存對象最小的共享內存池作為存放所述待傳 遞數據的共享內存池。
3.如權利要求1所述的方法,其特徵在於,根據共享內存區中的共享內存對象是否完 全被佔用,所述共享內存池中的共享內存區的狀態包括完全佔用狀態、部分佔用狀態和空 閒狀態;通過設置的完全佔用鍊表、部分佔用鍊表和空閒狀態鍊表維護處於完全佔用狀態、部 分佔用狀態和空閒狀態的共享內存區。
4.如權利要求3所述的方法,其特徵在於,所述從選擇的內存池中選擇一個處於可使 用狀態的共享內存區,具體包括查找選擇的內存池中是否存在處於部分佔用狀態的共享內存區;若是,從處於部分佔用狀態的共享內存區中選擇一個共享內存區;否則,從空閒狀態的 共享內存區中選擇一個共享內存區。
5.如權利要求3所述的方法,其特徵在於,將所述待傳遞數據存放至所選擇的共享內 存區中空閒的共享內存對象中並將所選擇的共享內存對象標記為佔用狀態,具體包括根據所選擇的共享內存區頭部包括的共享內存對象起始地址和第一個空閒的共享內 存對象的下標,查找到第一個空閒的共享內存對象,存儲所述待傳遞數據;將存儲了待傳遞數據的第一個空閒的共享內存對象標記為佔用狀態,並根據設置的空 閒共享內存對象的下標數組確定存儲了代傳遞數據的共享內存對象的下一個空閒的共享 內存對象的下標,將共享內存區頭部包括的第一個空閒的共享內存對象的下標更新為確定 出的下一個空閒的共享內存對象的下標;所述下標數組中每個空閒共享內存對象的位置處 存儲下一個空閒的共享內存對象的下標。
6.如權利要求3所述的方法,其特徵在於,將所述待傳遞數據存放至所選擇的共享內 存對象中之後,還包括若所選擇的共享內存區為部分佔用狀態的共享內存區,且存放所述待傳遞數據後所選 擇的共享內存對象所在的共享內存區的所有共享內存對象已被全部佔用,則將該共享內存區更改為完全佔用狀態,並從部分佔用鍊表中轉移到完全佔用鍊表中;若所選擇的共享內存區為空閒狀態的共享內存區,則將該共享內存區更改為部分佔用 狀態,並從空閒狀態鍊表中轉移到部分佔用鍊表中。
7.如權利要求3所述的方法,其特徵在於,還包括在第二進程獲取所述待傳遞數據釋 放所述共享內存對象後,更新共享內存區域中空閒共享內存對象的下標數組,具體包括將共享內存區頭部的第一個空閒的的共享內存對象的下標更換為釋放的共享內存對 象的下標,將更改前共享內存區頭部包括的第一個空閒的共享內存對象下標添加到下標數 組中上述釋放的的共享內存對象的位置處;或將釋放的共享內存對象的下標添加到下標數組中最後一個空閒狀態的共享內存對象 的位置處。
8.如權利要求3所述的方法,其特徵在於,在第二進程獲取所述待傳遞數據釋放所述 共享內存對象後,還包括若釋放的共享內存區為部分佔用狀態的共享內存區,且釋放共享內存區後所在的共享 內存區的所有共享內存對象已被全部釋放,則將該共享內存區更改為空閒狀態,並從部分 佔用鍊表中轉移到空閒狀態鍊表中;若所選擇的共享內存區為完全佔用狀態的共享內存區,則將該共享內存區更改為部分 佔用狀態,並從完全佔用鍊表中轉移到部分佔用鍊表中。
9.如權利要求1所述的方法,其特徵在於,所述根據所述待傳遞數據在所述第一進 程中的偏移地址,確定第二進程從共享內存區中獲取所述待傳遞數據的指針地址,具體包 括根據所述待傳遞數據第一進程中的指針地址和第一進程的基址,確定所述待傳遞數據 在所述第一進程中的偏移地址;根據該偏移地址和第二進程的基址,確定所述待傳遞數據在第二進程中的指針地址。
10.如權利要求1-9任一所述的方法,其特徵在於,還包括監控所述共享內存池中處 於空閒的共享內存對象的數量或比例;當空閒的共享內存對象的數量低於設定的第一數量閾值或空閒的共享內存對象的比 例低於設置的第一比例閾值時,在所述共享內存池中添加新的共享內存區;當空閒的共享內存對象的數量高於設定的第二數量閾值或空閒的共享內存對象的比 例高於設置的第二比例閾值時,刪除所述共享內存池中處於空閒狀態的共享內存區。
11.一種跨進程數據傳輸裝置,其特徵在於,包括內存池選擇模塊,用於根據第一進程中待傳遞數據的大小和預先創建的各共享內存 池中共享內存區所包含的共享內存對象的大小,選擇適於存放所述待傳遞數據的共享內存 池;每個所述共享內存池中的各共享內存區包含的共享內存對象的大小相同;區域選擇模塊,用於從所述內存池選擇模塊選擇的內存池中選擇一個處於可使用狀態 的共享內存區;傳輸控制模塊,用於將所述待傳遞數據存放至所述區域選擇模塊選擇的共享內存區中 空閒的共享內存對象中並將存放數據後的共享內存對象標記為佔用狀態;地址確定模塊,用於根據所述數據傳遞模塊存儲的待傳遞數據在所述第一進程中的偏 移地址,確定第二進程從共享內存區中獲取所述待傳遞數據的指針地址。
12.如權利要求11所述的裝置,其特徵在於,所述內存池選擇模塊,具體包括比較單元,用於根據第一進程中待傳遞數據的大小,確定包含的共享內存對象的大小 大於待傳遞數據的大小的共享內存池;區域選擇單元,用於從確定的共享內存池中選擇一個共享內存對象最小的共享內存池 作為存放所述待傳遞數據的共享內存池。
13.如權利要求11所述的裝置,其特徵在於,所述區域選擇模塊,具體包括查找單元,用於查找所述內存池選擇模塊選擇的內存池中是否存在處於部分佔用狀態 的共享內存區;執行單元,用於當所述選擇單元查找到處於部分佔用狀態的共享內存區時,從處於部 分佔用狀態的共享內存區中選擇一個共享內存區;否則,從空閒狀態的共享內存區中選擇 一個共享內存區。
14.如權利要求11所述的裝置,其特徵在於,所述傳輸控制模塊,具體包括數據傳輸單元,用於根據所述區域選擇模塊選擇的共享內存區頭部包括的共享內存對 象起始地址和第一個空閒的共享內存對象的下標,查找到第一個空閒的共享內存對象,存 儲所述待傳遞數據;第一標識單元,用於將存儲了待傳遞數據的第一個空閒的共享內存對象標記為佔用狀 態,並根據設置的空閒共享內存對象的下標數組確定存儲了代傳遞數據的共享內存對象的 下一個空閒的共享內存對象的下標,將共享內存區頭部包括的第一個空閒的共享內存對象 的下標更新為確定出的下一個空閒的共享內存對象的下標;所述下標數組中每個空閒共享 內存對象的位置處存儲下一個空閒的共享內存對象的下標。
15.如權利要求14所述的裝置,其特徵在於,所述傳輸控制模塊,還包括第二標識單元,用於若所選擇的共享內存區為部分佔用狀態的共享內存區,且存放所 述待傳遞數據後所選擇的共享內存對象所在的共享內存區的所有共享內存對象已被全部 佔用,則將該共享內存區更改為完全佔用狀態,並從部分佔用鍊表中轉移到完全佔用鍊表 中;若所選擇的共享內存區為空閒狀態的共享內存區,將所述待傳遞數據存放至所選擇的 共享內存對象中之後,將該共享內存區更改為部分佔用狀態,並從空閒狀態鍊表中轉移到 部分佔用鍊表中。
16.如權利要求14所述的裝置,其特徵在於,所述傳輸控制模塊,還包括第三標識單元,用於在第二進程獲取所述待傳遞數據釋放所述共享內存對象後,更新 共享內存區域中空閒共享內存對象的下標數組;具體包括將共享內存區頭部的第一個空 閒的的共享內存對象的下標更換為釋放的共享內存對象的下標,將更改前共享內存區頭部 包括的第一個空閒的共享內存對象的下標添加到下標數組中上述釋放的的共享內存對象 的位置處;或將釋放的共享內存對象的下標添加到下標數組中最後一個空閒狀態的共享內 存對象指向的下一個空閒狀態的共享內存對象的位置處。
17.如權利要求14所述的裝置,其特徵在於,所述數據傳輸模塊,還包括第四標識單元,用於在第二進程獲取所述待傳遞數據釋放所述共享內存對象後,若釋 放的共享內存區為部分佔用狀態的共享內存區,且釋放共享內存區後所在的共享內存區的 所有共享內存對象已被全部釋放,則將該共享內存區更改為空閒狀態,並從部分佔用鍊表 中轉移到空閒狀態鍊表中;若所選擇的共享內存區為完全佔用狀態的共享內存區,則將該共享內存區更改為部分佔用狀態,並從完全佔用鍊表中轉移到部分佔用鍊表中。
18.如權利要求11所述的裝置,其特徵在於,所述地址確定模塊,具體用於根據所述待傳遞數據第一進程中的指針地址和第一進程的基址,確定所述待傳遞數據 在所述第一進程中的偏移地址;根據該偏移地址和第二進程的基址,確定所述待傳遞數據在第二進程中的指針地址。
19.如權利要求11-18任一所述的裝置,其特徵在於,還包括狀態監控模塊,用於監控所述共享內存池中處於空閒的共享內存對象的數量或比例; 區域調整模塊,用於當空閒的共享內存對象的數量低於設定的第一數量閾值或空閒的 共享內存對象的比例低於設置的第一比例閾值時,在所述共享內存池中添加新的共享內存 區;當空閒的共享內存對象的數量高於設定的第二數量閾值或空閒的共享內存對象的比例 高於設置的第二比例閾值時,刪除所述共享內存池中處於空閒狀態的共享內存區。
20.一種網絡設備,其特徵在於,包括如權利要求11-19任一所述的跨進程數據傳輸裝置。
全文摘要
本發明公開了一種跨進程數據傳輸方法、裝置及網絡設備,該方法包括根據第一進程中待傳遞數據的大小和各共享內存池中共享內存區包含的共享內存對象的大小,選擇適於存放待傳遞數據的共享內存池;每個共享內存池中的各共享內存區包含的共享內存對象的大小相同;從選擇的內存池中選擇一個處於可使用狀態的共享內存區,將待傳遞數據存放至其中空閒的共享內存對象中並將該共享內存對象標記為佔用狀態;根據待傳遞數據在第一進程中的偏移地址,確定第二進程從共享內存區中獲取待傳遞數據的指針地址。根據數據大小選擇合適的共享內存池中的共享內存對象,提高了內存使用率,避免了頻繁的共享內存的創建和刪除,提高了系統性能。
文檔編號G06F9/54GK102004675SQ201010540148
公開日2011年4月6日 申請日期2010年11月11日 優先權日2010年11月11日
發明者劉忠東, 劉茗, 葉建興 申請人:福建星網銳捷網絡有限公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀