專利名稱:工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法
技術(shù)領(lǐng)域:
本發(fā)明是一種工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法。涉及信息的存儲、數(shù)據(jù)的識別和控制技術(shù)領(lǐng)域。
背景技術(shù):
工業(yè)實時數(shù)據(jù)庫為大型SCADA系統(tǒng)中的核心組件,一般應(yīng)用于大型控制中心,對容量、吞吐量、并發(fā)性和實時性等性能指標(biāo)有苛刻的要求,例如:北京油氣調(diào)控中心,預(yù)計系統(tǒng)容量超過50萬個信號量,每秒處理為10萬以上事件,100個左右的客戶端并發(fā)訪問。這樣的系統(tǒng)在運行時,涉及頻繁的大小不等的內(nèi)存分配釋放的,采用C或C++語言開發(fā),通常是調(diào)用C運行庫的內(nèi)存管理函數(shù)。這樣做帶來的問題有:C運行庫的內(nèi)存管理函數(shù)是整個進程共用,多線程并發(fā)訪問對性能有較大影響;進程訪問的內(nèi)存分配釋放,在測試中發(fā)現(xiàn),其性能受系統(tǒng)其它運行程序影響較大,在要求實時性比較高的應(yīng)用中,這種不確定性給性能優(yōu)化帶來一定困難;工業(yè)實時數(shù)據(jù)庫通常是運行于后臺的服務(wù)程序,需要高效的傳遞復(fù)雜數(shù)據(jù)類型,在網(wǎng)絡(luò)數(shù)據(jù)流和內(nèi)存數(shù)據(jù)結(jié)構(gòu)之間轉(zhuǎn)化必然涉及內(nèi)存分配釋放,這要求客戶端和服務(wù)端對內(nèi)存有統(tǒng)一的處理方式;C運行庫要求程序開發(fā)人員成對進行分配和釋放,給開發(fā)人員帶來較大負擔(dān),很容易造成內(nèi)存泄露,而且這樣的缺陷極不容易發(fā)現(xiàn)。如錯誤!未找到引用源。為工業(yè)實時數(shù)據(jù)庫體系結(jié)構(gòu),實時存儲引擎是一個高速的嵌入式數(shù)據(jù)管理引擎,存放的所有信息數(shù)據(jù),支持整個系統(tǒng)運行。其重要的數(shù)據(jù)處理流程是,數(shù)據(jù)采集器把一批(如50個)采集的信號量發(fā)送給工業(yè)實時數(shù)據(jù)庫,工業(yè)實時數(shù)據(jù)庫在內(nèi)存或磁盤上檢索這些信號量的配置信息,根據(jù)配置信息處理這些信號量,如報警、計算,處理完成后保存數(shù)據(jù),并把數(shù)據(jù)推送給需要的客戶端。從邏輯上講,工業(yè)實時數(shù)據(jù)庫按“點”(信號量)組織數(shù)據(jù),由于采用實時存儲引擎存儲全局信息,任務(wù)之間的數(shù)據(jù)關(guān)聯(lián)性比較小,調(diào)用的上下文關(guān)系簡單,因此比較容易把工業(yè)實時數(shù)據(jù)庫處理邏輯劃分為相對獨立的“任務(wù)”,以這樣任務(wù)考慮和優(yōu)化動態(tài)內(nèi)存的管理方法是非常合適的。同樣,工業(yè)實時數(shù)據(jù)庫還有其它處理任務(wù),如客戶端查詢,對配置信息的修改,后臺的統(tǒng)計分析,都適用于這樣的特點。目前,一般編程方法中使用內(nèi)存分配和釋放不足CN101799773A公開了一種并行計算的內(nèi)存訪問方法;CN102053872A公開了一種終端交易性能測試方法;US2009/0006502A1公開了一種基于特定應(yīng)用的堆管理方法。它們都沒有公開對每個任務(wù)創(chuàng)建一個或多個緩沖池并在完成任務(wù)后統(tǒng)一銷毀內(nèi)存池的技術(shù),當(dāng)然也就沒有由此帶來的提高服務(wù)程序運行效率、簡化動態(tài)內(nèi)存變成負擔(dān)的技術(shù)效果。
發(fā)明內(nèi)容
本發(fā)明的目的是發(fā)明一種能提高工業(yè)實時數(shù)據(jù)庫動態(tài)內(nèi)存管理性能、運行效率以及簡化動態(tài)內(nèi)存使用方法的工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法。在大型工業(yè)實時數(shù)據(jù)庫系統(tǒng)中使用內(nèi)存池技術(shù)管理和組織動態(tài)內(nèi)存的方法,通過把工業(yè)實時數(shù)據(jù)庫的處理邏輯或業(yè)務(wù)劃分為相對獨立任務(wù),每個任務(wù)使用一個或多個內(nèi)存池用于管理該任務(wù)中的內(nèi)存分配,實現(xiàn)內(nèi)存多次分配,統(tǒng)一釋放。本發(fā)明在分析工業(yè)實時數(shù)據(jù)庫特點的基礎(chǔ),為了克服采用一般編程方法中使用內(nèi)存分配和釋放的不足,提出采用內(nèi)存池管理動態(tài)內(nèi)存的方法,可以大大提高服務(wù)程序的運行效率,簡化開發(fā)人員動態(tài)內(nèi)存編程的負擔(dān),并且具有一定普遍性。工業(yè)實時數(shù)據(jù)庫體系結(jié)構(gòu)如圖1所示,在網(wǎng)絡(luò)調(diào)用及任務(wù)調(diào)度層實現(xiàn)網(wǎng)絡(luò)調(diào)用,在實時報警、實時計算、訂閱發(fā)布、數(shù)據(jù)下行、采集管理層實現(xiàn)業(yè)務(wù)邏輯處理,在實時數(shù)據(jù)關(guān)系邏輯表示層和實時數(shù)據(jù)存儲管理層實現(xiàn)實時存儲引擎。其方法如下:1.提出從按“任務(wù)”的角度看待工業(yè)實時數(shù)據(jù)庫對動態(tài)內(nèi)存的使用過程;通過對工業(yè)實時數(shù)據(jù)庫典型應(yīng)用場景、功能、運行模式等進行分析,合理規(guī)劃任務(wù)以及內(nèi)存使用情況;2.對每個任務(wù)創(chuàng)建一個或多個內(nèi)存池,生成內(nèi)存池句柄作為參數(shù)傳遞給后續(xù)處理模塊,并根據(jù)該任務(wù)的功能,預(yù)先分配一定的內(nèi)存大小(缺省4K),以提高使用效率;3.在任務(wù)運行過程中,根據(jù)需要使用內(nèi)存池進行需要分配和釋放,對于返回參數(shù)或模塊之間傳遞的數(shù)據(jù),可以不用釋放,直接在內(nèi)存池中分配并賦值返回給調(diào)用方即可;4.當(dāng)任務(wù)完成后,不需要逐一釋放返回參數(shù)或傳遞的數(shù)據(jù),統(tǒng)一銷毀內(nèi)存池,在內(nèi)存池中分配的內(nèi)存一次性釋放。具體步驟如圖2所示:I)客戶端應(yīng)用創(chuàng)建內(nèi)存池;2)發(fā)起網(wǎng)絡(luò)調(diào)用,傳入內(nèi)存池句柄;3)輸入?yún)?shù)打包發(fā)給遠程工業(yè)實時數(shù)據(jù)庫,等待應(yīng)答;此步與等待客戶端請求均轉(zhuǎn)下步;4)接收客戶端請求,創(chuàng)建內(nèi)存池;5)把輸入?yún)?shù)和內(nèi)存池句柄作為參數(shù)傳遞給業(yè)務(wù)處理模塊;6)在若干業(yè)務(wù)模塊中處理客戶端請求,使用內(nèi)存池管理動態(tài)內(nèi)存,同時在內(nèi)存池分配動態(tài)內(nèi)存保存輸出參數(shù);7)內(nèi)存池中的輸出參數(shù)打包轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)流,回傳給客戶端調(diào)用;8)后一路銷毀內(nèi)存池,本次請求過程使用的內(nèi)存釋放;另一路為收到服務(wù)器應(yīng)答數(shù)據(jù)流,解包后,在內(nèi)存池里分配內(nèi)存保存返回參數(shù);9)客戶端應(yīng)用根據(jù)業(yè)務(wù)需要使用返回數(shù)據(jù);10)銷毀內(nèi)存池,所有遠程調(diào)用使用的內(nèi)存釋放。本發(fā)明指的任務(wù)是工業(yè)實時數(shù)據(jù)是完成一定功能的運行邏輯。任務(wù)可以是一次或多次網(wǎng)絡(luò)調(diào)用,現(xiàn)場采集信號量的實時數(shù)據(jù)的入庫,一條SQL語句的執(zhí)行過程,客戶端查詢或數(shù)據(jù)下行,后臺實時統(tǒng)計分析等。任務(wù)之間相對隔離,全局共享信息都由實時存儲引擎維護,基本可以避免任務(wù)之間數(shù)據(jù)交叉訪問的情況。任務(wù)的執(zhí)行時間比較短,大概在幾十毫秒到幾秒的數(shù)據(jù)量級,不會長時間占用過多的內(nèi)存。本發(fā)明采用的內(nèi)存池是一種非常輕量級的內(nèi)存池,存在的生命周期也比較短,不必過多考慮內(nèi)存空間優(yōu)化的問題,因而可以采用效率極高的動態(tài)內(nèi)存分配算法,并且內(nèi)存池本身很容易創(chuàng)建和銷毀;內(nèi)存池創(chuàng)建時預(yù)先向系統(tǒng)申請一塊大小適當(dāng)?shù)膬?nèi)存塊(如4K),當(dāng)內(nèi)存不夠用時,內(nèi)存池自動向系統(tǒng)申請一塊較大的內(nèi)存塊補充到內(nèi)存池中進行管理;在程序運行過程中,當(dāng)需要動態(tài)內(nèi)存時,內(nèi)存池在內(nèi)部分配一塊可用的空間給任務(wù),程序不需要逐一釋放在內(nèi)存池中分配的內(nèi)存,在任務(wù)完成后,銷毀內(nèi)存池,所有分配的內(nèi)存全部釋放給操作系統(tǒng);在程序調(diào)試階段,很容易跟蹤到內(nèi)存使用情況,為系統(tǒng)優(yōu)化提供重要依據(jù)。在任務(wù)的執(zhí)行過程用內(nèi)存池管理動態(tài)內(nèi)存優(yōu)勢在于:在一個局部范圍內(nèi)根據(jù)程序執(zhí)行的功能最大程度的優(yōu)化動態(tài)內(nèi)存管理效率;把程序運行過程,把大小不等的內(nèi)存請求轉(zhuǎn)化為大小適當(dāng),并且按操作系統(tǒng)內(nèi)存頁面對齊的內(nèi)存塊請求和釋放;通常任務(wù)都是在一個線程中完成,避免了內(nèi)存使用過程中的并發(fā)操作,不同任務(wù)之間使用的內(nèi)存是相互隔離的;開發(fā)人員不必小心翼翼處理內(nèi)存分配和釋放,可以根據(jù)需要在任務(wù)過程中只分配,不釋放,在任務(wù)完成后銷毀內(nèi)存池,所有分配的內(nèi)存都被釋放;在遠程調(diào)用過程中,可以用于分配復(fù)雜的數(shù)據(jù)類型,規(guī)范網(wǎng)絡(luò)調(diào)用的數(shù)據(jù)傳輸,為客戶端開發(fā)人員提供邏輯上一致的內(nèi)存管理視圖。如錯誤!未找到引用源。所示為客戶端程序在調(diào)用工業(yè)實時數(shù)據(jù)庫功能時,內(nèi)存池應(yīng)用的一個示例,在遠程調(diào)用過程中,客戶端和服務(wù)端各自創(chuàng)建了一個內(nèi)存池,用于處理本次調(diào)用請求的“任務(wù)”??梢钥吹?,在這種環(huán)境下應(yīng)用內(nèi)存池,巧妙的處理了輸入輸出參數(shù)傳遞時動態(tài)內(nèi)存的分配和釋放,無論在客戶端還是工業(yè)實時數(shù)據(jù)庫服務(wù)端,內(nèi)存池的創(chuàng)建和銷毀是由網(wǎng)絡(luò)調(diào)度層完成,實際業(yè)務(wù)邏輯開發(fā)人員可以不關(guān)心參數(shù)的傳遞和內(nèi)存池創(chuàng)建銷毀等細節(jié),這對于簡化開發(fā)工作,提高代碼質(zhì)量有極大的幫助。
圖1工業(yè)實時數(shù)據(jù)庫體系結(jié)構(gòu)2內(nèi)存池應(yīng)用圖
具體實施例方式實施例.本方法在某油氣管道SCADA系統(tǒng)軟件國產(chǎn)化項目中,作為該項目驗證關(guān)鍵技術(shù)之一,進行了大量的實驗和測試,并且作為核心技術(shù)固化到系統(tǒng)整個架構(gòu)之中,經(jīng)過測試,性能有明顯的提升,同時該發(fā)明很大程度簡化動態(tài)內(nèi)存使用,提供代碼開發(fā)效率。如下步驟:1.提出從按“任務(wù)”的角度看待工業(yè)實時數(shù)據(jù)庫對動態(tài)內(nèi)存的使用過程;通過對工業(yè)實時數(shù)據(jù)庫典型應(yīng)用場景、功能、運行模式等進行分析,合理規(guī)劃任務(wù)以及內(nèi)存使用情況;2.對每個任務(wù)創(chuàng)建一個或多個內(nèi)存池,生成內(nèi)存池句柄作為參數(shù)傳遞給后續(xù)處理模塊,并根據(jù)該任務(wù)的功能,預(yù)先分配一定的內(nèi)存大小(缺省4K),以提高使用效率;3.在任務(wù)運行過程中,根據(jù)需要使用內(nèi)存池進行需要分配和釋放,對于返回參數(shù)或模塊之間傳遞的數(shù)據(jù),可以不用釋放,直接在內(nèi)存池中分配并賦值返回給調(diào)用方即可;4.當(dāng)任務(wù)完成后,不需要逐一釋放返回參數(shù)或傳遞的數(shù)據(jù),統(tǒng)一銷毀內(nèi)存池,在內(nèi)存池中分配的內(nèi)存一次性釋放。以下給出兩組比較有代表的測試對比。測試機器為工作站,4核CPUdntel Core2 Q66002.4GHz),2G 內(nèi)存,Windows Server 2003 企業(yè)版。性能對比I,單純內(nèi)存分配性能比較。定義2000個指針的數(shù)組,依次分配從I個字節(jié)到IOK字節(jié)的內(nèi)存,在下一次循環(huán)過程中釋放再分配,共計循環(huán)10000次,統(tǒng)計時間,測試10次取平均值。采用內(nèi)存池技術(shù)用時平均3.5秒。使用CRT運行庫用時平均24.7秒。性能對比2,模擬工業(yè)實時數(shù)據(jù)庫數(shù)據(jù)處理性能比較。模擬測試工業(yè)實時數(shù)據(jù)庫處理實時數(shù)據(jù)(信號量)的流程,包括查詢該點的配置信息,邏輯處理,數(shù)據(jù)入庫的過程。調(diào)用開發(fā)測試程序直接調(diào)用工業(yè)實時數(shù)據(jù)庫接口。其中配置信息查詢和實時數(shù)據(jù)入庫涉及較多動態(tài)內(nèi)存分配,尤其對于復(fù)雜不定長數(shù)據(jù)類型的處理。在測試場景中,分別定義2個表,其中一個是含有20個復(fù)雜數(shù)據(jù)類型字段的表(實際上,工程應(yīng)用中不會用到很多復(fù)雜數(shù)據(jù)類型),模擬配置信息,另一個是定義4個字段的表,模擬實時數(shù)據(jù),分別生成100萬條記錄。在這兩個表上開發(fā)測試程序,用于模擬實時數(shù)據(jù)庫對數(shù)據(jù)的處理過程。測試結(jié)果為:采用內(nèi)存池技術(shù),平均每秒處理7.0萬條實時數(shù)據(jù)。采用CRT內(nèi)存分配,平均每秒處理5.8萬條實時數(shù)據(jù)??梢钥闯?,在測試I中,采用內(nèi)存池技術(shù),比全局的CRT內(nèi)存管理效率高了一個數(shù)量級;測試2中,在實時數(shù)據(jù)引擎的性能優(yōu)化到極致的情況下,采用內(nèi)存池優(yōu)化處理過程動態(tài)內(nèi)存的使用,又使得性能提高20%左右。
權(quán)利要求
1.一種工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法,其特征在于步驟為:1)提出從按“任務(wù)”的角度看待工業(yè)實時數(shù)據(jù)庫對動態(tài)內(nèi)存的使用過程;通過對工業(yè)實時數(shù)據(jù)庫典型應(yīng)用場景、功能、運行模式等進行分析,合理規(guī)劃任務(wù)以及內(nèi)存使用情況; 2)對每個任務(wù)創(chuàng)建一個或多個內(nèi)存池,生成內(nèi)存池句柄作為參數(shù)傳遞給后續(xù)處理模塊,并根據(jù)該任務(wù)的功能,預(yù)先分配一定的內(nèi)存大小,以提高使用效率; 3)在任務(wù)運行過程中,根據(jù)需要使用內(nèi)存池進行需要分配和釋放,對于返回參數(shù)或模塊之間傳遞的數(shù)據(jù),可以不用釋放,直接在內(nèi)存池中分配并賦值返回給調(diào)用方即可; 4)當(dāng)任務(wù)完成后,不需要逐一釋放返回參數(shù)或傳遞的數(shù)據(jù),統(tǒng)一銷毀內(nèi)存池,在內(nèi)存池中分配的內(nèi)存一次性釋放。
2.根據(jù)權(quán)利要求1所述的工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法,其特征在于具體步驟為: 1)客戶端應(yīng)用創(chuàng)建內(nèi)存池; 2)發(fā)起網(wǎng)絡(luò)吊用,傳入內(nèi)存池句柄; 3)輸入?yún)?shù)打包發(fā)給遠程工業(yè)實時數(shù)據(jù)庫,等待應(yīng)答;此步與等待客戶端請求均轉(zhuǎn)下 4)接收客戶端請求,創(chuàng)建內(nèi)存池; 5)把輸入?yún)?shù)和內(nèi)存池句柄作為參數(shù)傳遞給業(yè)務(wù)處理模塊; 6)在若干業(yè)務(wù)模塊中處理客戶端請求,使用內(nèi)存池管理動態(tài)內(nèi)存,同時在內(nèi)存池分配動態(tài)內(nèi)存保存輸出參數(shù); 7)內(nèi)存池中的輸出參數(shù)打包轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)流,回傳給客戶端調(diào)用; 8)后一路銷毀內(nèi)存池,本次請求過程使用的內(nèi)存釋放;另一路為收到服務(wù)器應(yīng)答數(shù)據(jù)流,解包后,在內(nèi)存池里分配內(nèi)存保存返回參數(shù); 9)客戶端應(yīng)用根據(jù)業(yè)務(wù)需要使用返回數(shù)據(jù); 10)銷毀內(nèi)存池,所有遠程調(diào)用使用的內(nèi)存釋放。
3.根據(jù)權(quán)利要求1或2所述的工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法,其特征在于所述內(nèi)存池是一種輕量級的內(nèi)存池。
4.根據(jù)權(quán)利要求1或2所述的工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法,其特征在于在一個任務(wù)執(zhí)行過程中進行動態(tài)內(nèi)存優(yōu)化。
5.根據(jù)權(quán)利要求1或2所述的一種工業(yè)實時數(shù)據(jù)庫中采用內(nèi)存池技術(shù)優(yōu)化動態(tài)內(nèi)存的方法,其特征在于:任務(wù)執(zhí)行過程中,使用屬于該任務(wù)內(nèi)存池分配釋放內(nèi)存,返回數(shù)據(jù)和模塊之間傳遞的數(shù)據(jù),只分配不釋放。
6.根據(jù)權(quán)利要求1或2所述的一種工業(yè)實時數(shù)據(jù)庫中采用內(nèi)存池技術(shù)優(yōu)化動態(tài)內(nèi)存的方法,其特征在于:一個任務(wù)結(jié)束后,一次性釋放在執(zhí)行過程分配的內(nèi)存。
全文摘要
本發(fā)明是一種工業(yè)實時數(shù)據(jù)庫采用內(nèi)存池技術(shù)實現(xiàn)動態(tài)內(nèi)存管理的方法。其步驟為1)通過對工業(yè)實時數(shù)據(jù)庫典型應(yīng)用場景、功能、運行模式等進行分析,合理規(guī)劃任務(wù)以及內(nèi)存使用情況;2)對每個任務(wù)創(chuàng)建一個或多個內(nèi)存池,生成內(nèi)存池句柄作為參數(shù)傳遞給后續(xù)處理模塊,并根據(jù)該任務(wù)的功能,預(yù)先分配一定的內(nèi)存大?。?)在任務(wù)運行過程中,根據(jù)需要使用內(nèi)存池進行需要分配和釋放,對于返回參數(shù)或模塊之間傳遞的數(shù)據(jù),不用釋放,直接在內(nèi)存池中分配并賦值返回給調(diào)用方;4)當(dāng)任務(wù)完成后,統(tǒng)一銷毀內(nèi)存池,在內(nèi)存池中分配的內(nèi)存一次性釋放。本發(fā)明能提高工業(yè)實時數(shù)據(jù)庫動態(tài)內(nèi)存管理性能、運行效率以及簡化動態(tài)內(nèi)存使用方法。
文檔編號G06F17/30GK103218360SQ20121001664
公開日2013年7月24日 申請日期2012年1月18日 優(yōu)先權(quán)日2012年1月18日
發(fā)明者高銳強, 陶勇, 鄧小草 申請人:中國石油天然氣集團公司, 中國石油天然氣管道局, 廊坊開發(fā)區(qū)中油龍慧自動化工程有限公司