堆學習筆記——bin

前言:讓我們繼續(xù)學習新的概念——bin谒兄,學習資料來自莊明強老師的《Glibc 內存管理》衣赶,博客的大部分內容來自這本書伍茄。

0X00 bin 的介紹

簡單來說:bin 就是空閑 chunk 的容器

用戶 free 掉的內存并不是都會馬上歸還給系統(tǒng)淹朋,ptmalloc 會統(tǒng)一管理 heap 和 mmap 映射區(qū)中空閑的 chunk偏塞,當用戶進行下一次分配請求時唱蒸,ptmalloc 會在空閑的 chunk 中選擇一個合適的分配給他,這樣就避免了頻繁地系統(tǒng)調用

ptmalloc 把大小相似的 chunk灸叼,用雙向鏈表連接起來神汹,這樣就形成了一個 bin。ptmalloc 一共維護了 128 個這樣的 bin古今,并使用數(shù)組來存儲這些 bin 如下:

0X01 ptmalloc bin 分類

再回到這張圖慎冤,數(shù)組中的第一個 bin 是 unsorted bin,數(shù)組中從第 2 個到第 64 個 bin 是 small bin沧卢,它的 chunk size 依次遞增 8bytes蚁堤,每個 small bin 中的 chunk 大小相同。small bin 是一個雙向鏈表但狭。雙向鏈表不是循環(huán)鏈表披诗,它是有順序的。在相同大小 chunk 的 bin 中 的排序是按照「最近使用」的順序立磁,也就是說呈队,排在后面的最容易被選中,剛被釋放的放在前面唱歧。

small bin 后面是 large bin

largin bin 中 chunk 的大小不是固定的宪摧,而是有一個范圍。其中的順序是按大小排序的颅崩,越大的放在越下面几于,如果大小相同,按照「最近使用」的順序

當空閑的 chunk 被連接到 bin 的時候沿后,ptmalloc 會把表示該 chunk 是否正在使用的標志 p 設置為 0沿彭。(注意!這個標志實際處在下一個 chunk 中)尖滚。同時喉刘,ptmalloc 還會檢查它前后(物理前后)的 chunk 是否為空,如果為空漆弄,ptmalloc 會把這些 chunk 合并成一個大的 chunk睦裳,然后把合并后的 chunk 放入 unsorted bin 中。但是對于較小的 chunk撼唾,ptmalloc 會把它放入 fast bins 中廉邑。

  • Fast Bins

用戶很有可能請求小的內存,而且釋放之后也很可能再次請求小內存。所以合并釋放小內存鬓催,并不明智肺素。在 fast bins 中恨锚,不大于 max_fast (默認值為 64B)的 chunk 被釋放后宇驾,首先會被放到 fast bins 中,fast bins 中的 chunk 并不改變它的使用標志 P猴伶。這樣也就無法將它們合并课舍,當需要給用戶分配的 chunk 小于或等于 max_fast 時,ptmalloc 首先會在 fast bins 中查找相應的空閑塊他挎,如果找不到筝尾,才會去 bins(那個數(shù)組)中查找數(shù)據(jù)塊。

在某個特定的時刻办桨,ptmalloc 會遍歷整個 fast bins 將相鄰的空閑 chunk 進行合并筹淫,并將合并后的 chunk 加入 unsorted bin 中,再加入到其他的 bin 中呢撞。

  • unsorted bin

如果被用戶釋放的 chunk 或在 fast bins 中合并的 chunk 大于 max_fast损姜,則 ptmalloc 會把這些 chunk 放入 unsorted bin 中。在查找合適的 chunk 的時候殊霞,首先在 unsorted bin 中查找合適的空閑 chunk摧阅,然后才查找 bins。

如果 unsorted bin 中沒有合適的 chunk绷蹲,則會把 unsorted bin 中的 chunk 加入到 bins 的其他 bin 中棒卷,再進行查找

0X02 特殊的 Chunk

并不是所有的 chunk 都按照上面的方式來組織,實際上祝钢,有三種例外的情況:

Top chunk比规,mmaped chunk 和 last remainder

Top chunk

top chunk 對于主分配區(qū)和非主分配區(qū)是不一樣的

1)對于非主分配區(qū)來說

ptmalloc 會預先從 mmap 區(qū)域劃分一個出一個 sub_heap,用來相應用戶的申請內存的請求拦英。由于內存是從低向高分配的苞俘,在空閑內存的最高處,必然存在著空閑的 chunk龄章,這個就是 top chunk吃谣。在 fast bin 和 bins 都不能滿足用戶的申請請求時,ptmalloc 就會嘗試在 top chunk 中分出一塊內存給用戶做裙。

如果當前的 top chunk 也不夠大岗憋,分配程序會重新分配一個 sub ,并把當前的 top chunk 遷移到新的 sub heap 上锚贱。新的 sub heap 與舊的 sub heap 用單鏈表連接在一起仔戈,然后在新的 sub heap 上分配內存。top chunk 在分配的時候總是在 fast bin 和 bins 之后才被考慮,所以不論 top chunk 有多大监徘,他都不會被放進 fast bin 或者 bin 中

top chunk 會隨著內存的分配變換大小晋修,如果有被釋放的 chunk 與 top chunk 相鄰,增大 top chunk 的大小凰盔。如果回收的內存大于某一個閾值墓卦,并且 Top chunk 也超過了某個收縮閾值,ptmalloc 會收縮 sub heap户敬。

如果 top chunk 包含了整個 sub heap落剪,那么 ptmalloc 會調用 mumap 把整個 sub heap 回收

2)對于主分配區(qū)來說

由于「主分配區(qū)」是唯一能訪進程 heap 區(qū)域的分配區(qū)。他可以通過 brk() sbrk() 增大收縮 heap 的大小尿庐。ptmalloc 在開始的時候忠怖,會預先分配一塊較大的內存,這就是 heap

mmaped chunk

當申請一塊較大的 chunk抄瑟。并且 fast bin 和 bins 都不能滿足分配凡泣,top chunk 也不能滿足的時候,ptmalloc 會使用 mmap 直接分配頁(4 KB)皮假,這樣的 chunk 在被 free 的時候時直接解除映射鞋拟,直接還給操作系統(tǒng)。再次訪問這塊內存钞翔,會報 segment fault 的錯誤严卖。這樣的 chunk 也不會包含在任何 bin 中。

Last remainder

當需要一個小的 chunk 的時候布轿,small chunk 中沒有哮笆,如果 Last remainder chunk 的大小大于所分配的 chunk,那么就會從 Last remainder chunk 中分出去一個 chunk汰扭,剩下的部分還會作為 Last remainder稠肘。和上述的 chunk 一樣, Last remainder 也不屬于任何一個 bin萝毛。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末项阴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笆包,更是在濱河造成了極大的恐慌环揽,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庵佣,死亡現(xiàn)場離奇詭異歉胶,居然都是意外死亡,警方通過查閱死者的電腦和手機巴粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門通今,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粥谬,“玉大人,你說我怎么就攤上這事辫塌÷┎撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵臼氨,是天一觀的道長掺喻。 經常有香客問我,道長一也,這世上最難降的妖魔是什么巢寡? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任喉脖,我火速辦了婚禮椰苟,結果婚禮上,老公的妹妹穿的比我還像新娘树叽。我一直安慰自己舆蝴,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布题诵。 她就那樣靜靜地躺著洁仗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪性锭。 梳的紋絲不亂的頭發(fā)上赠潦,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音草冈,去河邊找鬼她奥。 笑死,一個胖子當著我的面吹牛怎棱,可吹牛的內容都是我干的哩俭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼拳恋,長吁一口氣:“原來是場噩夢啊……” “哼凡资!你這毒婦竟也來了?” 一聲冷哼從身側響起谬运,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤隙赁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梆暖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伞访,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年式廷,在試婚紗的時候發(fā)現(xiàn)自己被綠了咐扭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝗肪,靈堂內的尸體忽然破棺而出袜爪,到底是詐尸還是另有隱情,我是刑警寧澤薛闪,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布辛馆,位于F島的核電站,受9級特大地震影響豁延,放射性物質發(fā)生泄漏昙篙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一诱咏、第九天 我趴在偏房一處隱蔽的房頂上張望苔可。 院中可真熱鬧,春花似錦袋狞、人聲如沸焚辅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同蜻。三九已至,卻和暖如春早处,著一層夾襖步出監(jiān)牢的瞬間湾蔓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工砌梆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留默责,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓么库,卻偏偏與公主長得像傻丝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诉儒,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容

  • linux內存尋址 3種地址:虛擬地址葡缰、物理地址、邏輯地址物理地址:內存的電路地址忱反,對應內存地址線上的高低電平泛释,物...
    grimlock44閱讀 1,120評論 0 1
  • 概述 用戶釋放掉的 chunk 不會馬上歸還給系統(tǒng),ptmalloc 會統(tǒng)一管理 heap 和 mmap 映射區(qū)域...
    HAPPYers閱讀 2,433評論 0 3
  • 最近開始入坑linux下的堆漏洞成因與利用方式温算,首先從認識堆開始怜校,一步步為自己的學習做一些總結。 0x00 什么是...
    星辰照耀你我閱讀 1,117評論 0 4
  • 重慶是座遠近聞名的山城注竿。城市依山而構茄茁,臨江而筑魂贬,樓房、道路等坐落有致裙顽,“層層出去都是街”是對它最好最貼切的形容了付燥。...
    涵冰1985閱讀 406評論 0 0
  • 那一天,溫度發(fā)了燒愈犹,從上午七點三十分的9度键科,躥升到中午的17度。熱乎乎的太陽光漩怎,如金粉一般左一層右一層地刷在天空上...
    蕭牧梵閱讀 125評論 0 0