目录
1.各类bin介绍
chunk被释放时,glibc会将它们重新组织起来,构成不同的bin链表,当用户再次申请时,就从中寻找合适的chunk返回给用户。bin的种类一共有四种:
fastbinsY:这是一个bin数组,里面有NFASTBINS个fast bins。
bins:也是一个bin数组,一共有126个bin,分别是:
bin 1 为unsorted bin
bin 2 到bin 63 为small bin
bin 64 到 bin 126 为 large bin
(1)fast bin
glibc对这类bin使用单链表结构,采用后进先出的分配策略。
fast bin 里的chunk不会进行合并操作,所以下一个chunk不会进行合并操作,所以下一个chunk的PREV INUSE始终标记为1,使其处于使用状态。
同一个fast bin里chunk大小相同,并且在fastbinsY数组里按照从小到大的顺序排列,序号为0的fast bin中容纳的chunk大小为4*SIZE_SZ字节,随着序号增加,所容纳的chunk递增2*SIZE_SZ字节。(图例见书:P230)
(2)unsorted bin
一定大小的chunk被释放时,在进入small bin 或者large bin之前,会先加入unsorted bin。
unsorted bin 使用双链表结构,并采用先进先出的分配策略。
unsorted bin 中的chunk大小可能是不同的,并且由于是双链表结构,一个bin会占用bins的两个元素。(图例见书:P230)
(3)small bin
同一个small bin 里chunk的大小相同,采用双链表结构,small bin 在bins 里居第2到第63位,共62个。根据排序每个small bin的大小为2*SIZE_SZ*idx(idx表示bins数组的下标)。64位下,最小为2*8*2-=32字节,最大为2*8*63=1008字节。由于small bin 和fast bin 有重合的部分,所以这些chunk在某些情况下会被加入small bin 中。(图例见书:P230)
(4)large bin
large bin 在bins 里居第64位到第126位,共63个,被分成了6组,每组bin所能容纳的chunk按顺序排成等差数列,公差是:
32 bins of size | 64 |
16 bins of size | 512 |
8 bins of size | 4096 |
4 bins of size | 32768 |
2 bins of size | 262144 |
1 bins of size | what's left |
large bin 也是采用双链表结构,里面的chunk从头结点的fd指针开始,按大小顺序进行排列。为了加快检索速度,fd_nextsize和bk_nextsize用于指向第一个与自己大小不同的chunk,所以也只有在加入了大小不同的chunk时,这两个指针才会被修改。
刚开始学堆,不清楚应该怎么学,先学基础知识来着,对于在书上看到的,觉得重要的做笔记记录一下。