一種內(nèi)存池的管理方法和裝置制造方法
【專利摘要】本發(fā)明公開了一種內(nèi)存池的管理方法和裝置,屬于通信領(lǐng)域。方法包括:當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的最近最少使用LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊;在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用;當(dāng)所述內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從所述LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到所述內(nèi)存池中的空閑內(nèi)存塊不大于所述閾值。本發(fā)明解決了目前用戶請求內(nèi)存時每次需要在TLB中建立地址映射以及向系統(tǒng)釋放內(nèi)存時從較大的內(nèi)存塊開始淘汰而不管這些內(nèi)存塊是否經(jīng)常被使用的問題,提高了CPU的訪問速度和內(nèi)存分配效率,降低了內(nèi)存池發(fā)生抖動現(xiàn)象的概率。
【專利說明】一種內(nèi)存池的管理方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及通信領(lǐng)域,特別涉及一種內(nèi)存池的管理方法和裝置。
【背景技術(shù)】
[0002]內(nèi)存池是為了解決直接申請分配內(nèi)存導(dǎo)致所申請內(nèi)存塊大小不定以及當(dāng)頻繁使用內(nèi)存時造成大量內(nèi)存碎片的問題而采用的一種內(nèi)存分配方式。內(nèi)存池在使用內(nèi)存之前,先申請分配一定數(shù)量的、一般大小相等的內(nèi)存塊留作備用;當(dāng)有新的內(nèi)存需求時,就從內(nèi)存池中分出一部分內(nèi)存塊使用,若內(nèi)存塊不夠再繼續(xù)申請新的內(nèi)存,從而盡量避免內(nèi)存碎片,使得內(nèi)存分配效率得到提升。
[0003]目前,當(dāng)內(nèi)存池的用戶請求內(nèi)存時,則根據(jù)用戶請求的內(nèi)存大小從內(nèi)存池中取出一個空閑內(nèi)存塊給用戶使用,用戶根據(jù)返回的內(nèi)存塊在TLB (Translation LookasideBuffer,旁路轉(zhuǎn)換緩沖)中建立地址映射,以便CPU (Central Processing Unit,中央處理器)訪問;如果內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請一塊新內(nèi)存塊給用戶使用;當(dāng)內(nèi)存池中空閑內(nèi)存過大時,則向系統(tǒng)釋放內(nèi)存池中的空閑內(nèi)存塊,一般是從較大的內(nèi)存塊開始淘汰。
[0004]在實現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:
[0005]用戶請求內(nèi)存時,直接從內(nèi)存池中取空閑內(nèi)存塊,每次需要在TLB中建立地址映射,降低了 CPU的訪問速度;而向系統(tǒng)釋放內(nèi)存時,一般是從較大的內(nèi)存塊開始淘汰,而不管這些內(nèi)存塊是否經(jīng)常被使用,導(dǎo)致內(nèi)存塊剛被釋放回系統(tǒng)又要從系統(tǒng)中重新申請回來的內(nèi)存池抖動現(xiàn)象,降低了內(nèi)存池中的內(nèi)存分配效率。
【發(fā)明內(nèi)容】
[0006]為了解決現(xiàn)有技術(shù)的問題,本發(fā)明實施例提供了一種內(nèi)存池的管理方法和裝置。所述技術(shù)方案如下:
[0007]一方面,提供了一種內(nèi)存池的管理方法,所述方法包括:
[0008]當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的最近最少使用LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊;
[0009]在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用;
[0010]當(dāng)所述內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從所述LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到所述內(nèi)存池中的空閑內(nèi)存塊不大于所述閾值。
[0011]具體地,所述接收到用戶的內(nèi)存請求之前,包括:
[0012]在所述內(nèi)存池中添加LRU鏈表,所述LRU鏈表中依照使用時間由后向前的順序記錄所述內(nèi)存池中所有內(nèi)存塊的使用時間。
[0013]具體地,所述將查找到的空閑內(nèi)存塊返回給所述用戶使用之后,包括:
[0014]修改所述LRU鏈表,將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端。[0015]具體地,所述在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,還包括:
[0016]如果在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從所述內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給所述用戶使用,并將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端;
[0017]如果所述內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給所述用戶使用,將所述申請的新內(nèi)存塊置于所述LRU鏈表頭部的最前端。
[0018]具體地,所述在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用,包括:
[0019]如果在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于所述LRU鏈表頭部最前端的空閑內(nèi)存塊返回給所述用戶使用。
[0020]另一方面,提供了一種內(nèi)存池的管理裝置,所述裝置包括:
[0021]獲取模塊,用于當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊;
[0022]查找模塊,用于在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用;
[0023]釋放模塊,用于當(dāng)所述內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從所述LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到所述內(nèi)存池中的空閑內(nèi)存塊不大于所述閾值。
[0024]具體地,所述裝置包括:
[0025]添加模塊,用于所述獲取模塊接收到用戶的內(nèi)存請求之前,在所述內(nèi)存池中添加LRU鏈表,所述LRU鏈表中依照使用時間由后向前的順序記錄所述內(nèi)存池中所有內(nèi)存塊的使用時間。
[0026]具體地,所述裝置包括:
[0027]修改模塊,用于所述查找模塊將查找到的空閑內(nèi)存塊返回給所述用戶使用之后,修改所述LRU鏈表,將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端。
[0028]具體地,所述裝置還包括:
[0029]調(diào)取模塊,用于如果所述查找模塊在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從所述內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給所述用戶使用,并將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端;如果所述內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給所述用戶使用,將所述申請的新內(nèi)存塊置于所述LRU鏈表頭部的最前端。
[0030]具體地,所述查找模塊,用于如果在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于所述LRU鏈表頭部最前端的空閑內(nèi)存塊返回給所述用戶使用。
[0031]本發(fā)明實施例提供的技術(shù)方案帶來的有益效果是:
[0032]通過接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊,將在這些內(nèi)存塊中查找到的空閑內(nèi)存塊返回給用戶使用;當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,解決了目前用戶在內(nèi)存池中請求內(nèi)存時每次需要在TLB中建立地址映射以及向系統(tǒng)釋放內(nèi)存時從較大的內(nèi)存塊開始淘汰而不管這些內(nèi)存塊是否經(jīng)常被使用的問題,提高了 CPU的訪問速度和內(nèi)存分配效率,降低了內(nèi)存池發(fā)生抖動現(xiàn)象的概率。
【專利附圖】
【附圖說明】
[0033]為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0034]圖1是本發(fā)明實施例一提供的內(nèi)存池的管理方法流程圖;
[0035]圖2是本發(fā)明實施例二提供的內(nèi)存池的管理方法流程圖;
[0036]圖3是本發(fā)明實施例三提供的內(nèi)存池的管理裝置第一種結(jié)構(gòu)示意圖;
[0037]圖4是本發(fā)明實施例三提供的內(nèi)存池的管理裝置第二種結(jié)構(gòu)示意圖;
[0038]圖5是本發(fā)明實施例三提供的內(nèi)存池的管理裝置第三種結(jié)構(gòu)示意圖;
[0039]圖6是本發(fā)明實施例三提供的內(nèi)存池的管理裝置第四種結(jié)構(gòu)示意圖;
[0040]圖7是本發(fā)明實施例三提供的內(nèi)存池的管理裝置第五種結(jié)構(gòu)示意圖;
[0041]圖8是本發(fā)明實施例三提供的內(nèi)存池的管理裝置第六種結(jié)構(gòu)示意圖。
【具體實施方式】
[0042]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明實施方式作進(jìn)一步地詳細(xì)描述。
[0043]實施例一
[0044]參見圖1,本發(fā)明實施例提供了一種內(nèi)存池的管理方法,該方法包括:
[0045]101、當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRlXLeast RecentlyUsed,最近最少使用)鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊;
[0046]102、在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給用戶使用;
[0047]103、當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到內(nèi)存池中的空閑內(nèi)存塊不大于閾值。
[0048]具體地,接收到用戶的內(nèi)存請求之前,包括:
[0049]在內(nèi)存池中添加LRU鏈表,LRU鏈表中依照使用時間由后向前的順序記錄內(nèi)存池中所有內(nèi)存塊的使用時間。
[0050]具體地,將查找到的空閑內(nèi)存塊返回給用戶使用之后,包括:
[0051]修改LRU鏈表,將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端。
[0052]具體地,在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,還包括:
[0053]如果在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給用戶使用,并將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端;
[0054]如果內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給用戶使用,將申請的新內(nèi)存塊置于LRU鏈表頭部的最前端。
[0055]具體地,在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給用戶使用,包括:[0056]如果在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于LRU鏈表頭部最前端的空閑內(nèi)存塊返回給用戶使用。
[0057]本發(fā)明實施例提供的方法,通過接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊,將在這些內(nèi)存塊中查找到的空閑內(nèi)存塊返回給用戶使用;當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,解決了目前用戶在內(nèi)存池中請求內(nèi)存時每次需要在TLB中建立地址映射以及向系統(tǒng)釋放內(nèi)存時從較大的內(nèi)存塊開始淘汰而不管這些內(nèi)存塊是否經(jīng)常被使用的問題,提高了CPU的訪問速度和內(nèi)存分配效率,降低了內(nèi)存池發(fā)生抖動現(xiàn)象的概率。
[0058]實施例二
[0059]參見圖2,本發(fā)明實施例提供了一種內(nèi)存池的管理方法,該方法包括:
[0060]201、在內(nèi)存池中添加LRU鏈表,LRU鏈表中依照使用時間由后向前的順序記錄內(nèi)存池中所有內(nèi)存塊的使用時間;
[0061]具體地,參見圖3,內(nèi)存池由多個chunk組成,每個chunk則由多個內(nèi)存大小相等的內(nèi)存塊組成,如圖 3 中的 32byte 的 chunk 32、64byte 的 chunk 64、128byte 的 chunk 128 ;其中,每個chunk可以是一塊連續(xù)固定的內(nèi)存也可以是鏈接起來的block鏈表。
[0062]參見圖4,本發(fā)明實施例中在內(nèi)存池中添加一個包含所有內(nèi)存塊的LRU鏈表如圖4中將chunk 32、chunk 64以及chunk 128中包含的所有內(nèi)存塊形成一個全局的LRU鏈表,在該LRU鏈表中記錄著內(nèi)存池中所有內(nèi)存塊的使用時間的先后順序,其中最近使用的內(nèi)存塊在LRU鏈表的前端,根據(jù)使用先后順序依次排列。
[0063]202、當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊;
[0064]具體地,當(dāng)接收到用戶的內(nèi)存請求時,獲取用戶的內(nèi)存請求中的內(nèi)存大小,向上取整,比如用戶申請50byte的內(nèi)存,由于內(nèi)存池中的內(nèi)存塊都是具有固定大小的,則需要向上取64byte的內(nèi)存塊給用戶使用。
[0065]在接收到用戶的內(nèi)存請求后,首先獲取步驟201添加的LRU鏈表頭部的預(yù)設(shè)個數(shù)的內(nèi)存塊,比如LRU鏈表頭部的10個內(nèi)存塊;預(yù)設(shè)個數(shù)可以根據(jù)實際情況靈活設(shè)置,本發(fā)明實施例對此不做限制。
[0066]203、在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給用戶使用,將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端。
[0067]具體地,獲取LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊后,在這些內(nèi)存塊中查找與用戶請求內(nèi)存大小向上取整后的內(nèi)存塊大小相等的空閑內(nèi)存塊,比如需要取64byte的內(nèi)存塊給用戶使用,則在LRU鏈表頭部10個內(nèi)存塊中查找是否有內(nèi)存大小為64byte的空閑內(nèi)存塊,如果有則將查找到的空閑內(nèi)存塊返回給用戶使用,并修改LRU鏈表,將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端。
[0068]進(jìn)一步地,如果在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于LRU鏈表頭部最前端的空閑內(nèi)存塊返回給用戶使用。
[0069]其中,如果在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給用戶使用,并將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端;比如,如果在LRU鏈表頭部10個內(nèi)存塊中沒有查找到64byte的空閑內(nèi)存塊,則從內(nèi)存池中查找64byte的空閑內(nèi)存塊,并將返回的64byte空閑內(nèi)存塊置于LRU鏈表頭部的最前端;
[0070]如果內(nèi)存池中沒有和取整后內(nèi)存大小相同的內(nèi)存塊,則從內(nèi)存池中取出內(nèi)存大小更大的空閑內(nèi)存塊進(jìn)行分割后給用戶使用;比如,如果內(nèi)存池中沒有64byte的空閑內(nèi)存塊,則從內(nèi)存池中查找128byte的空閑內(nèi)存塊,將128byte的空閑內(nèi)存塊分割成兩塊,取其中的一塊返回給用戶使用;并將返回的分割的空閑內(nèi)存塊置于LRU鏈表頭部的最前端;
[0071]如果內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給用戶使用,將申請的新內(nèi)存塊置于LRU鏈表頭部的最前端。
[0072]204、當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到內(nèi)存池中的空閑內(nèi)存塊不大于閾值。
[0073]具體地,內(nèi)存池中空閑內(nèi)存超過預(yù)設(shè)的閾值,比如2M時,此時需要向系統(tǒng)釋放空閑內(nèi)存塊以減少空閑;該閾值可以根據(jù)情況靈活設(shè)置,也可以是一個比值,比如設(shè)置內(nèi)存池中的空閑內(nèi)存超過總內(nèi)存的50%時,則需要向系統(tǒng)釋放空閑內(nèi)存塊;
[0074]本發(fā)明實施例在向系統(tǒng)釋放空閑內(nèi)存時,首先獲取LRU鏈表,從LRU鏈表的尾部開始釋放內(nèi)存塊,由于LRU鏈表尾部是最久沒有使用過的內(nèi)存塊,因此淘汰掉這些內(nèi)存塊可以降低內(nèi)存池的發(fā)生抖動現(xiàn)象的概率。
[0075]本發(fā)明實施例提供的方法,通過接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊,將在這些內(nèi)存塊中查找到的空閑內(nèi)存塊返回給用戶使用;當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,解決了目前用戶在內(nèi)存池中請求內(nèi)存時每次需要在TLB中建立地址映射以及向系統(tǒng)釋放內(nèi)存時從較大的內(nèi)存塊開始淘汰而不管這些內(nèi)存塊是否經(jīng)常被使用的問題,提高了CPU的訪問速度和內(nèi)存分配效率,降低了內(nèi)存池發(fā)生抖動現(xiàn)象的概率。
[0076]實施例三
[0077]參見圖5,本發(fā)明實施例提供了一種內(nèi)存池的管理裝置,該裝置包括:
[0078]獲取模塊301,用于當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊;
[0079]查找模塊302,用于在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給用戶使用;
[0080]釋放模塊303,用于當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到內(nèi)存池中的空閑內(nèi)存塊不大于閾值。
[0081]具體地,參見圖6,該裝置包括:
[0082]添加模塊304,用于獲取模塊301接收到用戶的內(nèi)存請求之前,在內(nèi)存池中添加LRU鏈表,LRU鏈表中依照使用時間由后向前的順序記錄內(nèi)存池中所有內(nèi)存塊的使用時間。
[0083]具體地,參見圖7,該裝置包括:
[0084]修改模塊305,用于查找模塊302將查找到的空閑內(nèi)存塊返回給用戶使用之后,修改LRU鏈表,將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端。
[0085]具體地,參見圖8,該裝置還包括:
[0086]調(diào)取模塊306,用于如果查找模塊302在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給用戶使用,并將返回的空閑內(nèi)存塊置于LRU鏈表頭部的最前端;如果內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給用戶使用,將申請的新內(nèi)存塊置于LRU鏈表頭部的最前端。
[0087]具體地,該查找模塊302,用于如果在LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于LRU鏈表頭部最前端的空閑內(nèi)存塊返回給用戶使用。
[0088]本發(fā)明實施例提供的裝置,通過接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊,將在這些內(nèi)存塊中查找到的空閑內(nèi)存塊返回給用戶使用;當(dāng)內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,解決了目前用戶在內(nèi)存池中請求內(nèi)存時每次需要在TLB中建立地址映射以及向系統(tǒng)釋放內(nèi)存時從較大的內(nèi)存塊開始淘汰而不管這些內(nèi)存塊是否經(jīng)常被使用的問題,提高了CPU的訪問速度和內(nèi)存分配效率,降低了內(nèi)存池發(fā)生抖動現(xiàn)象的概率。
[0089]需要說明的是:上述實施例提供的內(nèi)存池的管理裝置在內(nèi)存塊進(jìn)行管理時,僅以上述各功能模塊的劃分進(jìn)行舉例說明,實際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實施例提供的內(nèi)存池的管理裝置與內(nèi)存池的管理方法實施例屬于同一構(gòu)思,其具體實現(xiàn)過程詳見方法實施例,這里不再贅述。
[0090]上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
[0091]本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,的程序可以存儲于一種計算機(jī)可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
[0092]以上僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種內(nèi)存池的管理方法,其特征在于,所述方法包括: 當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的最近最少使用LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊; 在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用; 當(dāng)所述內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從所述LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到所述內(nèi)存池中的空閑內(nèi)存塊不大于所述閾值。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述接收到用戶的內(nèi)存請求之前,包括: 在所述內(nèi)存池中添加LRU鏈表,所述LRU鏈表中依照使用時間由后向前的順序記錄所述內(nèi)存池中所有內(nèi)存塊的使用時間。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將查找到的空閑內(nèi)存塊返回給所述用戶使用之后,包括: 修改所述LRU鏈表,將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,還包括: 如果在所述LRU鏈表頭部 預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從所述內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給所述用戶使用,并將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端; 如果所述內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給所述用戶使用,將所述申請的新內(nèi)存塊置于所述LRU鏈表頭部的最前端。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用,包括: 如果在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于所述LRU鏈表頭部最前端的空閑內(nèi)存塊返回給所述用戶使用。
6.一種內(nèi)存池的管理裝置,其特征在于,所述裝置包括: 獲取模塊,用于當(dāng)接收到用戶的內(nèi)存請求時,獲取內(nèi)存池中預(yù)先添加的LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊; 查找模塊,用于在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊返回給所述用戶使用; 釋放模塊,用于當(dāng)所述內(nèi)存池中的空閑內(nèi)存超過預(yù)設(shè)的閾值時,從所述LRU鏈表尾部開始向系統(tǒng)釋放空閑內(nèi)存塊,直到所述內(nèi)存池中的空閑內(nèi)存塊不大于所述閾值。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置包括: 添加模塊,用于所述獲取模塊接收到用戶的內(nèi)存請求之前,在所述內(nèi)存池中添加LRU鏈表,所述LRU鏈表中依照使用時間由后向前的順序記錄所述內(nèi)存池中所有內(nèi)存塊的使用時間。
8.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置包括: 修改模塊,用于所述查找模塊將查找到的空閑內(nèi)存塊返回給所述用戶使用之后,修改所述LRU鏈表,將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端。
9.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述裝置還包括:調(diào)取模塊,用于如果所述查找模塊在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中沒有查找到空閑內(nèi)存塊,則從所述內(nèi)存池中調(diào)取空閑內(nèi)存塊返回給所述用戶使用,并將所述返回的空閑內(nèi)存塊置于所述LRU鏈表頭部的最前端;如果所述內(nèi)存池中沒有空閑內(nèi)存塊,則向系統(tǒng)申請新內(nèi)存塊返回給所述用戶使用,將所述申請的新內(nèi)存塊置于所述LRU鏈表頭部的最前端。
10.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述查找模塊,用于如果在所述LRU鏈表頭部預(yù)設(shè)個數(shù)的內(nèi)存塊中查找到多個空閑內(nèi)存塊,將查找到的空閑內(nèi)存塊中置于所述LRU鏈表頭部最前端的空閑內(nèi)存塊返回給 所述用戶使用。
【文檔編號】G06F12/06GK103810115SQ201210460482
【公開日】2014年5月21日 申請日期:2012年11月15日 優(yōu)先權(quán)日:2012年11月15日
【發(fā)明者】黃明生 申請人:深圳市騰訊計算機(jī)系統(tǒng)有限公司