2021-04-01 內(nèi)存池的實現(xiàn)方法

這篇文章主要介紹一下內(nèi)存池的實現(xiàn)方式,這里介紹的是一種比較經(jīng)典的內(nèi)存池實現(xiàn)方式妆兑,就是鏈表法實現(xiàn)贮预,具體原理如下:

1,首先內(nèi)存池?zé)o非是提前申請一大塊內(nèi)存片段排嫌,之后把這個片段上的指針分配給用戶畸裳,對于分配來說只要記住已經(jīng)分配的偏移量即可,每次分配將指針后移申請的內(nèi)存塊長度即可淳地。

2怖糊,主要問題在于釋放內(nèi)存,由于不確定用戶申請和釋放內(nèi)存的順序,必須假定申請和釋放都在交疊進行,
對于內(nèi)存池來說狈癞,釋放的空間必須要可以復(fù)用,否則內(nèi)存池失去了意義嚷缭;
但是先申請的內(nèi)存區(qū)域可能先釋放,這樣將出現(xiàn)釋放的區(qū)域位于已分配區(qū)域中間的情形;如何索引這些釋放的內(nèi)存片段是內(nèi)存池要主要解決的問題阅爽;

見下圖:


未命名文件.jpg

圖中X區(qū)域先申請路幸,當(dāng)申請了Y區(qū)域之后,釋放了X區(qū)域付翁,此時如和能夠復(fù)用X區(qū)域的內(nèi)存简肴,而不是只能使用Y區(qū)域之后的內(nèi)存時要解決的問題;

內(nèi)存池的鏈表法實現(xiàn)見第二幅圖百侧,每個申請的區(qū)域前有一個固定長度的頭部砰识,其中記錄了一些信息,最重要的是兩個指針佣渴,一個指向后面的內(nèi)存塊頭部辫狼,另一個指向前面的內(nèi)存塊頭部,并且末尾的內(nèi)存塊和首部鏈接起來辛润,構(gòu)成一個雙向環(huán)形鏈表結(jié)構(gòu)膨处;
同時還有個標(biāo)記位標(biāo)志這塊內(nèi)存有沒被使用;

當(dāng)申請內(nèi)存時砂竖,從鏈表首部開始遍歷找到第一個沒有使用的內(nèi)存塊真椿,判斷其大小是否滿足,如不滿足乎澄,繼續(xù)搜索突硝;直到滿足條件,此時分2種情形:
1置济,可用內(nèi)存塊大小和要申請的大小一樣解恰,則直接標(biāo)記為已使用,并返回即可
2舟肉,可用內(nèi)存塊大于要申請的內(nèi)存塊,則把可用內(nèi)存區(qū)間分裂為2部分查库,前一部分標(biāo)記為已使用路媚,后一部分標(biāo)記為未使用,并繼續(xù)保持它們的鏈表結(jié)構(gòu)樊销;

對于釋放內(nèi)存整慎,需要判斷是否前面和后面相鄰的內(nèi)存塊有未使用,如果有围苫,則需要合并裤园,這一步至關(guān)重要,因為如果存在大量相鄰的標(biāo)記未使用內(nèi)存可能會導(dǎo)致無法分配一塊較大區(qū)域剂府,

以上操作始終保持鏈表結(jié)構(gòu)拧揽,就可以實現(xiàn)一個基礎(chǔ)內(nèi)存池了;
實際上,這個實現(xiàn)思路來自于John Carmack在Quake3中的實現(xiàn)

但是我們可以稍微做一點優(yōu)化(不過要犧牲一些額外的存儲空間)優(yōu)化方法是淤袜,額外記錄兩個指針痒谴,以環(huán)形形式連接所有未使用的內(nèi)存空間,這樣铡羡,查找的效率提高了积蔚,幾乎提升到了常數(shù)時間,
同時這個內(nèi)存池還有一個缺陷就是長度固定烦周,不過順著這個思路尽爆,我們可以在內(nèi)存不夠時,新分配一塊大的區(qū)域读慎,并且保持原來的鏈表結(jié)構(gòu)即可漱贱,

下面附上代碼實現(xiàn),見
https://github.com/wiltchamberian/MemoryPool
這里實現(xiàn)了兩個贪壳,第一個是參考Quake3 Carmack的實現(xiàn)饱亿,應(yīng)該無問題;
第二個SuperMemoryPool是改良后的實現(xiàn)闰靴,改良版實現(xiàn)的速度要提高了一些彪笼,支持動態(tài)內(nèi)存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚂且,隨后出現(xiàn)的幾起案子配猫,更是在濱河造成了極大的恐慌,老刑警劉巖杏死,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵肄,死亡現(xiàn)場離奇詭異,居然都是意外死亡淑翼,警方通過查閱死者的電腦和手機腐巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玄括,“玉大人冯丙,你說我怎么就攤上這事≡饩” “怎么了胃惜?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哪雕。 經(jīng)常有香客問我船殉,道長,這世上最難降的妖魔是什么斯嚎? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任利虫,我火速辦了婚禮挨厚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘列吼。我一直安慰自己幽崩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布寞钥。 她就那樣靜靜地躺著慌申,像睡著了一般。 火紅的嫁衣襯著肌膚如雪理郑。 梳的紋絲不亂的頭發(fā)上蹄溉,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音您炉,去河邊找鬼柒爵。 笑死,一個胖子當(dāng)著我的面吹牛赚爵,可吹牛的內(nèi)容都是我干的棉胀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼冀膝,長吁一口氣:“原來是場噩夢啊……” “哼唁奢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窝剖,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤麻掸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赐纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脊奋,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年疙描,在試婚紗的時候發(fā)現(xiàn)自己被綠了诚隙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡起胰,死狀恐怖久又,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情待错,我是刑警寧澤籽孙,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布烈评,位于F島的核電站火俄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讲冠。R本人自食惡果不足惜瓜客,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谱仪,春花似錦玻熙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敬尺,卻和暖如春枚尼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂吞。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工署恍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜻直。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓盯质,卻偏偏與公主長得像,于是被迫代替她去往敵國和親概而。 傳聞我的和親對象是個殘疾皇子呼巷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容