一種減少linux下多進程間數(shù)據(jù)拷貝的方法
【專利摘要】本發(fā)明涉及一種計算機應(yīng)用【技術(shù)領(lǐng)域】,具體地說是一種減少linux下多進程間數(shù)據(jù)拷貝的方法。包括步驟1:申請共享內(nèi)存組織;步驟2:將該共享內(nèi)存組織劃分成不同大小的內(nèi)存池,內(nèi)存池劃分成多個內(nèi)存塊;步驟3:進程A申請某一內(nèi)存塊,使用標識為占用標識,該內(nèi)存塊a的頭部域中的用戶計數(shù)計為1,步驟4:每多一個進程使用該內(nèi)存塊a中的數(shù)據(jù),用戶計數(shù)根據(jù)累加1,步驟5:每少一個進程使用該內(nèi)存塊a中的數(shù)據(jù),用戶計數(shù)根據(jù)累減1,直至該用戶計數(shù)為零,使用標識置為空閑標識,則該內(nèi)存塊a歸還內(nèi)存池中;本發(fā)明的方法能夠?qū)崿F(xiàn)進程間零拷貝的數(shù)據(jù)通訊;并且實現(xiàn)了一次數(shù)據(jù)的組織,不需要進行數(shù)據(jù)的多次拷貝,就能直接被多個進程使用。
【專利說明】—種減少Iinux下多進程間數(shù)據(jù)拷貝的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種計算機應(yīng)用【技術(shù)領(lǐng)域】,具體地說是一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法。
【背景技術(shù)】
[0002]Linux系統(tǒng)是基于虛擬內(nèi)存的系統(tǒng),其進程空間是獨立的,互相不可見的,每個進程獨立管理自己的內(nèi)存空間。進程間數(shù)據(jù)交互需要通過消息隊列、共享內(nèi)存、管道、文件等方式,這些方法要么需要進行數(shù)據(jù)的拷貝如消息隊列、管道等,甚至要多次進行數(shù)據(jù)拷貝才能使得在一個進程中組織的數(shù)據(jù)在另外一個進程中可見,而且每多一個進程使用數(shù)據(jù)就需要多一次數(shù)據(jù)的拷貝,效率較低;要么只能兩個進程間共享數(shù)據(jù),如普通的共享內(nèi)存,其通常的用方法是,為每兩個進程開辟一個內(nèi)存段作為共享內(nèi)存空間,來完成這兩個進程間的通訊,這塊共享內(nèi)存不能被多個進程復(fù)用,資源浪費嚴重。這就需要一種方法既能夠?qū)崿F(xiàn)進程間數(shù)據(jù)的高效交互,又能夠使得這塊內(nèi)存能夠被各個進程共享。
【發(fā)明內(nèi)容】
[0003]解決上述技術(shù)問題,本發(fā)明提供了一種組織和管理共享內(nèi)存的方式,針對LINUX操作系統(tǒng),能夠?qū)崿F(xiàn)進程間零拷貝的數(shù)據(jù)通訊;并且實現(xiàn)了一次數(shù)據(jù)的組織,不需要進行數(shù)據(jù)的多次拷貝,就能直接被多個進程使用。該方法不僅能用于進程間通訊,進程內(nèi)部各線程的通訊一樣可以支持,非常靈活高效。
[0004]為了達到上述目的,本發(fā)明所采用的技術(shù)方案是,一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,包括以下步驟:
步驟1:根據(jù)系統(tǒng)對數(shù)據(jù)的實際使用情況確定使用系統(tǒng)共享內(nèi)存的大小,并調(diào)用系統(tǒng)接口申請足夠大的共享內(nèi)存,定義為共享內(nèi)存組織;
步驟2:將該共享內(nèi)存組織劃分成不同大小的內(nèi)存池,每一內(nèi)存池由一個內(nèi)存頭和N個大小相同的內(nèi)存塊構(gòu)成,N為正整數(shù),該內(nèi)存頭用于存放每一內(nèi)存塊的使用標識,N個內(nèi)存塊以數(shù)組的形式線性排列在內(nèi)存頭后,每一內(nèi)存塊包括頭部域、數(shù)據(jù)域和尾域,頭部域用于存放用戶計數(shù)、內(nèi)存類型、內(nèi)存塊索引和界定標識;用戶數(shù)據(jù)域用于保存需要交互的數(shù)據(jù);尾域用于存放內(nèi)存的界定標識,內(nèi)存塊的尾域用來對內(nèi)存進行界定;
步驟3:應(yīng)用程序的進程A申請某一內(nèi)存塊時,從小到大依次查詢各內(nèi)存池中的各內(nèi)存塊,找到大小符合需求的內(nèi)存塊a,設(shè)置內(nèi)存頭中對應(yīng)該內(nèi)存塊a的使用標識為占用標識,將該內(nèi)存塊a的頭部域中的用戶計數(shù)計清零,并向內(nèi)存a塊寫入待交互的數(shù)據(jù);
步驟4:進程A將該內(nèi)存塊a中頭部域的內(nèi)存類型和內(nèi)存塊索引傳遞給目標進程D[i], (i=l,2,3……n,n為正整數(shù)),每多發(fā)送一個目標進程,進程A將該內(nèi)存塊a的頭部域中的用戶計數(shù)累加I;
步驟5:目標進程D[i]通過該內(nèi)存類型和內(nèi)存塊索引訪問到該內(nèi)存塊a,
步驟6:目標進程D [i]中,每減少一個目標進程使用該內(nèi)存塊a中數(shù)據(jù)域中的數(shù)據(jù)時,則將該內(nèi)存塊a的頭部域中的用戶計數(shù)累減1,直至該用戶計數(shù)為零,當(dāng)用戶計數(shù)減為零時,設(shè)置內(nèi)存頭對應(yīng)于該內(nèi)存塊a的使用標識為空閑標識,把內(nèi)存塊釋放到內(nèi)存池中,以供
重復(fù)使用。
[0005]進一步的,所述用戶數(shù)據(jù)域的大小為給內(nèi)存池大小的累加和。
[0006]進一步的,步驟2中,所述內(nèi)存池中各內(nèi)存塊的內(nèi)存頭、頭域、用戶數(shù)據(jù)域、尾域均為4n字節(jié),當(dāng)任意字段字節(jié)數(shù)不足4n字節(jié)時,則補充填充字段,使得滿足4n字節(jié)的大小空間,最大程度上提聞內(nèi)存讀與的效率。更進一步的,每一內(nèi)存塊的內(nèi)存頭的頭部域大小為4字節(jié),用戶數(shù)據(jù)域的字節(jié)數(shù)由內(nèi)存池的類型決定,尾域中的界定標識為I個字節(jié),填充字段為3個字節(jié)。
[0007]進一步的,步驟2中,內(nèi)存池中的內(nèi)存頭存放有N個內(nèi)存塊的使用標識,當(dāng)內(nèi)存頭占用的字節(jié)數(shù)不足4的倍數(shù),則內(nèi)存頭補充填充字段。
[0008]進一步的,所述用戶數(shù)據(jù)域的大小為給內(nèi)存池大小的累加和。
[0009]進一步的,步驟3中,應(yīng)用程序的進程A申請到內(nèi)存塊a時,將內(nèi)存塊a的數(shù)據(jù)域的首地址返回給申請者。
[0010]進一步的,步驟6中,當(dāng)進程不再使用該內(nèi)存塊a時,則通過把待釋放的指針減去一個固定的頭域大小,即可得到所使用內(nèi)存的信息——內(nèi)存所屬的內(nèi)存池、內(nèi)存的使用計數(shù),把內(nèi)存的使用計數(shù)減一,如果為零,則說明說有使用該內(nèi)存的用戶都已經(jīng)釋放了,則把該內(nèi)存塊歸還的內(nèi)存池中;否則,直接返回。
[0011]進一步的,所述頭域和尾域中的界定標識為特定的字符,在申請和釋放內(nèi)存時進行內(nèi)存越界的檢查,以識別內(nèi)存操作問題。
[0012]本發(fā)明通過采用上述技術(shù)方案,與現(xiàn)有技術(shù)相比,具有如下優(yōu)點:
1、本發(fā)明充分考慮了數(shù)據(jù)操作的效率,設(shè)定該內(nèi)存頭、頭部域、數(shù)據(jù)域和尾域的大小滿足4n字節(jié),η為正整數(shù),保證申請內(nèi)存的4字節(jié)對齊,保證了操作系統(tǒng)對數(shù)據(jù)訪問的時候,實現(xiàn)地址的4字節(jié)對齊的,進而實現(xiàn)對整型數(shù)據(jù)的快速訪問;
2、本發(fā)明使用數(shù)組的方式進行內(nèi)存池的管理,每一內(nèi)存池由一個內(nèi)存頭和N個大小相同的內(nèi)存塊構(gòu)成,N為正整數(shù),內(nèi)存塊索引存放了該內(nèi)存塊在內(nèi)存池中數(shù)組中所排列的位置,即內(nèi)存塊索引為N,則表示該內(nèi)存塊為內(nèi)存池中的第N塊內(nèi)存,無需內(nèi)存塊鏈表式的插入和取出,快速便捷;
3、本發(fā)明對頭尾界定符使用固定的字符標識越界情況,在申請和釋放時進行判斷,防止內(nèi)存的越界;在申請的時候,把頭尾界定符設(shè)置為指定的字符,在釋放的時候?qū)Υ诉M行檢查,如果界定符不是該字符,說明內(nèi)存越界了,能夠快速跟蹤分析到該系統(tǒng)異常問題;
4、本發(fā)明通過使用標識,指示內(nèi)存的使用情況,實現(xiàn)單用戶申請,多用戶使用,特別適合于分發(fā)類數(shù)據(jù)傳遞情況;
5、本發(fā)明建立在共享內(nèi)存的基礎(chǔ)上,共享內(nèi)存本身是多進程都可見的,采用內(nèi)存池劃分為同樣大小N個內(nèi)存塊的集合,在整個系統(tǒng)的運行過程中形成了系統(tǒng)化,組織化和通用化,使得目標進程能夠靈活易用,滿足了多進程頻繁大批量數(shù)據(jù)交互,無需各進程之間進行拷貝,極大地提高了系統(tǒng)的效率。
【專利附圖】
【附圖說明】[0013]圖1是本發(fā)明的實施例的共享內(nèi)存組織結(jié)構(gòu)圖;
圖2是本發(fā)明的實施例的應(yīng)用場景示意圖;
圖3是本發(fā)明的實施例的內(nèi)存申請示意圖;
圖4是本發(fā)明的實施例的內(nèi)存釋放示意圖;
圖5是本發(fā)明的實施例的內(nèi)存檢索示意圖。
【具體實施方式】
[0014]現(xiàn)結(jié)合附圖和【具體實施方式】對本發(fā)明進一步說明。
[0015]作為一個具體的實施例,本發(fā)明的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,包括以下步驟:
步驟1:劃分共享內(nèi)存,定義為共享內(nèi)存組織;
步驟2:參考圖1所示,將該共享內(nèi)存組織劃分成不同大小的η個內(nèi)存池,每一內(nèi)存池由一個內(nèi)存頭和N個大小相同的內(nèi)存塊構(gòu)成,N為正整數(shù),不同內(nèi)存池間的內(nèi)存塊大小不同,該內(nèi)存頭用于存放每一內(nèi)存塊的使用標識,N個內(nèi)存塊以數(shù)組的形式線性排列在內(nèi)存頭后,每一內(nèi)存塊包括頭部域、數(shù)據(jù)域和尾域,頭部域用于存放用戶計數(shù)、內(nèi)存類型、內(nèi)存塊索引和界定標識;用戶數(shù)據(jù)域用于保存需要交互的數(shù)據(jù);尾域用于存放內(nèi)存的界定標識,內(nèi)存塊的尾域用來對對內(nèi)存進行界定,在申請和釋放時進行檢查,防止內(nèi)存使用的越界,利于檢查內(nèi)存的泄露。所述內(nèi)存頭、頭部域、數(shù)據(jù)域和尾域的大小滿足4η字節(jié),η為正整數(shù)。所述用戶數(shù)據(jù)域的大小依據(jù)該內(nèi)存池的劃分的空間以及內(nèi)存池的類型來劃分,同一內(nèi)存池中的N個內(nèi)存塊的用戶數(shù)據(jù)域的大小相同。所述尾域中的界定標識為I個字節(jié),填充字段為3個字節(jié)。每一內(nèi)存池中的內(nèi)存頭存放有N個內(nèi)存塊的使用標識,當(dāng)內(nèi)存頭占用的字節(jié)數(shù)不足4η字節(jié),則在內(nèi)存頭中補充填充字段,使得滿足4η字節(jié)的大小空間。
[0016]步驟3:應(yīng)用程序的進程A申請某一內(nèi)存塊時,根據(jù)申請內(nèi)存的大小,從小到大查詢依次查詢各內(nèi)存池中的各內(nèi)存塊,找到大小符合需求的內(nèi)存塊a,該查詢方式包括:從小到大查詢依次查詢各內(nèi)存池,首先找到數(shù)據(jù)域大于該申請內(nèi)存大小的的內(nèi)存池,然后在該內(nèi)存池中找空閑的內(nèi)存塊,如果找不到則繼續(xù)輪詢下一個內(nèi)存池,直到找到大小符合需求的內(nèi)存塊a,該內(nèi)存塊a即為查找到的第一個滿足需求的最小的內(nèi)存塊,若找不到滿足需求的內(nèi)存塊,則返回失敗。
[0017]找到大小符合需求的內(nèi)存塊a后,設(shè)置內(nèi)存頭中對應(yīng)該內(nèi)存塊a的使用標識為占用標識,將該內(nèi)存塊a的頭部域中的用戶計數(shù)計清零,并向內(nèi)存塊a的用戶數(shù)據(jù)域?qū)懭霐?shù)據(jù);
步驟4:進程A將該內(nèi)存塊a頭部域內(nèi)存類型和內(nèi)存塊索引傳遞給目標進程D[i], (i=l,2,3……n,n為正整數(shù)),每多發(fā)送一個目標進程,進程A將該內(nèi)存塊a的頭部域中的用戶計數(shù)累加I ;
步驟5:目標進程D[i]通過該內(nèi)存類型和內(nèi)存塊索引訪問到該內(nèi)存塊a,再根據(jù)內(nèi)存塊a的構(gòu)成找到用戶數(shù)據(jù)的地址,通過該地址操作數(shù)據(jù)域,即可獲得進程A存入內(nèi)存a的數(shù)據(jù),無需進行進程A與目標進程D[i]之間的數(shù)據(jù)拷貝,
步驟6:目標進程D[i]中,每減少一個目標進程使用該內(nèi)存塊a中數(shù)據(jù)域中的數(shù)據(jù)時,則將該內(nèi)存塊a的頭部域中的用戶計數(shù)累減1,直至該用戶計數(shù)為零,設(shè)置內(nèi)存頭對應(yīng)于該內(nèi)存塊a的使用標識為空閑標識,此時該內(nèi)存塊a成為了內(nèi)存池中空閑的內(nèi)存塊,可以供其它進程使用。
[0018]本方案中使用數(shù)組的方式進行內(nèi)存池的管理,無需內(nèi)存塊鏈表式的插入和取出;由于每一內(nèi)存池由一個內(nèi)存頭和N個大小相同的內(nèi)存塊構(gòu)成,N為正整數(shù),內(nèi)存塊索引存放了該內(nèi)存塊在內(nèi)存池中數(shù)組中所排列的位置,即內(nèi)存塊索引為N,則表示該內(nèi)存塊為內(nèi)存池中的第N塊內(nèi)存。
[0019]本實施例將頭尾界定符使用固定的字符標識越界情況,在申請和釋放時進行判斷,防止內(nèi)存的越界;頭尾界定符用來在申請內(nèi)存和釋放內(nèi)存的時候?qū)?nèi)存的頭部和尾部進行界定,在申請的時候,把頭尾界定符設(shè)置為指定的字符‘M’,在釋放的時候?qū)Υ诉M行檢查,如果界定符不是‘M’字符,說明內(nèi)存越界了,系統(tǒng)拋出異常,用戶可以據(jù)此分析出問題的點。由于內(nèi)存越界不是容易察覺的情況,一般內(nèi)存越界不會立即出現(xiàn)異常,等出現(xiàn)異常的時候,已經(jīng)很難知道什么時候出現(xiàn)的問題了,因此使用界定符,在釋放的時候?qū)Υ诉M行檢查,使得用戶能夠及時的發(fā)現(xiàn)出問題的點,可以據(jù)此來進行跟蹤分析找到問題。
[0020]本實施例通過使用標識,指示內(nèi)存的使用情況,實現(xiàn)單用戶申請,多用戶使用,特別適合于分發(fā)類數(shù)據(jù)傳遞情況;
本發(fā)明建立在共享內(nèi)存的基礎(chǔ)上,共享內(nèi)存本身是多進程都可見的,采用內(nèi)存池劃分為同樣大小N個內(nèi)存塊的集合,在整個系統(tǒng)的運行過程中形成了系統(tǒng)化,組織化和通用化,使得目標進程能夠靈活易用,滿足了多進程頻繁大批量數(shù)據(jù)交互,無需各進程之間進行拷貝,極大地提高了系統(tǒng)的效率。
[0021]參考圖2和圖3所示,在一個【具體實施方式】中,預(yù)先建立4個內(nèi)存池共,各內(nèi)存池包含的內(nèi)存塊的大小和內(nèi)存塊的個數(shù)定義如下:第一內(nèi)存池,包含50個內(nèi)存塊,每個內(nèi)存塊的大小為100字節(jié);第二內(nèi)存池,包含50個內(nèi)存塊,每個內(nèi)存塊的大小為512字節(jié);第三內(nèi)存池,包含100個內(nèi)存塊,每個內(nèi)存塊的大小為1024字節(jié);第四內(nèi)存組,包含100個內(nèi)存塊,每個內(nèi)存塊的大小為10240字節(jié)。各內(nèi)存池按從小到大的順序排列在共享內(nèi)存中,那么需要申請的共享內(nèi)存大小為52 (內(nèi)存頭)+50* (100 (用戶數(shù)據(jù)字段)+ 4 (頭域)+ 4 (尾域))+52+50* (512+4+4)) +100+100* (1024+4+4) +100+100* (10240+4+4) =1159704 (字節(jié))。
[0022]數(shù)值和內(nèi)存池中用戶數(shù)據(jù)大小的映射關(guān)系如下
【權(quán)利要求】
1.一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:包括以下步驟: 步驟1:劃分共享內(nèi)存,定義為共享內(nèi)存組織; 步驟2:將該共享內(nèi)存組織劃分成不同大小的內(nèi)存池,每一內(nèi)存池由一個內(nèi)存頭和N個大小相同的內(nèi)存塊構(gòu)成,N為正整數(shù),該內(nèi)存頭用于存放每一內(nèi)存塊的使用標識,N個內(nèi)存塊以數(shù)組的形式線性排列在內(nèi)存頭后,每一內(nèi)存塊包括頭部域、用戶數(shù)據(jù)域和尾域,頭部域用于存放用戶計數(shù)、內(nèi)存類型、內(nèi)存塊索引和界定標識;用戶數(shù)據(jù)域用于保存需要交互的數(shù)據(jù);尾域用于存放內(nèi)存的界定標識,內(nèi)存塊的尾域用來對內(nèi)存進行界定; 步驟3:應(yīng)用程序的進程A申請某一內(nèi)存塊時,從小到大依次查詢各內(nèi)存池中的各內(nèi)存塊,找到大小符合需求的內(nèi)存塊a,設(shè)置內(nèi)存頭中對應(yīng)該內(nèi)存塊a的使用標識為占用標識,將該內(nèi)存塊a的頭部域中的用戶計數(shù)計清零,并向內(nèi)存a塊寫入待交互的數(shù)據(jù); 步驟4:進程A將該內(nèi)存塊a中頭部域的內(nèi)存類型和內(nèi)存塊索引傳遞給目標進程D[i], (i=l,2,3……n,n為正整數(shù)),每多發(fā)送一個目標進程,進程A將該內(nèi)存塊a的頭部域中的用戶計數(shù)累加I1; 步驟5:目標進程D[i]通過該內(nèi)存類型和內(nèi)存塊索引訪問到該內(nèi)存塊a, 步驟6:目標進程D [i]中,每減少一個目標進程使用該內(nèi)存塊a中數(shù)據(jù)域中的數(shù)據(jù)時,則將該內(nèi)存塊a的頭部域中的用戶計數(shù)累減1,直至該用戶計數(shù)為零,當(dāng)用戶計數(shù)減為零時,設(shè)置內(nèi)存頭對應(yīng)于該內(nèi)存塊a的使用標識為空閑標識,把內(nèi)存塊釋放到內(nèi)存池中,以供重復(fù)使用。
2.根據(jù)權(quán)利要求1所述的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:步驟2中,N為正整數(shù)。
3.根據(jù)權(quán)利要求1所述的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:步驟2中,所述內(nèi)存池中各內(nèi)存塊的內(nèi)存頭、頭域、用戶數(shù)據(jù)域、尾域均為4n字節(jié),當(dāng)任意字段字節(jié)數(shù)不足4n字節(jié)時,則補充填充字段,使其滿足4n字節(jié)的大小空間。
4.根據(jù)權(quán)利要求3所述的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:每一內(nèi)存塊的內(nèi)存頭的頭部域大小為4字節(jié),用戶數(shù)據(jù)字段的字節(jié)數(shù)由內(nèi)存池的類型決定,尾域中的界定標識為I個字節(jié),填充字段為3個字節(jié)。
5.根據(jù)權(quán)利要求1所述的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:步驟2中,內(nèi)存池中的內(nèi)存頭存放有N個內(nèi)存塊的使用標識,當(dāng)內(nèi)存頭占用的字節(jié)數(shù)不足4的倍數(shù),則內(nèi)存頭補充填充字段。
6.根據(jù)權(quán)利要求1所述的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:步驟3中,應(yīng)用程序的進程A申請到內(nèi)存塊a時,將內(nèi)存塊a的數(shù)據(jù)域的首地址返回給申請者。
7.根據(jù)權(quán)利要求1所述的一種減少Iinux下多進程間數(shù)據(jù)拷貝的方法,其特征在于:步驟6中,當(dāng)進程不再使用該內(nèi)存塊a時,則通過把待釋放的指針減去一個固定的頭域大小,得到所使用內(nèi)存的信息,該信息包括:內(nèi)存所屬的內(nèi)存池和內(nèi)存的使用計數(shù),再將內(nèi)存的使用計數(shù)減一,如果該內(nèi)存的使用技術(shù)為零,則把該內(nèi)存塊歸還的內(nèi)存池中;否則,直接返回。
【文檔編號】G06F3/06GK103838859SQ201410100323
【公開日】2014年6月4日 申請日期:2014年3月19日 優(yōu)先權(quán)日:2014年3月19日
【發(fā)明者】任賦, 陳從華, 鄭福弟, 李培明, 黃杭星, 范少卓 申請人:廈門雅迅網(wǎng)絡(luò)股份有限公司