堆基础知识小结

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:27   2574   0
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过程

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP