核心内容摘要
洋具软件下载官方版:开启高效数字生活的全能钥匙,体验从未有过的极速与便捷
malloc本质是一个“用户态内存管理器”它向操作系统批量要内存brk / mmap然后在用户态把这些内存切块、复用、合并、回收。
从你调用malloc开始发生了什么void* p malloc(
;真实流程大概是malloc(
↓glibc 的 ptmalloc↓
在进程已有的堆中找合适的空闲块
找不到 → 向 OS 申请新内存├─ 小块brk 扩展堆└─ 大块mmap 映射匿名内存重点malloc不是每次都系统调用绝大多数是用户态完成的。
进程的“堆”长什么样低地址┌────────────┐│ text/code │├────────────┤│ data/bss │├────────────┤│ heap │ ← brk 向上增长│ │├────────────┤│ ... │├────────────┤│ stack │ ← 向下增长└────────────┘高地址heap是 malloc 主要活动区域brk()/sbrk()扩展连续虚拟地址glibc malloc 的核心实现ptmallocLinux 下默认是ptmalloc目标解释快尽量 O(
少碎片合并、分级多线程友好arena减少系统调用批量申请malloc 管理的“内存块”结构┌───────────────────────┐│ prev_size (可选) │├───────────────────────┤│ size | flags │ ← 是否空闲 / mmap├───────────────────────┤│ 用户数据区 │ ← malloc 返回的指针│ │├───────────────────────┤│ (空闲时) fd / bk │ ← 双向链表指针└───────────────────────┘size 字段里藏了“位标志”size 实际大小 | PREV_INUSE | IS_MMAPPED | ...malloc 能 O(
合并相邻 free 块靠的就是这些 flag。
free 链表 bin 体系glibc 用多级 bin管理不同大小的内存块。
fastbin很小的内存≤ 64B 左右单向链表free不合并直接塞进去极快但容易产生碎片small bin精确大小分类双向链表free 时可以合并large bin大块按大小范围分近似 best-fit适合 1KB~128KBunsorted bin所有free的块先放这里free() ↓ unsorted bin ↓ malloc 时再决定进哪个 bin 减少 bin 操作开销malloc 的查找策略malloc(n) 的步骤malloc(n) 的步骤对齐 最小块大小修正优先查fastbinsmall bin找不到从 unsorted bin 拆还没有large bin再不行向 OS 要内存什么时候用 brk什么时候用 mmap申请大小方式小块brk堆大块mmapmmap 的特点独立虚拟内存区free直接munmap不污染堆避免堆碎片