- bin(chunk容器)
ptmalloc將相似大小的 chunk 用雙向鏈表鏈接起來,這樣的一個鏈表被稱為一個 bin。 Ptmalloc 一共維護了 128 個 bin,并使用一個數組來存儲這些 bin,這個數組被成為bin數組。
bin數組結構如下:
在32位平臺下,bin[0] 和 bin[127] 是不存在的,因為最小的 chunk 為 16B, small bin 一共 62 個, large bin 一共 63 個,算上 bin[1] 加起來一共 128 個 bin。
其中 small bin 可以看成是公差為8的等差數列,其相鄰兩個 bin 的 chunk 的大小相差8B,如上圖所示。large bin 的每個 bin 中的 chunk 大小不是一個固定的等差數列,而是分成六組,每組 bin 是一個固定公差的等差數列,每組的 bin 數量依次為 32、 16、 8、 4、 2、 1,公差依次為 64B、 512B、4096B、32768B、 262144B 等。
正是基于 bin 數組的這種關系,當用戶給出一個需要申請的空間大小,ptmalloc 會很容易的確定改大小空間在哪個 bin 里。
fast bin:
- 不大于 max_fast(默認值為 64B)的 chunk 被釋放后,首先會被放到 fast bin 中, fast bin 中的 chunk 并不改變它的使用標志 P。 這樣也就無法將它們合并, 當需要給用戶分配的 chunk 小于或等于 max_fast 時, ptmalloc 首先會在 fast bin 中查找相應的空閑塊,然后才會去查找 bin 中的空閑 chunk。在某個特定的時候(在內存釋放合并 top chunk 時,如果合并后的 chunk 的大小大于 FASTBIN_CONSOLIDATION_THRESHOLD(默認64KB), 會觸發進行 fast bins 的合并操作),ptmalloc會遍歷 fast bin中的 chunk,18將相鄰的空閑 chunk 進行合并, 并將合并后的 chunk 加入 unsorted bin 中,然后再將 usorted bin 里的 chunk 加入 bins 中。