集群細(xì)粒度內(nèi)存管理方法
【專利摘要】本發(fā)明提供一種集群細(xì)粒度內(nèi)存管理方法,包括下述步驟:步驟一.將內(nèi)存分成兩大類區(qū)域:第一類是全局共享區(qū),負(fù)責(zé)尺寸大于等于尺寸閾值的大對(duì)象的分配和回收,第二類是每個(gè)線程獨(dú)自的線程本地緩存,用于尺寸小于尺寸閾值的小對(duì)象的分配;線程本地緩存由多個(gè)塊組組成,每個(gè)塊組是一個(gè)內(nèi)存對(duì)象的空閑鏈表,且一個(gè)塊組內(nèi)的塊尺寸全部相等;不同塊組之間,塊組內(nèi)的塊尺寸關(guān)系采用階梯式的等差關(guān)系;全局共享區(qū)包括小對(duì)象分配區(qū)和全局頁(yè)緩存;步驟二.針對(duì)應(yīng)用程序申請(qǐng)的內(nèi)存進(jìn)行內(nèi)存分配,區(qū)分大小對(duì)象后分別進(jìn)行對(duì)應(yīng)的分配方式;步驟三.內(nèi)存的釋放;本方法兼顧大對(duì)象與小對(duì)象的分配與釋放,特別適合多線程下的應(yīng)用,內(nèi)存利用率高。
【專利說明】集群細(xì)粒度內(nèi)存管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)領(lǐng)域中分布式集群內(nèi)的一種細(xì)粒度的內(nèi)存管理方法,該方法主要針對(duì)分布式集群中申請(qǐng)的內(nèi)存大小差異比較大的多線程的應(yīng)用場(chǎng)景。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)特別是移動(dòng)互聯(lián)網(wǎng)的快速普及,信息化程度不斷提高,各式各樣的交互式、個(gè)性化應(yīng)用造成了互聯(lián)網(wǎng)中數(shù)據(jù)的爆炸式增長(zhǎng)。在此形勢(shì)之下,有關(guān)海量數(shù)據(jù)存儲(chǔ)的研究隨之發(fā)展迅猛。應(yīng)用系統(tǒng)的業(yè)務(wù)訪問量與日俱增,大量頻繁快速的數(shù)據(jù)訪問請(qǐng)求對(duì)應(yīng)用服務(wù)器和數(shù)據(jù)管理系統(tǒng)的要求越來越高。如何利用有限資源合理提高數(shù)據(jù)訪問效率,成為提升系統(tǒng)性能的關(guān)鍵。在眾多數(shù)據(jù)管理系統(tǒng)和緩存管理系統(tǒng)中,內(nèi)存資源的高效利用和管理無疑是備受關(guān)注的焦點(diǎn)。內(nèi)存的合理利用能夠大幅減少對(duì)磁盤的IO請(qǐng)求,從而快速提升系統(tǒng)性能。當(dāng)前市場(chǎng)上有多種比較流行的基于內(nèi)存的數(shù)據(jù)管理或緩存管理系統(tǒng),如國(guó)外開源的Redis、Memcached等,以及國(guó)內(nèi)的Tair等非持久化存儲(chǔ)層。這些系統(tǒng)均在內(nèi)存的利用和優(yōu)化方面大下功夫,但是仍然存在不少不足之處,比如利用率仍然不高、刪除策略非最優(yōu)、管理自治度不高、無法適用多種應(yīng)用場(chǎng)景等。
[0003]內(nèi)存管理方面,頻繁使用默認(rèn)的malloc和free函數(shù),不但分配效率低下而且會(huì)產(chǎn)生大量的內(nèi)存碎片。所以當(dāng)下主流的數(shù)據(jù)管理系統(tǒng)和緩存管理系統(tǒng)都沒有采用原生方式,而是提供了預(yù)分配內(nèi)存的方案。該方案的基本原理借鑒于內(nèi)存池,首先按照預(yù)先規(guī)定的大小,將預(yù)先分配的內(nèi)存分割成指定長(zhǎng)度的塊組,每個(gè)組中包括若干相同長(zhǎng)度的塊,不同塊組的塊大小按照一個(gè)預(yù)先設(shè)定的增長(zhǎng)因子構(gòu)成等比關(guān)系。初始時(shí),所有塊組中的塊均為空閑內(nèi)存。在進(jìn)行內(nèi)存分配時(shí),該方案會(huì)根據(jù)需求的內(nèi)存大小,從空閑的塊組中選擇大小最接近的且大于所需內(nèi)存的塊來使用。如果該方案用于內(nèi)存分配,則在用戶釋放內(nèi)存的時(shí)候會(huì)將相應(yīng)的塊重新添加到空閑塊組中;如果該方案用于緩存管理,則根據(jù)LRU (Least RecentlyUsed,最近最少使用)算法進(jìn)行緩存的過期淘汰和重復(fù)利用。一些系統(tǒng)在應(yīng)用該方案時(shí)將增長(zhǎng)因子設(shè)置成為2,即后一個(gè)塊組的塊大小為前一個(gè)塊組的塊大小的2倍。但這樣塊大小增長(zhǎng)會(huì)很快,后面的塊的差距會(huì)很大,容易造成空間浪費(fèi)。此外,該方案在多線程的情況下必須采用加鎖機(jī)制,影響內(nèi)存的分配和回收效率。
[0004]綜上,當(dāng)前的內(nèi)存管理方案主要存在以下問題
(I)內(nèi)存的分配和回收速度。
[0005](2)多線程下的性能表現(xiàn)。
[0006](3)同時(shí)適用小對(duì)象與大對(duì)象的問題。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的在于克服現(xiàn)有技術(shù)中存在的不足,提供一種集群細(xì)粒度內(nèi)存管理方法,提升內(nèi)存的分配和回收效率,減少內(nèi)存碎片的產(chǎn)生,提高內(nèi)存利用率。本發(fā)明采用的技術(shù)方案是: 一種集群細(xì)粒度內(nèi)存管理方法,包括下述步驟:
步驟一.將內(nèi)存分成兩大類區(qū)域:第一類是全局共享區(qū),負(fù)責(zé)尺寸大于等于尺寸閾值的大對(duì)象的分配和回收;第二類是每個(gè)線程獨(dú)自的線程本地緩存,用于尺寸小于尺寸閾值的小對(duì)象的分配;
線程本地緩存由多個(gè)塊組組成,每個(gè)塊組是一個(gè)內(nèi)存對(duì)象的空閑鏈表,且一個(gè)塊組內(nèi)的塊尺寸全部相等;不同塊組之間,塊組內(nèi)的塊尺寸關(guān)系采用階梯式的等差關(guān)系;
全局共享區(qū)包括小對(duì)象分配區(qū)和全局頁(yè)緩存;小對(duì)象分配區(qū)的結(jié)構(gòu)與線程本地緩存相同,且有鎖保護(hù);全局頁(yè)緩存用于處理大對(duì)象,且有鎖保護(hù);
全局頁(yè)緩存由多個(gè)空閑鏈表組成,全局頁(yè)緩存的空閑鏈表稱作頁(yè)面組;每個(gè)空閑鏈表包含多個(gè)元素,全局頁(yè)緩存的空閑鏈表的元素是相同尺寸的連續(xù)的內(nèi)存頁(yè);第I個(gè)頁(yè)面組的元素的尺寸是I個(gè)內(nèi)存頁(yè),第2個(gè)頁(yè)面組的元素的尺寸是2個(gè)內(nèi)存頁(yè),以此類推,第255個(gè)頁(yè)面組的元素的尺寸是255個(gè)內(nèi)存頁(yè),但第256個(gè)頁(yè)面組的元素的尺寸是大于等于256個(gè)內(nèi)存頁(yè)。
[0008]進(jìn)一步地,線程本地緩存中不同塊組之間,塊組內(nèi)的塊尺寸階梯式的等差關(guān)系具體為:對(duì)較小的尺寸相差8個(gè)字節(jié),略大一點(diǎn)的尺寸相差16個(gè)字節(jié),然后相差32個(gè)字節(jié),直至最大的尺寸相差間隔為256個(gè)字節(jié)。
[0009]進(jìn)一步地,區(qū)分大對(duì)象和小對(duì)象的尺寸閾值為32KB。
[0010]步驟二.針對(duì)應(yīng)用程序申請(qǐng)的內(nèi)存進(jìn)行內(nèi)存分配,包括:
首先判斷所申請(qǐng)的內(nèi)存大小是否大于等于尺寸閾值;
若大于等于尺寸閾值,則進(jìn)行步驟a ;否則,進(jìn)行步驟b ;
a.大對(duì)象的分配:
a-Ι.將所需分配的尺寸,按4K的粒度向上圓整,設(shè)圓整后的大對(duì)象尺寸size=m*4K ;m為正整數(shù);
a-2.對(duì)全局共享區(qū)的全局頁(yè)緩存加鎖;
a-3.記p=max{2*m, 256},判斷頁(yè)面組m的空閑鏈表是否為空;
若不空,則直接刪除該鏈表的第一個(gè)元素并將其返回;
若為空,判斷頁(yè)面組P的空閑鏈表是否為空;
若不空,則刪除該鏈表的第一個(gè)元素得到連續(xù)的P個(gè)內(nèi)存頁(yè),將該連續(xù)的P個(gè)內(nèi)存頁(yè)拆分成連續(xù)的m個(gè)頁(yè)面和(p-m)個(gè)頁(yè)面,分別插入到頁(yè)面組m和頁(yè)面組(ρ-m)中,重復(fù)步驟a_3 ;
若為空,則直接向操作系統(tǒng)申請(qǐng)連續(xù)的m個(gè)內(nèi)存頁(yè),將該連續(xù)的m個(gè)內(nèi)存頁(yè)添加到頁(yè)面組m后,重復(fù)步驟a-3 ;
a-4.釋放全局共享區(qū)的全局頁(yè)緩存的鎖;
b.小對(duì)象的分配,對(duì)應(yīng)線程本地緩存;
b-1.將所需分配的尺寸向上圓整到最接近的塊組內(nèi)塊的尺寸,設(shè)尺寸為size',且相對(duì)應(yīng)的塊組為塊組k ;
b-2.判斷塊組k的空閑鏈表是否為空;
若不空,則刪除該空閑鏈表的第一個(gè)元素并將其返回;
若為空,則需要對(duì)全局共享區(qū)進(jìn)行操作;對(duì)全局共享區(qū)的小對(duì)象分配區(qū)申請(qǐng)加鎖;
判斷全局共享區(qū)中小對(duì)象分配區(qū)的塊組k是否為空;
若不空,則從該塊組中轉(zhuǎn)移若干元素到線程本地緩存的塊組k中,釋放全局共享區(qū)的小對(duì)象分配區(qū)的鎖,重復(fù)步驟b-2 ;
若為空,則向全局頁(yè)緩存申請(qǐng)new+sizezmaxisize' *2,尺寸閾值}大小的大對(duì)象;申請(qǐng)成功后將該大對(duì)象拆分成若干個(gè)大小為Siz^的小對(duì)象,添加到全局共享區(qū)的小對(duì)象分配區(qū)的塊組k中,釋放全局共享區(qū)的小對(duì)象分配區(qū)的鎖,重復(fù)步驟b-2。
[0011]步驟三.內(nèi)存的釋放;
首先判斷釋放的內(nèi)存是否大于等于尺寸閾值;
若大于等于尺寸閾值,則進(jìn)行步驟a';否則,進(jìn)行步驟b';.大對(duì)象的釋放; a' -1.申請(qǐng)對(duì)全局共享區(qū)中的全局頁(yè)緩存加鎖;
a' -2.判斷全局頁(yè)緩存的總空間是否超過設(shè)定空間閾值,若超過,直接將大對(duì)象釋放給操作系統(tǒng);否則,將待釋放的內(nèi)存添加回相對(duì)應(yīng)的全局頁(yè)緩存的頁(yè)面組;a' -3.對(duì)全局頁(yè)緩存解鎖;h'.小對(duì)象的釋放;
b' -1.判斷線程本地緩存的空間占用是否超過設(shè)定的空間閾值;b/ -2.若未超過 ,則直接將小對(duì)象添加回相對(duì)應(yīng)的塊組中,結(jié)束釋放流程;否則,繼續(xù)下一步;
b/ -3.超過閾值時(shí),需要將小對(duì)象釋放到全局共享區(qū),具體如下所述:
申請(qǐng)對(duì)全局共享區(qū)的小對(duì)象分配區(qū)加鎖;
將小對(duì)象添加到全局共享區(qū)中小對(duì)象分配區(qū)的對(duì)應(yīng)塊組中;
判斷小對(duì)象分配區(qū)的總大小是否超過設(shè)定的閾值,若未超過,則直接釋放鎖,并結(jié)束釋放流程;
超過閾值時(shí),掃描小對(duì)象分配區(qū)的所有小對(duì)象并排序;
將所有能合并成一個(gè)大對(duì)象的小對(duì)象,從小對(duì)象分配區(qū)中刪除,并合并成一個(gè)大對(duì)
象;
將該大對(duì)象釋放到全局頁(yè)緩存當(dāng)中;
釋放小對(duì)象分配區(qū)的鎖,結(jié)束釋放流程。
[0012]本發(fā)明的優(yōu)點(diǎn)在于:本方法兼顧大對(duì)象與小對(duì)象的分配與釋放,特別適合多線程下的應(yīng)用,內(nèi)存利用率高。
【專利附圖】
【附圖說明】
[0013]圖1為本發(fā)明的全局共享區(qū)和線程本地緩存示意圖。
[0014]圖2為本發(fā)明的線程本地緩存結(jié)構(gòu)示意圖。
[0015]圖3為本發(fā)明的全局共享區(qū)的全局頁(yè)緩存結(jié)構(gòu)示意圖。
[0016]圖4為本發(fā)明的流程圖。
【具體實(shí)施方式】[0017]下面結(jié)合具體附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明。
[0018]本發(fā)明主要將內(nèi)存分成兩大類區(qū)域:第一類是全局共享區(qū),主要負(fù)責(zé)大對(duì)象(尺寸大于等于32KB)的分配和回收;第二類是每個(gè)線程獨(dú)自的線程本地緩存,對(duì)于小對(duì)象(尺寸小于32KB)的分配可以直接由線程本地緩存來滿足。需要的話會(huì)將內(nèi)存從全局共享區(qū)遷移到線程本地緩存中,同時(shí)定期的垃圾收集用于將內(nèi)存從線程本地緩存遷移回全局共享區(qū)。兩者關(guān)系如圖1所不。
[0019]下面重點(diǎn)介紹一下:線程本地緩存的結(jié)構(gòu)、全局共享區(qū)的結(jié)構(gòu)以及對(duì)象的分配和釋放流程。
[0020]1.線程本地緩存的結(jié)構(gòu),如圖2所示。
[0021]盡管應(yīng)用程序可以申請(qǐng)任意尺寸的小對(duì)象,但為便于管理,本發(fā)明采用預(yù)分配方式且只提供固定尺寸的空間。所提供的尺寸包括:32B,40B,48B, 56B, 64B, 80B, 96B, 112B,128B,160B等。尺寸大小的關(guān)系采用階梯式的等差關(guān)系,較小的尺寸間相差8個(gè)字節(jié),略大一點(diǎn)的尺寸相差16個(gè)字節(jié),然后相差32個(gè)字節(jié),但最大的尺寸相差間隔限定為256個(gè)字節(jié)。這種方式可以有效避免固定增長(zhǎng)因子帶來的空間浪費(fèi)問題。線程本地緩存由多個(gè)塊組組成,每個(gè)塊組是一個(gè)內(nèi)存對(duì)象的空閑鏈表,且一個(gè)塊組內(nèi)的塊尺寸全部相等。
[0022]2.全局共享區(qū)有兩部分構(gòu)成:一部分是類似線程本地緩存的小對(duì)象分配區(qū),結(jié)構(gòu)與線程本地緩存相同,但是有鎖保護(hù);另一部分是處理大對(duì)象分配的全局頁(yè)緩存,同樣有鎖保護(hù)。
[0023]跟線程本地緩存一樣,全局頁(yè)緩存同樣由一堆空閑鏈表組成,不過它的空閑鏈表的元素是相同尺寸的連續(xù)的內(nèi)存頁(yè),且該空閑鏈表稱作頁(yè)面組。頁(yè)面組I的元素的尺寸是I個(gè)內(nèi)存頁(yè),頁(yè)面組2的元素的尺寸是2個(gè)內(nèi)存頁(yè),以此類推,頁(yè)面組255的元素的尺寸是255個(gè)內(nèi)存頁(yè),但頁(yè)面組256的元素的尺寸則是大于等于256個(gè)內(nèi)存頁(yè)。具體結(jié)構(gòu)如圖3。
[0024]3.內(nèi)存的分配。
[0025]應(yīng)用程序的內(nèi)存分配流程如下:
1)首先判斷所申請(qǐng)的內(nèi)存大小是否大于等于32K;
2)若大于等于32K,則認(rèn)定分配的是大對(duì)象,進(jìn)行步驟a;否則,認(rèn)為是小對(duì)象的分配,進(jìn)行步驟b;
a.大對(duì)象的分配:
a-Ι.將所需分配的尺寸,按4K的粒度向上圓整,設(shè)圓整后的大對(duì)象尺寸size=m*4K ;m為正整數(shù);
a-2.對(duì)全局共享區(qū)的全局頁(yè)緩存加鎖;
a-3.記p=max{2*m, 256},判斷頁(yè)面組m的空閑鏈表是否為空;
若不空,則直接刪除該鏈表的第一個(gè)元素并將其返回;
若為空,判斷頁(yè)面組P的空閑鏈表是否為空;
若不空,則刪除該鏈表的第一個(gè)元素得到連續(xù)的P個(gè)內(nèi)存頁(yè),將該連續(xù)的P個(gè)內(nèi)存頁(yè)拆分成連續(xù)的m個(gè)頁(yè)面和(p-m)個(gè)頁(yè)面,分別插入到頁(yè)面組m和頁(yè)面組(p-m)中,重復(fù)步驟a_3 ;
若為空,則直接向操作系統(tǒng)申請(qǐng)連續(xù)的m個(gè)內(nèi)存頁(yè),將該連續(xù)的m個(gè)內(nèi)存頁(yè)添加到頁(yè)面組m后,重復(fù)步驟a-3 ;a-4.釋放全局共享區(qū)的全局頁(yè)緩存的鎖;
b.小對(duì)象的分配,對(duì)應(yīng)線程本地緩存;
b-1.將所需分配的尺寸向上圓整到最接近的塊組內(nèi)塊的尺寸,設(shè)尺寸為size',且相對(duì)應(yīng)的塊組為塊組k ;
b-2.判斷塊組k的空閑鏈表是否為空;
若不空,則刪除該空閑鏈表的第一個(gè)元素并將其返回;
若為空,則需要對(duì)全局共享區(qū)進(jìn)行操作;
對(duì)全局共享區(qū)的小對(duì)象分配區(qū)申請(qǐng)加鎖;
判斷全局共享區(qū)中小對(duì)象分配區(qū)的塊組k是否為空;
若不空,則從該塊組中轉(zhuǎn)移若干元素到線程本地緩存的塊組k中,釋放全局共享區(qū)的小對(duì)象分配區(qū)的鎖,重復(fù)步驟b-2 ;
若為空,則向全局頁(yè)緩存申請(qǐng)new+sizezmaxisize' *2,尺寸閾值32K}大小的大對(duì)象;申請(qǐng)成功后將該大對(duì)象拆分成若干個(gè)大小為Siz^的小對(duì)象,添加到全局共享區(qū)的小對(duì)象分配區(qū)的塊組k中,釋放全局共享區(qū)的小對(duì)象分配區(qū)的鎖,重復(fù)步驟b-2。
[0026]4.內(nèi)存的釋放。
[0027]內(nèi)存釋放的流程如下:
1)首先判斷釋放的內(nèi)存是否大于等于32K;
2)若大于等于32K,則認(rèn)為是大對(duì)象的釋放,進(jìn)行步驟a';否則,認(rèn)為是小對(duì)象的釋放,走步驟b';.大對(duì)象的釋放; a' -1.申請(qǐng)對(duì)全局共享區(qū)中的全局頁(yè)緩存加鎖;
a' -2.判斷全局頁(yè)緩存的總空間是否超過設(shè)定空間閾值,若超過,直接將大對(duì)象釋放給操作系統(tǒng);否則,將待釋放的內(nèi)存添加回相對(duì)應(yīng)的全局頁(yè)緩存的頁(yè)面組;a' -3.對(duì)全局頁(yè)緩存解鎖;h'.小對(duì)象的釋放;
b' -1.判斷線程本地緩存的空間占用是否超過設(shè)定的空間閾值;b/ -2.若未超過,則直接將小對(duì)象添加回相對(duì)應(yīng)的塊組中,結(jié)束釋放流程;否則,繼續(xù)下一步;
b/ -3.超過閾值時(shí),需要將小對(duì)象釋放到全局共享區(qū),具體如下所述:
申請(qǐng)對(duì)全局共享區(qū)的小對(duì)象分配區(qū)加鎖;
將小對(duì)象添加到全局共享區(qū)中小對(duì)象分配區(qū)的對(duì)應(yīng)塊組中;
判斷小對(duì)象分配區(qū)的總大小是否超過設(shè)定的閾值,若未超過,則直接釋放鎖,并結(jié)束釋放流程;
超過閾值時(shí),掃描小對(duì)象分配區(qū)的所有小對(duì)象并排序;
將所有能合并成一個(gè)大對(duì)象(大于等于32K)的小對(duì)象,從小對(duì)象分配區(qū)中刪除,并合并成一個(gè)大對(duì)象;
將該大對(duì)象釋放到全局頁(yè)緩存當(dāng)中;
釋放小對(duì)象分配區(qū)的鎖,結(jié)束釋放流程。
【權(quán)利要求】
1.一種集群細(xì)粒度內(nèi)存管理方法,其特征在于,包括下述步驟: 步驟一.將內(nèi)存分成兩大類區(qū)域:第一類是全局共享區(qū),負(fù)責(zé)尺寸大于等于尺寸閾值的大對(duì)象的分配和回收;第二類是每個(gè)線程獨(dú)自的線程本地緩存,用于尺寸小于尺寸閾值的小對(duì)象的分配; 線程本地緩存由多個(gè)塊組組成,每個(gè)塊組是一個(gè)內(nèi)存對(duì)象的空閑鏈表,且一個(gè)塊組內(nèi)的塊尺寸全部相等;不同塊組之間,塊組內(nèi)的塊尺寸關(guān)系采用階梯式的等差關(guān)系; 全局共享區(qū)包括小對(duì)象分配區(qū)和全局頁(yè)緩存;小對(duì)象分配區(qū)的結(jié)構(gòu)與線程本地緩存相同,且有鎖保護(hù);全局頁(yè)緩存用于處理大對(duì)象,且有鎖保護(hù); 全局頁(yè)緩存由多個(gè)空閑鏈表組成,全局頁(yè)緩存的空閑鏈表稱作頁(yè)面組;每個(gè)空閑鏈表包含多個(gè)元素,全局頁(yè)緩存的空閑鏈表的元素是相同尺寸的連續(xù)的內(nèi)存頁(yè);第I個(gè)頁(yè)面組的元素的尺寸是I個(gè)內(nèi)存頁(yè),第2個(gè)頁(yè)面組的元素的尺寸是2個(gè)內(nèi)存頁(yè),以此類推,第255個(gè)頁(yè)面組的元素的尺寸是255個(gè)內(nèi)存頁(yè),但第256個(gè)頁(yè)面組的元素的尺寸是大于等于256個(gè)內(nèi)存頁(yè)。
2.如權(quán)利要求1所述的集群細(xì)粒度內(nèi)存管理方法,其特征在于: 線程本地緩存中不同塊組之間,塊組內(nèi)的塊尺寸階梯式的等差關(guān)系具體為:對(duì)較小的尺寸相差8個(gè)字節(jié),略大一點(diǎn)的尺寸相差16個(gè)字節(jié),然后相差32個(gè)字節(jié),直至最大的尺寸相差間隔為256個(gè)字節(jié)。
3.如權(quán)利要 求1所述的集群細(xì)粒度內(nèi)存管理方法,其特征在于:區(qū)分大對(duì)象和小對(duì)象的尺寸閾值為32KB。
4.如權(quán)利要求1、2或3所述的集群細(xì)粒度內(nèi)存管理方法,其特征在于:步驟一之后,還包括下述步驟: 步驟二.針對(duì)應(yīng)用程序申請(qǐng)的內(nèi)存進(jìn)行內(nèi)存分配,包括: 首先判斷所申請(qǐng)的內(nèi)存大小是否大于等于尺寸閾值; 若大于等于尺寸閾值,則進(jìn)行步驟a ;否則,進(jìn)行步驟b ; a.大對(duì)象的分配: a-Ι.將所需分配的尺寸,按4K的粒度向上圓整,設(shè)圓整后的大對(duì)象尺寸size=m*4K ;m為正整數(shù); a-2.對(duì)全局共享區(qū)的全局頁(yè)緩存加鎖; a-3.記p=max{2*m, 256},判斷頁(yè)面組m的空閑鏈表是否為空; 若不空,則直接刪除該鏈表的第一個(gè)元素并將其返回; 若為空,判斷頁(yè)面組P的空閑鏈表是否為空; 若不空,則刪除該鏈表的第一個(gè)元素得到連續(xù)的P個(gè)內(nèi)存頁(yè),將該連續(xù)的P個(gè)內(nèi)存頁(yè)拆分成連續(xù)的m個(gè)頁(yè)面和(p-m)個(gè)頁(yè)面,分別插入到頁(yè)面組m和頁(yè)面組(ρ-m)中,重復(fù)步驟a_3 ; 若為空,則直接向操作系統(tǒng)申請(qǐng)連續(xù)的m個(gè)內(nèi)存頁(yè),將該連續(xù)的m個(gè)內(nèi)存頁(yè)添加到頁(yè)面組m后,重復(fù)步驟a-3 ; a-4.釋放全局共享區(qū)的全局頁(yè)緩存的鎖; b.小對(duì)象的分配,對(duì)應(yīng)線程本地緩存; b-1.將所需分配的尺寸向上圓整到最接近的塊組內(nèi)塊的尺寸,設(shè)尺寸為size',且相對(duì)應(yīng)的塊組為塊組k ; b-2. 判斷塊組k的空閑鏈表是否為空; 若不空,則刪除該空閑鏈表的第一個(gè)元素并將其返回; 若為空,則需要對(duì)全局共享區(qū)進(jìn)行操作; 對(duì)全局共享區(qū)的小對(duì)象分配區(qū)申請(qǐng)加鎖; 判斷全局共享區(qū)中小對(duì)象分配區(qū)的塊組k是否為空; 若不空,則從該塊組中轉(zhuǎn)移若干元素到線程本地緩存的塊組k中,釋放全局共享區(qū)的小對(duì)象分配區(qū)的鎖,重復(fù)步驟b-2 ; 若為空,則向全局頁(yè)緩存申請(qǐng)new+sizezmaxisize' *2,尺寸閾值}大小的大對(duì)象;申請(qǐng)成功后將該大對(duì)象拆分成若干個(gè)大小為Siz^的小對(duì)象,添加到全局共享區(qū)的小對(duì)象分配區(qū)的塊組k中,釋放全局共享區(qū)的小對(duì)象分配區(qū)的鎖,重復(fù)步驟b-2。
5.如權(quán)利要求4所述的集群細(xì)粒度內(nèi)存管理方法,其特征在于:步驟二之后,還包括下述步驟: 步驟三.內(nèi)存的釋放; 首先判斷釋放的內(nèi)存是否大于等于尺寸閾值; 若大于等于尺寸閾值,則進(jìn)行步驟a';否則,進(jìn)行步驟b';.大對(duì)象的釋放; a' -1.申請(qǐng)對(duì)全局共享區(qū)中的全局頁(yè)緩存加鎖; a' -2.判斷全局頁(yè)緩存的總空間是否超過設(shè)定空間閾值,若超過,直接將大對(duì)象釋放給操作系統(tǒng);否則,將待釋放的內(nèi)存添加回相對(duì)應(yīng)的全局頁(yè)緩存的頁(yè)面組;a' -3.對(duì)全局頁(yè)緩存解鎖;h'.小對(duì)象的釋放; b' -1.判斷線程本地緩存的空間占用是否超過設(shè)定的空間閾值;b/ -2.若未超過,則直接將小對(duì)象添加回相對(duì)應(yīng)的塊組中,結(jié)束釋放流程;否則,繼續(xù)下一步; b/ -3.超過閾值時(shí),需要將小對(duì)象釋放到全局共享區(qū),具體如下所述: 申請(qǐng)對(duì)全局共享區(qū)的小對(duì)象分配區(qū)加鎖; 將小對(duì)象添加到全局共享區(qū)中小對(duì)象分配區(qū)的對(duì)應(yīng)塊組中; 判斷小對(duì)象分配區(qū)的總大小是否超過設(shè)定的閾值,若未超過,則直接釋放鎖,并結(jié)束釋放流程; 超過閾值時(shí),掃描小對(duì)象分配區(qū)的所有小對(duì)象并排序; 將所有能合并成一個(gè)大對(duì)象的小對(duì)象,從小對(duì)象分配區(qū)中刪除,并合并成一個(gè)大對(duì)象; 將該大對(duì)象釋放到全局頁(yè)緩存當(dāng)中; 釋放小對(duì)象分配區(qū)的鎖,結(jié)束釋放流程。
【文檔編號(hào)】G06F9/50GK103914265SQ201410141276
【公開日】2014年7月9日 申請(qǐng)日期:2014年4月9日 優(yōu)先權(quán)日:2014年4月9日
【發(fā)明者】安豐春, 臺(tái)憲青, 王艷軍, 趙旦譜, 圖博 申請(qǐng)人:江蘇物聯(lián)網(wǎng)研究發(fā)展中心