各类bin介绍
bin(類似有分類的回收站)
由free chunk組成的鏈表,當用戶再次申請時從中尋找合適的chunk返回給用戶。按范圍不同的chunk組成不同的bin如fast bin、small bin、large bin對應這些鏈表里面的chunk叫做fast chunk、samll chunk、large chunk。
bins:是bin的一個數組,共有126個bin、沒有bin0
bin1:unsorted bin
bin2 ~bin63 : small bin(62個)
bin64~bin126 :large bin(63個)
各類bin
-
fast bins
用的比較多,一般情況下申請和釋放的堆塊都比較小,所以glibc對這類bin使用單鏈表結構,和stack一樣也是先進后出的分配策略,fast 也就是快的意思。它里面的chunk不會進行合并操作和釋放,下一個chunk的PRV_INUSE也就是p標志位恒為1,表示malloced狀態,在fastbinsY數組中按小->大的順序排序,序號為0的fast bin容納4 * SIZE_SZ字節,之后隨著逐個遞增 2 * SIZE_SZ , 沒有專屬處理時不會被top chunk合并
-
unsorted bin
實際中一個釋放的chunk很快就會被重用,所以先加入到unsorted bin可加快分配速度(類似緩存原理),不同的是它是雙鏈表結構(先進先出),是free chunk后會先加入到unsorted bin然后確認沒有需求再回歸對應bin區
-
small bin
和unsorted bin一樣是雙鏈表結構,每個small bin的大小為2 * SIZE_SZ * idx(bins數組下標),因為它是bin2~bin63所有它在64bit中最小small chunk 為2 * 8 * 2 = 32byte,最大為1008byte
-
large bin
也是雙鏈表結構,它在bins處于bin64~bin126,那么64bit中最小large bin為 2 * 8 * 64 = 1024byte,哎,這個時候前面說的fd、bk、fd_nextsize、bk_nextsize就來到用武之地了,為了加快檢索速度,fd_nextsize和bk_nextsize指針會指向一個大小與自己不一樣的chunk,故在加入了大小不同的chunk時,這兩個指針才會被修改
總結
- 上一篇: linux firefox 配置文件,对
- 下一篇: Sun携手希赛教育 共推国内Java认证