一種周期性大數(shù)據(jù)處理的內(nèi)存管理方法及裝置制造方法
【專利摘要】一種周期性大數(shù)據(jù)處理的內(nèi)存管理方法及裝置,屬計(jì)算機(jī)內(nèi)存管理【技術(shù)領(lǐng)域】。其中內(nèi)存分配管理包括正序分配、逆序分配以及靜態(tài)內(nèi)存管理與動(dòng)態(tài)分配相結(jié)合,內(nèi)存整理是將所管理的靜態(tài)內(nèi)存保持前段完全連續(xù)可用,未釋放的數(shù)據(jù)逆序連續(xù)存放于末段。每個(gè)數(shù)據(jù)處理周期都保持完整、連續(xù)可用的大內(nèi)存段。使用本發(fā)明裝置的周期性操作的大數(shù)據(jù)處理軟件系統(tǒng),不會(huì)出現(xiàn)因?yàn)檫\(yùn)行時(shí)間長(zhǎng)而由于內(nèi)存管理方面的原因,導(dǎo)致性能下降、穩(wěn)定性下降的情況。本發(fā)明內(nèi)存分配還考慮了大數(shù)據(jù)處理中內(nèi)存需求很大的問題,以靜態(tài)高性能的內(nèi)存完全、有效使用為主,同時(shí)支持操作系統(tǒng)動(dòng)態(tài)內(nèi)存分配、虛擬內(nèi)存應(yīng)用等能力,保證最大化內(nèi)存需求供給。
【專利說明】一種周期性大數(shù)據(jù)處理的內(nèi)存管理方法及裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)內(nèi)存管理【技術(shù)領(lǐng)域】,尤其涉及周期性大數(shù)據(jù)處理的內(nèi)存分配、 整理、釋放的方法及裝置。
【背景技術(shù)】
[0002] 計(jì)算機(jī)內(nèi)存管理經(jīng)過了數(shù)十年發(fā)展,有很多優(yōu)秀的算法,包括BUDDY算法及其改 進(jìn)的slab算法等。隨著計(jì)算機(jī)軟件、硬件技術(shù)的不斷發(fā)展,內(nèi)存容量越來越大,操作系統(tǒng)對(duì) 內(nèi)存的管理能力也在不斷加強(qiáng);算法不斷完善,應(yīng)用軟件越來越多地依賴操作系統(tǒng)的內(nèi)存 管理。
[0003] 我們?cè)陂L(zhǎng)期實(shí)踐中發(fā)現(xiàn),操作系統(tǒng)(WINDOWS、UNIX)在快速交替分配大內(nèi)存塊、小 內(nèi)存塊,然后交替釋放,這樣的過程中再多的內(nèi)存資源也很快會(huì)被消耗完,導(dǎo)致內(nèi)存分配失 敗,其根本原因是由內(nèi)存碎片沒得到及時(shí)整理所致。早期我們開發(fā)大數(shù)據(jù)處理應(yīng)用系統(tǒng)中, 系統(tǒng)運(yùn)行時(shí)間越長(zhǎng),速度越慢,出故障的頻率越高。
[0004] 在一些大數(shù)據(jù)分析處理的應(yīng)用環(huán)境下,例如超高分辨率(20000X20000)的圖像 分析處理、大批量的小圖像處理(512X512,數(shù)千幀甚至上萬幀),頻繁的語音、視頻播放 等,由于內(nèi)存管理問題導(dǎo)致軟件系統(tǒng)不穩(wěn)定的情況很常見。
[0005] 頁面(PAGE)是內(nèi)存分配的基本單位,按傳統(tǒng)的內(nèi)存分配算法,當(dāng)應(yīng)用系統(tǒng)申請(qǐng)分 配內(nèi)存時(shí)總是找到一塊最合適的內(nèi)存塊(Page Block)給申請(qǐng)者。比如按BUDDY算法,若應(yīng) 用需求分配10個(gè)頁面,BUDDY算法找到大小為16個(gè)Page (2的4次冪)的內(nèi)存塊,分配給 申請(qǐng)者;如果前面正好有10個(gè)頁面的可用內(nèi)存也會(huì)被跳過,分配后這個(gè)16頁面的內(nèi)存塊 (block)產(chǎn)生了一個(gè)6頁面的小塊(block),在隨后的內(nèi)存分配中一般要拆分為4頁面和2 頁面的兩個(gè)塊(block)。這樣就導(dǎo)致一次內(nèi)存分配前后都產(chǎn)生內(nèi)存碎片。在大數(shù)據(jù)、大內(nèi)存 塊(page block)的分配中這個(gè)問題尤其突出。
[0006] 內(nèi)存分配算法從大分類上還有最壞適應(yīng)算法、最佳適應(yīng)算法、最大匹配內(nèi)存分配 算法等。每一個(gè)算法都有各自的優(yōu)點(diǎn)和缺點(diǎn),主要表現(xiàn)在分配和釋放的復(fù)雜度、分配數(shù)度、 產(chǎn)生碎片多少等方面。
[0007] 大量的內(nèi)存分配和釋放后不可避免地產(chǎn)生大量的內(nèi)存碎片,新的分配效率和成功 率會(huì)越來越低。對(duì)此問題,一種解決辦法是嘗試申請(qǐng)大內(nèi)存塊(pageblock),然后按原申請(qǐng) 的大小釋放,由操作系統(tǒng)結(jié)合虛擬內(nèi)存管理機(jī)制,分配出整塊連續(xù)的物理內(nèi)存,供應(yīng)用程序 再次分配。這一方法的不足之處在于可靠性不高,效率較低,會(huì)影響其它應(yīng)用系統(tǒng)的運(yùn)行性 能。
[0008] 大數(shù)據(jù)(這里指占用空間大)頻繁分配內(nèi)存和釋放內(nèi)存過程中,通常也伴隨著操 作系統(tǒng)內(nèi)存管理中內(nèi)存數(shù)據(jù)頻繁移動(dòng),從而導(dǎo)致效率下降,也就是常見的系統(tǒng)運(yùn)行越來越 慢。
【發(fā)明內(nèi)容】
[0009] 本發(fā)明的目的在于為周期性操作的大數(shù)據(jù)處理軟件系統(tǒng)提供一種內(nèi)存管理方法 及裝置,以保證系統(tǒng)的最大化內(nèi)存需求供給,達(dá)到運(yùn)行時(shí)間長(zhǎng)也不會(huì)由于內(nèi)存管理方面的 原因?qū)е孪到y(tǒng)穩(wěn)定性和運(yùn)行效率下降的效果。
[0010] 本發(fā)明周期性大數(shù)據(jù)處理的內(nèi)存管理方法,其特征在于其中內(nèi)存分配管理包括正 序分配、逆序分配以及靜態(tài)內(nèi)存管理與動(dòng)態(tài)分配相結(jié)合,內(nèi)存整理是將所管理的靜態(tài)內(nèi)存 保持前段完全連續(xù)可用,未釋放的數(shù)據(jù)逆序連續(xù)存放于末段。
[0011] 進(jìn)一步地說,本發(fā)明方法按以下步驟:
[0012] M0:初始化階段--根據(jù)應(yīng)用程序所處理的數(shù)據(jù)的特點(diǎn)、計(jì)算機(jī)內(nèi)存配置的容量 大小、以及歷史分配情況以及當(dāng)前計(jì)算機(jī)可分配內(nèi)存條件來確定預(yù)分配靜態(tài)內(nèi)存額,向操 作系統(tǒng)申請(qǐng)分配一塊較大的內(nèi)存,該內(nèi)存稱為靜態(tài)內(nèi)存,然后建立內(nèi)存分配記錄表并初始 化,初始化正向靜態(tài)內(nèi)存分配指針S103、正向分配當(dāng)前位置指針S105、逆序分配指針S104、 逆序分配當(dāng)前位置指針S106 ;
[0013] Ml :內(nèi)存分配管理--應(yīng)用系統(tǒng)內(nèi)存需求上升期,在靜態(tài)內(nèi)存區(qū)中從S103順序無 空隙地向后分配,順序分配指針S105向后移;靜態(tài)內(nèi)存不足以滿足分配需求時(shí),按應(yīng)用系 統(tǒng)實(shí)際申請(qǐng)分配的內(nèi)存大小向操作系統(tǒng)申請(qǐng)動(dòng)態(tài)內(nèi)存,并記入內(nèi)存分配記錄表,經(jīng)過一個(gè) 大數(shù)據(jù)處理操作周期后,進(jìn)入靜態(tài)內(nèi)存碎片整理期,殘留內(nèi)存數(shù)據(jù)移動(dòng)整理時(shí),需再分配靜 態(tài)內(nèi)存空間,這個(gè)階段的分配進(jìn)入逆序分配,就是由S104開始分配,最終把所有靜態(tài)內(nèi)存 中未釋放的數(shù)據(jù)都移動(dòng)到S104開始到S106的一段連續(xù)無空隙的靜態(tài)內(nèi)存區(qū)。這樣對(duì)于每 個(gè)操作周期,內(nèi)存狀態(tài)如同剛開始運(yùn)行一樣,不因長(zhǎng)期運(yùn)行后大量?jī)?nèi)存碎片問題、以及虛擬 內(nèi)存數(shù)據(jù)移動(dòng)問題而影響效率與穩(wěn)定性。
[0014] M2 :動(dòng)態(tài)碎片整理--一個(gè)大數(shù)據(jù)處理周期結(jié)束后進(jìn)入碎片整理期,以備下一周 期有連續(xù)的靜態(tài)內(nèi)存空間可供使用,殘留內(nèi)存數(shù)據(jù)向靜態(tài)內(nèi)存區(qū)末端移動(dòng);結(jié)合Ml內(nèi)存分 配方法,對(duì)靜態(tài)內(nèi)存中未釋放的內(nèi)存進(jìn)行逆序內(nèi)存再分配并移動(dòng)數(shù)據(jù);通過內(nèi)存分配記錄 表,判斷殘留數(shù)據(jù)量大小,如果殘留數(shù)據(jù)大于靜態(tài)內(nèi)存總量的1/3時(shí),在動(dòng)態(tài)碎片整理完成 后,向操作系統(tǒng)重新申請(qǐng)過渡內(nèi)存區(qū),將靜態(tài)內(nèi)存區(qū)末端存放數(shù)據(jù)的區(qū)域移動(dòng)到過渡內(nèi)存 區(qū)以存放殘留數(shù)據(jù);
[0015] M3 :內(nèi)存釋放--根據(jù)內(nèi)存記錄表處理內(nèi)存釋放操作,在靜態(tài)內(nèi)存區(qū)的釋放操作, 僅需修改使用狀態(tài)標(biāo)志;由操作系統(tǒng)動(dòng)態(tài)分配的內(nèi)存,修改標(biāo)志并通知操作系統(tǒng)釋放相應(yīng) 的內(nèi)存。
[0016] 靜態(tài)內(nèi)存通常為100M-2G。
[0017] Ml內(nèi)存需求上升期標(biāo)志為:兩次分配間隔不超過1秒的連續(xù)內(nèi)存分配量達(dá)上次最 大分配量的1/5,并且還在繼續(xù)分配作為標(biāo)志,靜態(tài)內(nèi)存碎片整理期以上升期結(jié)束10秒后, 5秒以內(nèi)連續(xù)釋放總內(nèi)存分配量的2/3為標(biāo)志。具體應(yīng)用時(shí),根據(jù)多次應(yīng)用的具體統(tǒng)計(jì)數(shù)據(jù) 調(diào)整上述參數(shù),應(yīng)用程序也可以以通知的方式告知內(nèi)存管理的各個(gè)時(shí)期。
[0018] 其中,Ml正序分配和逆序分配共用一塊連續(xù)的靜態(tài)內(nèi)存區(qū),靜態(tài)內(nèi)存用完或超過 時(shí),S105指針等于或接近S106。
[0019] 其中,Ml分配內(nèi)存時(shí),如果需求內(nèi)存量RequiredMemory+S105>S106時(shí),向操作系 統(tǒng)申請(qǐng)相應(yīng)的內(nèi)存。
[0020] 本發(fā)明提供的內(nèi)存分配方法,是把正序分配、逆序分配以及靜態(tài)內(nèi)存管理與動(dòng)態(tài) 分配相結(jié)合,解決的實(shí)際問題是周期性操作的大數(shù)據(jù)處理中的不斷產(chǎn)生內(nèi)存碎片導(dǎo)致系統(tǒng) 性能下降、系統(tǒng)故障的問題。
[0021] 本發(fā)明提供的內(nèi)存整理方法,是將所管理的靜態(tài)內(nèi)存保持前段完全連續(xù)可用,未 釋放的數(shù)據(jù)逆序連續(xù)存放于末段;解決的實(shí)際問題是周期性操作的大數(shù)據(jù)處理中的每個(gè)操 作周期的始終有連續(xù)足夠的內(nèi)存空間可以使用,保證系統(tǒng)長(zhǎng)時(shí)間操作的性能和穩(wěn)定性。
[0022] 與上述方法和步驟相對(duì)應(yīng),本發(fā)明提供一種內(nèi)存管理裝置,包括包括初始化管理 模塊、內(nèi)存分配管理模塊、內(nèi)存整理模塊、操作過程監(jiān)測(cè)模塊、裝置釋放模塊。
[0023] 其中初始化模塊根據(jù)應(yīng)用需求、計(jì)算機(jī)內(nèi)存配置、以及歷史分配情況、當(dāng)前計(jì)算機(jī) 可分配內(nèi)存條件確定預(yù)分配靜態(tài)內(nèi)存額,向操作系統(tǒng)申請(qǐng)分配;完成記錄數(shù)據(jù)初始化;
[0024] 內(nèi)存分配管理模塊,在內(nèi)存需求上升期在靜態(tài)內(nèi)存區(qū)中順序無空隙地向后分配; 內(nèi)存碎片整理期殘留內(nèi)存移動(dòng)再分配時(shí)在靜態(tài)內(nèi)存空間由后向前分配;靜態(tài)內(nèi)存不足以滿 足分配需求時(shí)向操作系統(tǒng)申請(qǐng)動(dòng)態(tài)內(nèi)存,并統(tǒng)一管理;
[0025] 內(nèi)存整理模塊,主要包括一個(gè)動(dòng)態(tài)內(nèi)存碎片整理程序,在一個(gè)大數(shù)據(jù)處理周期結(jié) 果后進(jìn)入碎片整理,以備下一周期有連續(xù)的靜態(tài)內(nèi)存空間可供使用;殘留內(nèi)存數(shù)據(jù)向靜態(tài) 內(nèi)存區(qū)末端移動(dòng),如果殘留數(shù)據(jù)過大則向操作系統(tǒng)重新申請(qǐng)過渡內(nèi)存區(qū)來存放殘留數(shù)據(jù)。 [0026] 操作過程監(jiān)測(cè)模塊,用于動(dòng)態(tài)判斷內(nèi)存整理模塊運(yùn)行啟動(dòng)的時(shí)機(jī),即判斷內(nèi)存分 配處理需求上升期、內(nèi)存集中釋放期的開始與結(jié)束時(shí)機(jī),啟動(dòng)對(duì)應(yīng)的內(nèi)存分配方案以及內(nèi) 存整理模塊中的動(dòng)態(tài)內(nèi)存碎片整理程序,并對(duì)由于判斷不準(zhǔn)確引起的小問題進(jìn)行修正;
[0027] 裝置釋放模塊,釋放所有由操作系統(tǒng)分配的動(dòng)態(tài)內(nèi)存,依次釋放靜態(tài)再分配內(nèi)存, 最后釋放預(yù)分配的靜態(tài)內(nèi)存。
[0028] 本發(fā)明方法和裝置針對(duì)周期性操作的大數(shù)據(jù)處理應(yīng)用特點(diǎn),能夠在很好地控制內(nèi) 存的分配、動(dòng)態(tài)碎片整理,在系統(tǒng)關(guān)鍵運(yùn)行期間避免產(chǎn)生內(nèi)存碎片,從而提高穩(wěn)定性和運(yùn)行 效率。特別地,逆序分配內(nèi)存并移動(dòng)內(nèi)存碎片數(shù)據(jù)保證了每個(gè)操作周期有充足、連續(xù)的內(nèi)存 可以分配使用。
[0029] 本發(fā)明的有益效果:將系統(tǒng)內(nèi)存中必要的部分作為靜態(tài)內(nèi)存進(jìn)行符合周期性操作 的大數(shù)據(jù)處理軟件特點(diǎn)的管理方法,并且每個(gè)數(shù)據(jù)處理周期都保持完整、連續(xù)可用的大內(nèi) 存段。使用本發(fā)明裝置的周期性操作的大數(shù)據(jù)處理軟件系統(tǒng),不會(huì)出現(xiàn)因?yàn)檫\(yùn)行時(shí)間長(zhǎng)而 由于內(nèi)存管理方面的原因,導(dǎo)致性能下降、穩(wěn)定性下降的情況。本發(fā)明內(nèi)存分配方法還考慮 了大數(shù)據(jù)處理中內(nèi)存需求很大的問題,以靜態(tài)高性能的內(nèi)存完全、有效使用為主,同時(shí)支持 操作系統(tǒng)動(dòng)態(tài)內(nèi)存分配、虛擬內(nèi)存應(yīng)用等能力,保證最大化內(nèi)存需求供給。
【專利附圖】
【附圖說明】
[0030] 圖1為本發(fā)明基本工作流程圖。
[0031] 圖2本發(fā)明實(shí)施例實(shí)施例內(nèi)存管理基本結(jié)構(gòu)圖。
[0032] 圖3本發(fā)明實(shí)施例內(nèi)存分配記錄表結(jié)構(gòu)示意圖。
[0033] 圖4本發(fā)明實(shí)施例內(nèi)存分配流程圖。
[0034] 圖5本發(fā)明實(shí)施例碎片動(dòng)態(tài)整理流程圖。
[0035] 圖6本發(fā)明實(shí)施例碎片動(dòng)態(tài)整理后的效果圖以及每個(gè)操作周期初始內(nèi)存狀態(tài)圖。
[0036] 圖7本發(fā)明實(shí)施例應(yīng)用結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0037] 本發(fā)明內(nèi)存管理工作流程如圖1。
[0038] 步驟S10 :向操作系統(tǒng)申請(qǐng)分配一塊容量為Capacity_StaticMemory的內(nèi)存,該內(nèi) 存稱為靜態(tài)內(nèi)存。然后建立內(nèi)存分配記錄表并初始化,初始化正向靜態(tài)內(nèi)存分配指針S103、 正向分配當(dāng)前位置指針S105、逆序分配指針S104、逆序分配當(dāng)前位置指針S106。
[0039] Capacity_StaticMemory 數(shù)值的確定方法如下:
[0040] 基數(shù)CapacityBase =計(jì)算機(jī)系統(tǒng)可用內(nèi)存(AvailableMemory)/2,如果計(jì)算機(jī)系 統(tǒng)同時(shí)運(yùn)行多個(gè)大型應(yīng)用軟件,修正:CapacityBase = AvailableMemory/3。
[0041] Capacity_StaticMemory = Capac i tyBase X (0. 5+ Re v i s i onCo_ Requiring/10)X (l+RevisionCo_Statistics);
[0042] 其中RevisionCo_Requiring為應(yīng)用需求修正系數(shù),由應(yīng)用程序配置,取值范圍為 1-10 ;RevisionCo_Statistics為歷史分配修正系統(tǒng):
[0043] RevisionCo_Statitics = Capacity_Excess/Capacity_StaticMemory ;
[0044] 其中Capacity_Excess為每個(gè)操作周期動(dòng)態(tài)分配內(nèi)存的平均值,從上一次修改 Capac i ty_Stat i cMemory值以后的計(jì)數(shù)平均值。
[0045] Capacity_StaticMemory 最終值不能大于 AvailableMemory X 2/3。
[0046] 進(jìn)一步創(chuàng)建內(nèi)存管理結(jié)構(gòu),這是連續(xù)的大塊靜態(tài)內(nèi)存,包括四個(gè)部分,如圖2所 示,分別是(A)順序已分配靜態(tài)內(nèi)存區(qū)從S103開始到S105-1、(B)順序可分配靜態(tài)內(nèi)存區(qū) S105開始到S106-1、(C)逆序已分配內(nèi)存區(qū)S104開始到S106-1、(D)內(nèi)存分配記錄表,從 S104開始到靜態(tài)內(nèi)存塊末尾。本發(fā)明中內(nèi)存分配記錄表同樣采用靜態(tài)內(nèi)存順序排列的方 式,而不用鏈表結(jié)構(gòu)。原因也是因?yàn)殒湵斫Y(jié)構(gòu)動(dòng)態(tài)內(nèi)存分配和釋放過多,從而影響應(yīng)用性 能。靜態(tài)內(nèi)存分配表有一個(gè)問題是需要預(yù)留足夠大的長(zhǎng)度,保證內(nèi)存分配項(xiàng)目不會(huì)超過這 個(gè)長(zhǎng)度。本發(fā)明預(yù)設(shè)置最大內(nèi)存分配記錄表長(zhǎng)度是4096,每個(gè)記錄項(xiàng)目大小為16字節(jié),總 共預(yù)留內(nèi)存為32KB。實(shí)際應(yīng)用中如果處理小而多的數(shù)據(jù),這個(gè)值可以加大,這是一個(gè)可配置 的選項(xiàng)。
[0047] 本的內(nèi)存分配記錄表結(jié)構(gòu)如圖3所示,它包含三個(gè)部分:分別是(A)S152有效性檢 測(cè)區(qū),共是12個(gè)字節(jié)。其值名稱為MAListVerification,MAListVerification的初始化16 進(jìn)制值為AAAAAAAAAAAAAAAAAAAAAAAA,二進(jìn)制為101010…(重復(fù)24個(gè)1010)。該值用于判 定內(nèi)存分配記錄表的有效性,原因是系統(tǒng)異常時(shí)有可能內(nèi)存寫入越界(內(nèi)存泄露),導(dǎo)致內(nèi) 存分配記錄表損壞。MAListVerification初始化后不會(huì)再次修改,每次訪問時(shí)檢測(cè)該值是否 正常,如果異常要通知應(yīng)用系統(tǒng)結(jié)束處理過程,查找原因。(B)第二部分包含兩個(gè)值,當(dāng)前順 序分配指針S153,用于采用循環(huán)首次適應(yīng)法分配內(nèi)存,另一個(gè)值S154表示最大內(nèi)存分配記 錄表單元數(shù)。S10初始化時(shí)S153置為0,S154是最大可分配內(nèi)存次數(shù)。(C)第三部分是數(shù) 據(jù)結(jié)構(gòu),連續(xù)存放內(nèi)存分配記錄表單元,每個(gè)單元包括不重復(fù)的分配ID、所分配的內(nèi)存物理 地址/或靜態(tài)內(nèi)存區(qū)相對(duì)地址、分配長(zhǎng)度、內(nèi)存共享者數(shù)據(jù)、類型,共16字節(jié)。
[0048] 內(nèi)存分配記錄單元內(nèi)容進(jìn)一步說明:
[0049] Alloc_ID :4個(gè)字段,取值從1000開始,整個(gè)運(yùn)行期不會(huì)重復(fù);是所分配內(nèi)存使用 的關(guān)鍵標(biāo)識(shí);該值為0時(shí)表示該記錄分配記錄單元未使用,后面Alloc_Addr、Alloc_Len等 值均無效。
[0050] Alloc_Addr :物理地址或相對(duì)地址,如果分配靜態(tài)內(nèi)存,該值為相對(duì)地址,即本發(fā) 明裝置所管理的內(nèi)存地址;如果由操作系統(tǒng)所分配的動(dòng)態(tài)地址,該值為物理內(nèi)存地址(操 作系統(tǒng)可以識(shí)別的地址)。
[0051] Alloc_Len :分配長(zhǎng)度。
[0052] Alloc_Share :該內(nèi)存塊共享計(jì)數(shù);
[0053] Allocjype :靜態(tài)內(nèi)存分配標(biāo)志為1,操作系統(tǒng)動(dòng)態(tài)內(nèi)存分配標(biāo)志為十六進(jìn)制 "FF"。
[0054] S10初始化時(shí)內(nèi)存分配記錄表全部置為空。
[0055] S10初始化還包括初始化設(shè)置一些參數(shù):逆序分配最大空間、內(nèi)存分配增長(zhǎng)期判 定參數(shù)、一個(gè)周期性操作結(jié)束判斷參數(shù)。
[0056] 步驟S20 :應(yīng)用系統(tǒng)內(nèi)存需求上升期申請(qǐng)的內(nèi)存,或由應(yīng)用系統(tǒng)申請(qǐng)內(nèi)存,申請(qǐng)容 量為RequiredMemory,流程如下:
[0057] 如果RequiredMemory+S105〈S106,則內(nèi)存分配記錄表中創(chuàng)建新的Alloc_ID,記錄 Alloc_Addr = S105, Alloc_Len = RequiredMemory, Alloc_Share = 1, Alloc_Type = 1 ; 然后 S105 = S105+RequiredMemory。
[0058] 如果RequiredMemory+S105>S106,則內(nèi)存分配記錄表中創(chuàng)建新的Alloc_ID,從 操作系統(tǒng)申請(qǐng)RequiredMemory大小的內(nèi)存,記錄Alloc_Addr =從操作系統(tǒng)獲得的地址, Alloc_Len = RequiredMemory, Alloc_Share = 1, Alloc_Type = FF〇
[0059] 應(yīng)用系統(tǒng)內(nèi)存釋放期申請(qǐng)的內(nèi)存,或碎片整理期申請(qǐng)內(nèi)存,申請(qǐng)容量為 RequiredMemory,采用逆序分配方法,流程如下:
[0060] 從S108開始分配,如果該區(qū)域已被占用,則把占用的數(shù)據(jù)先移到動(dòng)態(tài)內(nèi)存區(qū),按 本發(fā)明方法,發(fā)生這種情況的幾率很低。
[0061] 如果S106-RequiredMemory〈S105,按上述方法向操作系統(tǒng)申請(qǐng)動(dòng)態(tài)內(nèi)存,并記錄 內(nèi)存分配記錄表,S106不變。
[0062] 如果 S106-RequiredMemory>S105,然后 S106 = S106_RequiredMemory。創(chuàng)建新 的 Alloc_ID,記錄 Alloc_Addr = S106,Alloc_Len = RequiredMemory, Alloc_Share = 1, Alloc_Type = l〇
[0063] 其中,Ml內(nèi)存需求上升期基本判斷方法為兩次分配間隔不超過1秒的連續(xù)內(nèi)存分 配量達(dá)上次最大分配量的1/5,并且還在繼續(xù)分配作為標(biāo)志,靜態(tài)內(nèi)存碎片整理期以上升 期結(jié)束10秒后,5秒以內(nèi)連續(xù)釋放總內(nèi)存分配量的2/3為標(biāo)志。具體應(yīng)用時(shí)本裝置根據(jù)多 次應(yīng)用的具體統(tǒng)計(jì)數(shù)據(jù)調(diào)整上述參數(shù),應(yīng)用程序也可以以通知的方式告知本發(fā)明裝置所處 內(nèi)存管理的各個(gè)時(shí)期。
[0064] Ml內(nèi)存需求上升期與碎片整理期判斷的基本依據(jù)為周期性操作的大數(shù)據(jù)處理的 基本特點(diǎn)是一個(gè)周期開始有需要分配較多的內(nèi)存,加載部分等處理的數(shù)據(jù);處理結(jié)束后集 中釋放大量的數(shù)據(jù)。
[0065] 進(jìn)一步地,根據(jù)本發(fā)明長(zhǎng)期使用的統(tǒng)計(jì)數(shù)據(jù)可以對(duì)上述參數(shù)做自適應(yīng)處理。根據(jù) 本發(fā)明中順序分配和逆序分配方法,如果內(nèi)存需求上升期與碎片整理期判斷有誤時(shí),即時(shí) 修正,結(jié)果不受影響,僅會(huì)消耗一定的CPU資源,比如突然多了 100毫秒的等待。
[0066] 步驟S30 :動(dòng)態(tài)碎片整理--一個(gè)大數(shù)據(jù)處理周期結(jié)果后進(jìn)入碎片整理期,以備下 一周期有連續(xù)的靜態(tài)內(nèi)存空間可供使用,殘留內(nèi)存數(shù)據(jù)向靜態(tài)內(nèi)存區(qū)末端移動(dòng)。具體實(shí)施 方法如下:
[0067] 步驟S301首先對(duì)S124內(nèi)存區(qū)進(jìn)行整理,該區(qū)內(nèi)所有未釋放的內(nèi)存塊均向后移動(dòng), 形成整片連續(xù)已分配的逆序分配內(nèi)存區(qū),S106為目前逆序分配指針,修改相應(yīng)的內(nèi)存分配 記錄表S112。
[0068] 本發(fā)明中內(nèi)存數(shù)據(jù)塊移動(dòng)實(shí)施辦法有兩種情況,(A)移動(dòng)目標(biāo)內(nèi)存區(qū)與移動(dòng)源內(nèi) 存區(qū)無重疊,直接拷貝數(shù)據(jù)并修改內(nèi)存分配記錄表;(B)為了保證順序分配區(qū)與逆序分配 區(qū)連續(xù)無空隙分配,并有連續(xù)大空間可用,本發(fā)明內(nèi)存數(shù)據(jù)移動(dòng)時(shí)有可能出現(xiàn)目標(biāo)內(nèi)存區(qū) 與源內(nèi)存區(qū)有重疊的情況,如果出現(xiàn)重疊,先分配靜態(tài)或動(dòng)態(tài)臨時(shí)內(nèi)存緩沖區(qū),將源數(shù)據(jù)移 動(dòng)到臨時(shí)內(nèi)存緩沖區(qū),修改內(nèi)存分配記錄表,保證移動(dòng)過程中數(shù)據(jù)可用性;再?gòu)呐R時(shí)內(nèi)存緩 沖區(qū)移動(dòng)到目標(biāo)內(nèi)存區(qū)。
[0069] 步驟S302對(duì)所有內(nèi)存分配記錄表中Alloc_Type = 1,并且Alloc_ID>10000,并且 不在逆序分配區(qū)S124的項(xiàng)目,執(zhí)行步驟S303和S304、S305。
[0070] 步驟S303對(duì)Alloc_Addr指向靜態(tài)內(nèi)存區(qū)的項(xiàng)目執(zhí)行步驟S304,否則執(zhí)行步驟 S305。
[0071] 步驟S304逆序分配長(zhǎng)度為Alloc_Len的內(nèi)存,新地址為Alloc_Addr(New),將源 地址Alloc_Addr長(zhǎng)度為Alloc_Len的數(shù)據(jù)移動(dòng)到新地址Alloc_Addr (New),更新內(nèi)存分配 記錄表Alloc_Addr的值。
[0072] S302全部執(zhí)行完成后,指針S105與指針S103相等,S103到S106為整塊連續(xù)可用 的靜態(tài)內(nèi)存空間。
[0073] 步驟S305是可選步驟,如果選擇執(zhí)行該步驟,將重新向操作系統(tǒng)申請(qǐng)動(dòng)態(tài)內(nèi)存、 移動(dòng)數(shù)據(jù)、釋放原內(nèi)存、修改內(nèi)存分配記錄表。執(zhí)行S305的目的是利用操作系統(tǒng)內(nèi)存管理 的特點(diǎn),消耗較少的時(shí)間,使操作系統(tǒng)所管理的內(nèi)存也得到一定程度的清理。即大量釋放少 量保留的情況下,對(duì)少量保留的數(shù)據(jù)重新分配內(nèi)存,會(huì)分配在靠前的位置,后面會(huì)變成大塊 連續(xù)內(nèi)存空間。
[0074] 步驟S30有一個(gè)進(jìn)一步的補(bǔ)充步驟:一個(gè)操作周期后如果殘留數(shù)據(jù)大小 (RemainedDataSize)大于靜態(tài)內(nèi)存總量的1/3時(shí),在S30執(zhí)行完成后,如果能成功向操作系 統(tǒng)申請(qǐng)到RemainedDataSize的動(dòng)態(tài)內(nèi)存,就將S124逆序分配區(qū)的數(shù)據(jù)整塊移動(dòng)到新申請(qǐng) 的動(dòng)態(tài)內(nèi)存中,然后修改內(nèi)存分配記錄表、以及S106 = S104。這樣整個(gè)靜態(tài)內(nèi)存區(qū)用于下 一個(gè)操作周期內(nèi)存分配需求。
[0075] 動(dòng)態(tài)碎片整理后本發(fā)明裝置的內(nèi)存狀態(tài)如圖6所示,這樣對(duì)于每個(gè)操作周期,本 發(fā)明裝置的內(nèi)存狀態(tài)如同剛開始運(yùn)行一樣,不受長(zhǎng)期運(yùn)行后大量?jī)?nèi)存碎片問題、以及虛擬 內(nèi)存數(shù)據(jù)移動(dòng)問題影響效率與穩(wěn)定性。
[0076] 本發(fā)明裝置的內(nèi)存釋放實(shí)施方法有兩種情況,根據(jù)本發(fā)明內(nèi)存記錄表的記錄類 型,選擇內(nèi)存釋放操作:(A)在靜態(tài)內(nèi)存區(qū)的釋放操作(All 〇C_Type = 1),僅需修改使用狀 態(tài)標(biāo)志,即Alloc_ID = 0 ; (B)由操作系統(tǒng)動(dòng)態(tài)分配的內(nèi)存(Alloc_Type = FF),修改標(biāo)志 并通知操作系統(tǒng)釋放相應(yīng)的內(nèi)存。
[0077] 內(nèi)存動(dòng)態(tài)整理期發(fā)生在一個(gè)操作周期結(jié)束以后,動(dòng)態(tài)碎片整理期間裝置處于加鎖 狀態(tài),數(shù)據(jù)訪問和新的分配內(nèi)存、釋放都處于等待狀態(tài),以此保證數(shù)據(jù)和內(nèi)存地址的準(zhǔn)確 性。我們實(shí)際測(cè)試中,多數(shù)情況下內(nèi)存動(dòng)態(tài)碎片整理時(shí)間在1少以內(nèi),少數(shù)情況也少于3秒。
[0078] 以上是本發(fā)明提出的針對(duì)周期性大數(shù)據(jù)處理操作的內(nèi)存管理方法及裝置,以下對(duì) 我們應(yīng)用本發(fā)明前后的情況進(jìn)行說明:
[0079] 本發(fā)明應(yīng)用測(cè)試計(jì)算機(jī)為通用微型計(jì)算機(jī),內(nèi)存配置為1G-32G,一個(gè)操作周期處 理50-10000幀圖像,圖像分辨率通常為512X512到3000X3000之間,每個(gè)圖像處理需要 存放原始數(shù)據(jù)、處理中間數(shù)據(jù)以及顯示緩沖數(shù)據(jù),約為原圖像大小的2. 5倍。比如在CT掃描 圖像分析中,醫(yī)院每天檢查1〇〇人,進(jìn)行1〇〇個(gè)類似的操作周期。本發(fā)明應(yīng)用之前,平均進(jìn) 行處理10余個(gè)操作周期,操作系統(tǒng)會(huì)提不"Out of system resources"、"out of memory" 等內(nèi)存資源不足信息,然后必須重啟系統(tǒng)。當(dāng)計(jì)算機(jī)內(nèi)存配置是最大圖像處理內(nèi)存需求量 的2倍以上時(shí),情況略好,但更多的操作周期過后還是會(huì)出現(xiàn)上述內(nèi)存資源不足的信息和 故障。采用本發(fā)明后上述問題基本消失。每天處理50-100個(gè)操作周期,有時(shí)可以數(shù)天不關(guān) 機(jī)、不退系統(tǒng)的連續(xù)處理,在我們觀察范圍沒見到出現(xiàn)上述內(nèi)存資源不足的情況。
[0080] 以下是我們應(yīng)用本發(fā)明中在幾種配置情況下的近似數(shù)據(jù):
[0081] (A)計(jì)算機(jī)內(nèi)存為1GB,操作系統(tǒng)占用約500MB,靜態(tài)內(nèi)存分配300MB、每個(gè)操作周 期處理數(shù)據(jù)300MB以內(nèi),逆序分配區(qū)最大分配約為50MB,操作系統(tǒng)動(dòng)態(tài)分配量不超過30M。 在不大于上述數(shù)據(jù)量的20%時(shí)長(zhǎng)期運(yùn)行穩(wěn)定。
[0082] (B)計(jì)算機(jī)內(nèi)存為2GB,操作系統(tǒng)占用約800MB,靜態(tài)內(nèi)存分配800MB、每個(gè)操作 周期處理數(shù)據(jù)800MB以內(nèi),逆序分配區(qū)最大分配約為100MB,操作系統(tǒng)動(dòng)態(tài)分配量不超過 40MB。在不大于上述數(shù)據(jù)量的20%時(shí)長(zhǎng)期運(yùn)行穩(wěn)定。
[0083] (C)計(jì)算機(jī)內(nèi)存為4GB,操作系統(tǒng)占用約1GB,靜態(tài)內(nèi)存分配1600MB、每個(gè)操作周期 處理數(shù)據(jù)1600MB以內(nèi),逆序分配區(qū)最大分配約為150MB(增長(zhǎng)很少),操作系統(tǒng)動(dòng)態(tài)分配量 不超過50MB。需求大于2G的處理周期較少,系統(tǒng)運(yùn)行穩(wěn)定正常。
[0084] 通過對(duì)逆序內(nèi)存分配量以及動(dòng)態(tài)內(nèi)存分配量,可以衡量每個(gè)操作周期總內(nèi)存分配 量、內(nèi)存釋放后的碎片情況。對(duì)這幾個(gè)參數(shù)進(jìn)行不斷統(tǒng)計(jì)分析,可以對(duì)上述參數(shù)的配置得到 更準(zhǔn)確的結(jié)果。
[0085] 根據(jù)長(zhǎng)期實(shí)驗(yàn)和應(yīng)用觀察表明,本發(fā)明方法和裝置在周期性操作的大數(shù)據(jù)處理 中,對(duì)提高系統(tǒng)穩(wěn)定性和運(yùn)行效率具有顯著的效果。
[0086] 通過對(duì)一些已公開的相關(guān)內(nèi)存管理方法相比,本發(fā)明方法和裝置針對(duì)周期性操作 的大數(shù)據(jù)處理中每個(gè)操作周期開始基本無內(nèi)存碎片,從而保證了系統(tǒng)長(zhǎng)期穩(wěn)定的運(yùn)行。在 這種針對(duì)性的應(yīng)用中,其它現(xiàn)有技術(shù)和方法均達(dá)不到如此效果。
[〇〇87] 以上所述僅為本發(fā)明的一個(gè)實(shí)施例,并不能以此限制本發(fā)明,凡在本發(fā)明的思想 和方法范圍內(nèi),所做的任何修改、改進(jìn),均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
【權(quán)利要求】
1. 一種周期性大數(shù)據(jù)處理的內(nèi)存管理方法,其特征在于其中內(nèi)存分配管理包括正序分 配、逆序分配以及靜態(tài)內(nèi)存管理與動(dòng)態(tài)分配相結(jié)合,內(nèi)存整理是將所管理的靜態(tài)內(nèi)存保持 前段完全連續(xù)可用,未釋放的數(shù)據(jù)逆序連續(xù)存放于末段。
2. 如權(quán)利要求1所述的周期性大數(shù)據(jù)處理的內(nèi)存管理方法,其特征在于按以下步驟: M0:初始化階段--根據(jù)應(yīng)用程序所處理的數(shù)據(jù)的特點(diǎn)、計(jì)算機(jī)內(nèi)存配置的容量大小、 以及歷史分配情況以及當(dāng)前計(jì)算機(jī)可分配內(nèi)存條件來確定預(yù)分配靜態(tài)內(nèi)存額,向操作系統(tǒng) 申請(qǐng)分配一塊較大的內(nèi)存,該內(nèi)存稱為靜態(tài)內(nèi)存,然后建立內(nèi)存分配記錄表并初始化,初始 化正向靜態(tài)內(nèi)存分配指針S103、正向分配當(dāng)前位置指針S105、逆序分配指針S104、逆序分 配當(dāng)前位置指針S106 ; Ml :內(nèi)存分配管理--應(yīng)用系統(tǒng)內(nèi)存需求上升期,在靜態(tài)內(nèi)存區(qū)中從S103順序無空隙 地向后分配,順序分配指針S105向后移;靜態(tài)內(nèi)存不足以滿足分配需求時(shí),按應(yīng)用系統(tǒng)實(shí) 際申請(qǐng)分配的內(nèi)存大小向操作系統(tǒng)申請(qǐng)動(dòng)態(tài)內(nèi)存,并記入內(nèi)存分配記錄表,經(jīng)過一個(gè)大數(shù) 據(jù)處理操作周期后,進(jìn)入靜態(tài)內(nèi)存碎片整理期,殘留內(nèi)存數(shù)據(jù)移動(dòng)整理時(shí),需再分配靜態(tài)內(nèi) 存空間,這個(gè)階段的分配進(jìn)入逆序分配,就是由S104開始分配,最終把所有靜態(tài)內(nèi)存中未 釋放的數(shù)據(jù)都移動(dòng)到S104開始到S106的一段連續(xù)無空隙的靜態(tài)內(nèi)存區(qū); M2 :動(dòng)態(tài)碎片整理--一個(gè)大數(shù)據(jù)處理周期結(jié)束后進(jìn)入碎片整理期,以備下一周期有 連續(xù)的靜態(tài)內(nèi)存空間可供使用,殘留內(nèi)存數(shù)據(jù)向靜態(tài)內(nèi)存區(qū)末端移動(dòng);結(jié)合Ml內(nèi)存分配方 法,對(duì)靜態(tài)內(nèi)存中未釋放的內(nèi)存進(jìn)行逆序內(nèi)存再分配并移動(dòng)數(shù)據(jù);通過內(nèi)存分配記錄表,判 斷殘留數(shù)據(jù)量大小,如果殘留數(shù)據(jù)大于靜態(tài)內(nèi)存總量的1/3時(shí),在動(dòng)態(tài)碎片整理完成后,向 操作系統(tǒng)重新申請(qǐng)過渡內(nèi)存區(qū),將靜態(tài)內(nèi)存區(qū)末端存放數(shù)據(jù)的區(qū)域移動(dòng)到過渡內(nèi)存區(qū)以存 放殘留數(shù)據(jù); M3 :內(nèi)存釋放--根據(jù)內(nèi)存記錄表處理內(nèi)存釋放操作,在靜態(tài)內(nèi)存區(qū)的釋放操作,僅需 修改使用狀態(tài)標(biāo)志;由操作系統(tǒng)動(dòng)態(tài)分配的內(nèi)存,修改標(biāo)志并通知操作系統(tǒng)釋放相應(yīng)的內(nèi) 存。
3. 如權(quán)利要求1所述的周期性大數(shù)據(jù)處理的內(nèi)存管理方法,其特征在于Ml內(nèi)存需求上 升期標(biāo)志為:兩次分配間隔不超過1秒的連續(xù)內(nèi)存分配量達(dá)上次最大分配量的1/5,并且還 在繼續(xù)分配作為標(biāo)志,靜態(tài)內(nèi)存碎片整理期以上升期結(jié)束10秒后,5秒以內(nèi)連續(xù)釋放總內(nèi) 存分配量的2/3為標(biāo)志。
4. 如權(quán)利要求1所述的周期性大數(shù)據(jù)處理的內(nèi)存管理方法,其特征在于:M1正序分 配和逆序分配共用一塊連續(xù)的靜態(tài)內(nèi)存區(qū),靜態(tài)內(nèi)存用完或超過時(shí),S105指針等于或接近 S106。
5. 如權(quán)利要求1所述的周期性大數(shù)據(jù)處理的內(nèi)存管理方法,其特征在于:M1分配內(nèi)存 時(shí),如果需求內(nèi)存量RequiredMemory+S105>S106時(shí),向操作系統(tǒng)申請(qǐng)相應(yīng)的內(nèi)存。
6. -種周期性大數(shù)據(jù)處理的內(nèi)存管理裝置,其特征在于:包括包括初始化管理模塊、 內(nèi)存分配管理模塊、內(nèi)存整理模塊、操作過程監(jiān)測(cè)模塊、裝置釋放模塊, 初始化模塊根據(jù)應(yīng)用需求、計(jì)算機(jī)內(nèi)存配置、以及歷史分配情況、當(dāng)前計(jì)算機(jī)可分配內(nèi) 存條件確定預(yù)分配靜態(tài)內(nèi)存額,向操作系統(tǒng)申請(qǐng)分配,完成記錄數(shù)據(jù)初始化; 內(nèi)存分配管理模塊,在內(nèi)存需求上升期在靜態(tài)內(nèi)存區(qū)中順序無空隙地向后分配,內(nèi)存 碎片整理期殘留內(nèi)存移動(dòng)再分配時(shí)在靜態(tài)內(nèi)存空間由后向前分配,靜態(tài)內(nèi)存不足以滿足分 配需求時(shí)向操作系統(tǒng)申請(qǐng)動(dòng)態(tài)內(nèi)存,并統(tǒng)一管理; 內(nèi)存整理模塊,主要包括一個(gè)動(dòng)態(tài)內(nèi)存碎片整理程序,在一個(gè)大數(shù)據(jù)處理周期結(jié)果后 進(jìn)入碎片整理,以備下一周期有連續(xù)的靜態(tài)內(nèi)存空間可供使用,殘留內(nèi)存數(shù)據(jù)向靜態(tài)內(nèi)存 區(qū)末端移動(dòng),如果殘留數(shù)據(jù)過大則向操作系統(tǒng)重新申請(qǐng)過渡內(nèi)存區(qū)來存放殘留數(shù)據(jù); 操作過程監(jiān)測(cè)模塊,用于動(dòng)態(tài)判斷內(nèi)存整理模塊運(yùn)行啟動(dòng)的時(shí)機(jī),即判斷內(nèi)存分配處 理需求上升期、內(nèi)存集中釋放期的開始與結(jié)束時(shí)機(jī),啟動(dòng)對(duì)應(yīng)的內(nèi)存分配方案以及內(nèi)存整 理模塊中的動(dòng)態(tài)內(nèi)存碎片整理程序,并對(duì)由于判斷不準(zhǔn)確引起的小問題進(jìn)行修正; 裝置釋放模塊,釋放所有由操作系統(tǒng)分配的動(dòng)態(tài)內(nèi)存,依次釋放靜態(tài)再分配內(nèi)存,最后 釋放預(yù)分配的靜態(tài)內(nèi)存。
【文檔編號(hào)】G06F12/02GK104090848SQ201410338967
【公開日】2014年10月8日 申請(qǐng)日期:2014年7月16日 優(yōu)先權(quán)日:2014年7月16日
【發(fā)明者】鄭家亮 申請(qǐng)人:云南大學(xué)