1、chunk 结构
未分配的chunk
|
prev_size |
|
size
|P=0|
|
fd
|
|
bk |
|
unused
|
pre_size: 上一个物理相邻(低地址)的chunk的大小
P: 上一个物理相邻(低地址)的是否被分配
fd:堆管理中下一个chunk的头部地址
bk:堆管理中上一个chunk的头部地址
已分配chunk
|
prev_size
|<----|
|
size
| P=1 |<----|header
|
|<----malloc返回的地址是这里,注意与未分配的chunk比较,此处应该是fd的起始位置
|
data |
|
|
---------------------------------------
相邻的chunk
|prev_size (上一个chunk的data)|
此处pre_size可被用作储存上一个的data
|
size
| P=1 |
由于上一个chunk被分配,这个chunk的P位为1
|
fd
|
|
bk
|
2、fastbin
单向链表
大小
x86:16~64 byte
x64:32~128 byte
不会合并
不会修改prev_inuse位,只要分配了后,一直为1
BK不使用
FILO:先进后出(从fastbin插入,从fastbin取出)
main_arena.fastbinY:
size16
size24
size32
......
|
a
|
|
b
|
|
|
|
|
|
|
-->a|
|size=16|P=1|
---->b|
|size=32|P=1|
|fd=0
|
|
------ | fd=c
|
|
|
|
|
|--->c|
|size=32|P=1|
|fd=0 |
|
smallbin
一共63个small bin
大小<512字节
16,24...
双向链表
FIFO:先进先出(从smallbin的fd插入,从small bin的bk指针取出)
unsorted bin
只有一个
当一个非fast chunk(即small bin或large bin)被free时会被放到unsorted bin中,可理解为small bin 和fastbin 的缓存。
2、malloc过程
a 第一次malloc,main_arena是空,需要向系统申请一块内存。
如果申请内存<128KB,使用BRK。
如果申请内存>=128KB,使用mmap。
b 堆已经初始化
在fastbin中寻找合适大小的chunk。
在smallbin中寻找合适大小(of exact size)的chunk。
loop:
1)last_reminder中的last_reminder足够大的话,从中分出,并把剩余部分标为last_reminder
2)在unsorted bin中寻找合适大小(of exact size)的chunk,并整理到small/large bin中
3)搜索small bin和large bin。
3、free过程
|
|