Linux內(nèi)核研究之伙伴算法

Linux的物理地址一直深受碎片化的困擾椒丧。

1壹甥、什么是碎片化?

用戶頻繁地請求和釋放不同大小的一組連續(xù)頁框壶熏,必然導(dǎo)致在已分配頁框的塊內(nèi)分散了許多小塊的空閑頁面句柠。
這些小塊的空間分散開來,無法分配一個(gè)大塊的連續(xù)頁框棒假,這就是物理地址的碎片化溯职。

由此帶來的問題是,即使有足夠的空閑頁框可以滿足請求帽哑,但要分配一個(gè)大塊的連續(xù)頁框可能無法滿足請求谜酒。

2、伙伴算法的相關(guān)概念

伙伴算法(Buddy system)把所有的空閑頁框分為11個(gè)塊鏈表祝拯,每塊鏈表中分布包含特定的連續(xù)頁框地址空間甚带,第0個(gè)塊鏈表包含大小為2 ^ 0個(gè)連續(xù)的頁框她肯,第1個(gè)塊鏈表中,每個(gè)鏈表元素包含2 ^ 1個(gè)頁框大小的連續(xù)地址空間鹰贵,….晴氨,第10個(gè)塊鏈表中,每個(gè)鏈表元素包含2 ^ 10個(gè)頁框大小的連續(xù)地址空間碉输。每個(gè)鏈表中元素的個(gè)數(shù)在系統(tǒng)初始化時(shí)決定籽前,在執(zhí)行過程中,動(dòng)態(tài)變化敷钾。

伙伴算法每次只能分配2的冪次頁的空間枝哄,比如一次分配1頁,2頁阻荒,4頁挠锥,8頁,…侨赡,1024頁(2^10)等等蓖租,每頁(pageSize)大小一般為4K,因此羊壹,伙伴算法最多一次能夠分配4M的內(nèi)存空間蓖宦。

兩個(gè)內(nèi)存塊,大小相同油猫,地址連續(xù)稠茂,同屬于一個(gè)大塊區(qū)域。(第0塊和第1塊是伙伴情妖,第2塊和第3塊是伙伴睬关,但第1塊和第2塊不是伙伴)

伙伴位圖:用一位描述伙伴塊的狀態(tài)位碼,稱之為伙伴位碼毡证。比如共螺,bit0為第0塊和第1塊的伙伴位碼,如果bit0為1情竹,表示這兩塊至少有一塊已經(jīng)分配出去藐不,如果bit0為0,說明兩塊都空閑秦效,還沒分配雏蛮。

Linux為每個(gè)管理區(qū)使用不同的伙伴系統(tǒng),內(nèi)核空間分為三種區(qū)阱州,DMA挑秉,NORMAL,HIGHMEM苔货,對(duì)于每一種區(qū)犀概,都有對(duì)應(yīng)的伙伴算法立哑。

3、申請和回收內(nèi)存的過程

比如姻灶,我要分配4(2^2)頁(16k)的內(nèi)存空間铛绰,算法會(huì)先從free_area[2]中查看nr_free是否為空,如果有空閑塊产喉,則從中分配捂掰,如果沒有空閑塊,就從它的上一級(jí)free_area[3](每塊32K)中分配出16K曾沈,并將多余的內(nèi)存(16K)加入到free_area[2]中去这嚣。如果free_area[3]也沒有空閑,則從更上一級(jí)申請空間塞俱,依次遞推姐帚,直到free_area[max_order],如果頂級(jí)都沒有空間障涯,那么就報(bào)告分配失敗卧土。

釋放是申請的逆過程,當(dāng)釋放一個(gè)內(nèi)存塊時(shí)像樊,先在其對(duì)于的free_area鏈表中查找是否有伙伴存在,如果沒有伙伴塊旅敷,直接將釋放的塊插入鏈表頭生棍。如果有或板塊的存在,則將其從鏈表摘下媳谁,合并成一個(gè)大塊涂滴,然后繼續(xù)查找合并后的塊在更大一級(jí)鏈表中是否有伙伴的存在,直至不能合并或者已經(jīng)合并至最大塊2^10為止晴音。

4柔纵、伙伴算法的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

較好的解決外部碎片問題

當(dāng)需要分配若干個(gè)內(nèi)存頁面時(shí),用于DMA的內(nèi)存頁面必須連續(xù)锤躁,伙伴算法很好的滿足了這個(gè)要求

只要請求的塊不超過512個(gè)頁面(2K)搁料,內(nèi)核就盡量分配連續(xù)的頁面。

針對(duì)大內(nèi)存分配設(shè)計(jì)系羞。

缺點(diǎn):

  1. 合并的要求太過嚴(yán)格郭计,只能是滿足伙伴關(guān)系的塊才能合并,比如第1塊和第2塊就不能合并椒振。

  2. 碎片問題:一個(gè)連續(xù)的內(nèi)存中僅僅一個(gè)頁面被占用昭伸,導(dǎo)致整塊內(nèi)存區(qū)都不具備合并的條件

  3. 浪費(fèi)問題:伙伴算法只能分配2的冪次方內(nèi)存區(qū),當(dāng)需要8K(2頁)時(shí)澎迎,好說庐杨,當(dāng)需要9K時(shí)选调,那就需要分配16K(4頁)的內(nèi)存空間,但是實(shí)際只用到9K空間灵份,多余的7K空間就被浪費(fèi)掉仁堪。

  4. 算法的效率問題: 伙伴算法涉及了比較多的計(jì)算還有鏈表和位圖的操作,開銷還是比較大的各吨,如果每次2 ^ n大小的伙伴塊就會(huì)合并到2 ^ (n+1)的鏈表隊(duì)列中枝笨,那么2 ^ n大小鏈表中的塊就會(huì)因?yàn)楹喜⒉僮鞫鴾p少,但系統(tǒng)隨后立即有可能又有對(duì)該大小塊的需求揭蜒,為此必須再從2 ^ (n+1)大小的鏈表中拆分横浑,這樣的合并又立即拆分的過程是無效率的。

Linux針對(duì)大內(nèi)存的物理地址分配屉更,采用伙伴算法徙融,如果是針對(duì)小于一個(gè)page的內(nèi)存,頻繁的分配和釋放瑰谜,有更加適宜的解決方案欺冀,如slab和kmem_cache等,這不在本文的討論范圍內(nèi)萨脑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隐轩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渤早,更是在濱河造成了極大的恐慌职车,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹊杖,死亡現(xiàn)場離奇詭異悴灵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骂蓖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門积瞒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人登下,你說我怎么就攤上這事茫孔。” “怎么了被芳?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵银酬,是天一觀的道長。 經(jīng)常有香客問我筐钟,道長揩瞪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任篓冲,我火速辦了婚禮李破,結(jié)果婚禮上宠哄,老公的妹妹穿的比我還像新娘。我一直安慰自己嗤攻,他們只是感情好毛嫉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妇菱,像睡著了一般承粤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闯团,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天辛臊,我揣著相機(jī)與錄音,去河邊找鬼房交。 笑死彻舰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的候味。 我是一名探鬼主播刃唤,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼白群!你這毒婦竟也來了尚胞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤帜慢,失蹤者是張志新(化名)和其女友劉穎笼裳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崖堤,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年耐床,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了密幔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撩轰,死狀恐怖胯甩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堪嫂,我是刑警寧澤偎箫,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皆串,受9級(jí)特大地震影響淹办,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恶复,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一怜森、第九天 我趴在偏房一處隱蔽的房頂上張望速挑。 院中可真熱鬧,春花似錦副硅、人聲如沸姥宝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腊满。三九已至,卻和暖如春培己,著一層夾襖步出監(jiān)牢的瞬間碳蛋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工漱凝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疮蹦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓茸炒,卻偏偏與公主長得像愕乎,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壁公,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 進(jìn)程 創(chuàng)建 創(chuàng)建進(jìn)程用fork()函數(shù)感论。fork()為子進(jìn)程創(chuàng)建新的地址空間并且拷貝頁表。子進(jìn)程的虛擬地址空間...
    梅花怒閱讀 1,908評(píng)論 0 7
  • 搬運(yùn)自盼刹幔客網(wǎng)大神總結(jié) extern關(guān)鍵字 extern修飾變量是個(gè)聲明比肄,此變量/函數(shù)是在別處定義的,要在此處引用 ...
    leon4ever閱讀 3,661評(píng)論 0 9
  • 這樣的少年囊陡,六十歲也年輕芳绩,光明坦蕩,笑容燦爛撞反,以身試法告訴你世界終究美好妥色,就算不好也還有他,至少值得冒個(gè)險(xiǎn)...
    蠢萌的hhhh閱讀 747評(píng)論 0 0
  • 露盡秋涼藕新結(jié)遏片, 蟬鳴啾啾霜已降嘹害。 殘荷羞見南飛雁, 問雪何時(shí)覆深巷吮便。
    文琦閱讀 629評(píng)論 0 2
  • 今天是五一假期后第一天上班 這一天還行不怎么忙但也沒閑著和組內(nèi)同事配合好 更好的服務(wù)客戶
    呵呵_206a閱讀 229評(píng)論 0 0