堆块最小分配的单位 —— malloc_chunk !
1. chunk的结构体
1 | struct malloc_chunk { |
- 结构成员
- 通用结构成员
struct malloc_chunk
是每次分配堆块的基本单位prev_size
为上一个 空闲 相邻堆块(虚拟 内存中相邻,非 bin链中相邻,下同)的chunk大小- 如果上一个相邻堆块 不空闲 ,则该变量无用
- 那么,该变量的空间可以给上一个堆块使用,即 空间复用
size
为当前chunk的大小(该变量可 & 上各种标志位以记录数据,例如PREV_INUSE标志位)- 指针
fd
指向下一个chunk(当该chunk位于链尾时指向arena
) - 指针
bk
指向上一个chunk(当该chunk位于链头时指向arena
,fast chunks除外)
- 当这个chunk为 large chunk 时,才会使用以下结构成员
fd_nextsize
指向大于当前chunk大小、且位于相同large bin链的chunkbk_nextsize
指向小于当前chunk大小、且位于相同large bin链的chunk
- 通用结构成员
2. allocated chunk
-
为便于称呼,我们称,已被分配给用户的chunk为allocated chunk
-
当free chunk被分配时,返回给用户的指针为 该chunk首地址 + 2 x SIZE_SZ
即该chunk的成员fd指针的地址SIZE_SZ
为size_t
的大小
在32位程序中SIZE_SE
为4字节、64位程序中为8字节-
其代码为
1
2
3
4
5
6
/* The corresponding word size */
-
-
当chunk被分配时,指针fd、bk、fd_nextsize、bk_nextsize 无用,故该部分空间被分配给用户使用,用户所得到内存空间从指针fd的内存地址开始
2. free chunk
- free chunk, 指的是已经被操作系统释放的空闲chunk
- 不同于allocated chunk,此时该free chunk的指针fd、bk等有作用,不可被随意覆盖、
3. top chunk
- 地址最高、位于堆顶的的free chunk,称为top chunk
- 该 chunk 不属于 任何bin,只由arena直接管理
- 当所有free chunk都无法满足用户需求时,如果top chunk够大,则top chunk将会被切割为两部分,第一部分分配给用户,第二部分会成为新的top chunk
4. last remainder chunk
- 当用户请求的是一个small chunk,并且该请求无法被small bin和unsorted bin满足
- 此时查找最合适的chunk,并把该chunk切割,剩余部分放入unsorted bin里并成为新的last remainder