malloc底层实现

malloc 本质是一个"用户态内存管理器" 它向操作系统批量要内存brk / mmap),然后在用户态 把这些内存切块、复用、合并、回收

从你调用 malloc 开始发生了什么?

cpp 复制代码
void* p = malloc(100);

真实流程大概是:

**malloc(100)

glibc 的 ptmalloc

  1. 在进程已有的堆中找合适的空闲块
  2. 找不到 → 向 OS 申请新内存
    ├─ 小块:brk 扩展堆
    └─ 大块:mmap 映射匿名内存**

重点
malloc 不是每次都系统调用,绝大多数是用户态完成的。

进程的"堆"长什么样?

低地址
┌────────────┐
│ text/code │
├────────────┤
│ data/bss │
├────────────┤
│ heap │ ← brk 向上增长
│ │
├────────────┤
│ ... │
├────────────┤
│ stack │ ← 向下增长
└────────────┘
高地址

heap 是 malloc 主要活动区域

brk() / sbrk() 扩展

连续虚拟地址

glibc malloc 的核心实现:ptmalloc

Linux 下默认是 ptmalloc

目标 解释
尽量 O(1)
少碎片 合并、分级
多线程友好 arena
减少系统调用 批量申请

malloc 管理的"内存块"结构

┌───────────────────────┐
│ prev_size (可选) │
├───────────────────────┤
│ size | flags │ ← 是否空闲 / mmap
├───────────────────────┤
│ 用户数据区 │ ← malloc 返回的指针
│ │
├───────────────────────┤
│ (空闲时) fd / bk │ ← 双向链表指针
└───────────────────────┘

size 字段里藏了"位标志"

size = 实际大小 | PREV_INUSE | IS_MMAPPED | ...
malloc 能 O(1) 合并相邻 free 块,靠的就是这些 flag。

free 链表 & bin 体系

glibc 用 多级 bin 管理不同大小的内存块。

fastbin

很小的内存(≤ 64B 左右)

单向链表 free

不合并,直接塞进去

极快,但容易产生碎片

small bin

精确大小分类

双向链表

free 时可以合并

large bin(大块)

按大小范围分

近似 best-fit

适合 1KB~128KB

unsorted bin

所有 free 的块先放这里

复制代码
free()
  ↓
unsorted bin
  ↓
malloc 时再决定进哪个 bin
减少 bin 操作开销

malloc 的查找策略

malloc(n) 的步骤

malloc(n) 的步骤

对齐 + 最小块大小修正

优先查:

fastbin

small bin

找不到:从 unsorted bin 拆

还没有:

large bin

再不行:

向 OS 要内存

什么时候用 brk?什么时候用 mmap?

申请大小 方式
小块 brk(堆)
大块 mmap

mmap 的特点

独立虚拟内存区

free 直接 munmap

不污染堆

避免堆碎片

相关推荐
可编程芯片开发11 小时前
基于MATLAB的PEF湍流风场生成器模拟与仿真
算法
罗西的思考11 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (9)--- Reward Judging
人工智能·算法·机器学习
Mr.HeBoYan12 小时前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
wabs66613 小时前
关于图论【深度优先搜索的理论基础】
算法·深度优先·图论
先吃饱再说14 小时前
LeetCode 101. 对称二叉树
算法
是Dream呀14 小时前
人眼看不出的伪造,AI如何识别?实测合合信息跨模态鉴伪与去反光技术
算法
QN1幻化引擎15 小时前
SFA 信号场注意力:用8KB参数换248x KV Cache压缩,边缘设备也能跑长序列
人工智能·算法·gitee·gitlab
段一凡-华北理工大学15 小时前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
cjr_xyi16 小时前
AT1202Contest_c binarydigit 题解
c语言·c++·算法
atunet17 小时前
从算法优化到系统加速的多层级思考7
算法