heap布局
- 使用中和free区域混杂在一起
- 各个block被称为chunk
- 想要再次使用free状态的区域
- 需要知道哪里有free的区域,因此它是链表结构
- 实际上没这么简单
malloc获得的是这个地址
size按照8的倍数进行padding
为简单起见,图中省略了fd_nextsize和bk_nextsize
实际上的结构体:
1 | struct malloc_chunk { |
来源:https://code.woboq.org/userspace/glibc/malloc/malloc.c.html#malloc_chunk
填充
仅在前一个chunk已经free时才能访问
末尾3个字节有特定的用途
- 最低一位(PREV_INUSE) 前一个chunk是否已被使用
- 低二位(IS_MMAPED) 是否是mmap获取的地址(大的内存通过mmap获取)
- 低三位(IS_NON_MAINARENA) 是否来自main_arena(多线程时,使用多个arena进行heap管理)