如何避免內(nèi)存碎片

頻繁地請(qǐng)求和釋放不同大小的內(nèi)存钧唐,必然導(dǎo)致內(nèi)存碎片問(wèn)題的產(chǎn)生征候,結(jié)果就是當(dāng)再次要求分配連續(xù)的內(nèi)存時(shí),即使整體內(nèi)存是足夠的趟妥,也無(wú)法滿足連續(xù)內(nèi)存的需求猫态。該問(wèn)題也稱之為外碎片(external fragmentation)。

解決方案:

避免外碎片的方法有兩種:

1披摄、利用分頁(yè)單元把一組非連續(xù)的空閑頁(yè)框映射到連續(xù)的線性地址

2亲雪、開發(fā)一種適當(dāng)?shù)募夹g(shù)來(lái)記錄現(xiàn)存的空閑的連續(xù)頁(yè)框塊的情況,以盡量避免為滿足對(duì)小塊的請(qǐng)求而分割大的空閑快

第一種方案的意思是行疏,我們使用地址轉(zhuǎn)換技術(shù)匆光,把非連續(xù)的物理地址轉(zhuǎn)換成連續(xù)的線性地址套像。

第二種方案的意思是酿联,開發(fā)一種特有的分配技術(shù)來(lái)記錄下來(lái)空閑內(nèi)存的情況,從而解決內(nèi)存碎片問(wèn)題。

Linux采用了第二種方案贞让,因?yàn)樵谀承┣闆r下周崭,系統(tǒng)的確需要連續(xù)的物理地址(DMA處理器可以直接訪問(wèn)總線)。

Linux采用著名的伙伴系統(tǒng)(buddy system)算法來(lái)解決外碎片問(wèn)題喳张。把所有的空閑頁(yè)框分組為11個(gè)塊鏈表续镇,每個(gè)鏈表分別包含大小為1,2,4,8,16,32,64,128,256,512,1024個(gè)連續(xù)的頁(yè)框,對(duì)1024個(gè)頁(yè)框的最大請(qǐng)求對(duì)應(yīng)著4MB大小的連續(xù)RAM(每頁(yè)大小為4KB)销部,每個(gè)塊的第一個(gè)頁(yè)框的物理地址是該塊大小的整數(shù)倍摸航,例如,大小為16個(gè)頁(yè)框的塊舅桩,其起始地址是16*2^12的倍數(shù)酱虎。

我們通過(guò)一個(gè)例子來(lái)說(shuō)明伙伴算法的工作原理,假設(shè)現(xiàn)在要請(qǐng)求一個(gè)256個(gè)頁(yè)框的塊(1MB)擂涛,算法步驟如下:

? 在256個(gè)頁(yè)框的鏈表中檢查是否有一個(gè)空閑快读串,如果沒(méi)有,查找下一個(gè)更大的塊撒妈,如果有恢暖,請(qǐng)求滿足。

? 在512個(gè)頁(yè)框的鏈表中檢查是否有一個(gè)空閑塊狰右,如果有杰捂,把512個(gè)頁(yè)框的空閑塊分為兩份,第一份用于滿足請(qǐng)求棋蚌,第二份鏈接到256個(gè)頁(yè)框的鏈表中琼娘。如果沒(méi)有空閑塊,繼續(xù)尋找下一個(gè)更大的塊附鸽。

以上過(guò)程的逆過(guò)程脱拼,就是頁(yè)框塊的釋放過(guò)程,也是該算法名字的由來(lái)坷备,內(nèi)核試圖把大小為B的一對(duì)空閑伙伴塊合并為一個(gè)2B的單獨(dú)塊熄浓,滿足以下條件的兩個(gè)塊稱之為伙伴:

? 兩個(gè)塊具有相同的大小

? 他們的物理地址是連續(xù)的

第一塊的第一個(gè)頁(yè)框的物理地址是2 * B * 2^12

該算法是遞歸的,如果它成功合并了B省撑,就會(huì)試圖去合并2B赌蔑,以再次試圖形成更大的塊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竟秫,一起剝皮案震驚了整個(gè)濱河市娃惯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肥败,老刑警劉巖趾浅,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愕提,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡皿哨,警方通過(guò)查閱死者的電腦和手機(jī)浅侨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)证膨,“玉大人如输,你說(shuō)我怎么就攤上這事⊙肜眨” “怎么了不见?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)崔步。 經(jīng)常有香客問(wèn)我脖祈,道長(zhǎng),這世上最難降的妖魔是什么刷晋? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任盖高,我火速辦了婚禮,結(jié)果婚禮上眼虱,老公的妹妹穿的比我還像新娘喻奥。我一直安慰自己,他們只是感情好捏悬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布撞蚕。 她就那樣靜靜地躺著,像睡著了一般过牙。 火紅的嫁衣襯著肌膚如雪甥厦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天寇钉,我揣著相機(jī)與錄音刀疙,去河邊找鬼。 笑死扫倡,一個(gè)胖子當(dāng)著我的面吹牛谦秧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撵溃,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼疚鲤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缘挑?” 一聲冷哼從身側(cè)響起集歇,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎语淘,沒(méi)想到半個(gè)月后诲宇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體际歼,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年焕窝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片维贺。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡它掂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溯泣,到底是詐尸還是另有隱情虐秋,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布垃沦,位于F島的核電站客给,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肢簿。R本人自食惡果不足惜靶剑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望池充。 院中可真熱鬧桩引,春花似錦、人聲如沸收夸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卧惜。三九已至厘灼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咽瓷,已是汗流浹背设凹。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茅姜,地道東北人围来。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匈睁,于是被迫代替她去往敵國(guó)和親监透。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 頻繁地請(qǐng)求和釋放不同大小的內(nèi)存航唆,必然導(dǎo)致內(nèi)存碎片問(wèn)題的產(chǎn)生胀蛮,結(jié)果就是當(dāng)再次要求分配連續(xù)的內(nèi)存時(shí),即使整體內(nèi)存是足夠...
    迷死她張閱讀 935評(píng)論 0 0
  • 第八章 內(nèi)存管理 本章通過(guò)三部分內(nèi)容描述內(nèi)核給自己動(dòng)態(tài)分配內(nèi)存: ...
    rlkbk閱讀 440評(píng)論 0 1
  • 內(nèi)存管理的基本思想 每個(gè)進(jìn)程都擁有自己的地址空間( Address space),包括這個(gè)進(jìn)程可以使用的全部地址和...
    夏威夷的芒果閱讀 1,895評(píng)論 0 1
  • 1 內(nèi)存尋址 1.1 物理地址糯钙、虛擬地址以及線性地址 物理地址: 物理內(nèi)存的內(nèi)存單元地址 虛擬地址: 程序員看到的...
    瘋狂小王子閱讀 2,818評(píng)論 3 21
  • Linux 內(nèi)存管理 1 頁(yè)的概念 linux 內(nèi)核中把物理頁(yè)作為內(nèi)存分配的最小單位粪狼,32位CPU 頁(yè)的大小通常為...
    赤兔歡閱讀 3,280評(píng)論 0 5