堆基础知识小结

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过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值