当前位置: 首页 > news >正文

malloc底层实现

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

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

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

不污染堆

避免堆碎片

http://www.jsqmd.com/news/327305/

相关文章:

  • abc443
  • 社会网络仿真软件:NodeXL_(14).案例研究:NodeXL在社会科学研究中的应用
  • 信号处理仿真:语音信号处理_(10).回声消除技术
  • 基于Android的在线音乐个性化推荐APP的设计与实现_53084988
  • 2026年创作视频必看,10种视频去字幕的主流方法
  • 信号处理仿真:语音信号处理_(4).语音信号的时域分析
  • ssm基于Android的电影院网上订票系统的设计与实现_890hss28_zl051
  • 2026年性能测试设备行业盘点:TOP 5厂家谁将引领技术浪潮
  • 1/31
  • [特殊字符]_压力测试与性能调优的完整指南[20260131134952]
  • P1125 [NOIP 2008 提高组] 笨小猴
  • 基于微信小程序的中小学生个性化阅读平台的设计与实现_ixgl9940
  • 2026年行业盘点:揭秘TOP 10寿命测试设备加工厂的三大内功
  • 【前缀和】LCR_013_二维区域和检索-矩阵不可变
  • 基于Django的本地健康宝微信小程序系统的设计与实现_d794c578
  • 2026年行业盘点:揭秘国内可靠性测试设备厂商TOP 5
  • [特殊字符]_安全性能平衡术:如何在保证安全的前提下提升性能[20260131134218]
  • SpringBoot基于微信小程序的社区医疗服务管理小程序的设计与开发_3k9irntw
  • 例说FPGA:可直接用于工程项目的第一手经验【2.2】
  • AI产品经理必读:幻觉缓解的需求分析方法
  • 基于微信小程序的博物馆文创系统的设计与实现_7n764cb1
  • 巴特沃斯低通滤波器实现
  • 274852785
  • Spring Data 让后端数据同步更高效
  • 设计模式组合应用:智能硬件控制系统
  • 一个让你效率翻三倍的AI技术博客写作工作流
  • 互联网医院|互联网医院搭建|互联网医院定制
  • 一款开源 OSINT 图探索工具,旨在实现合乎道德的调查、透明化和验证。
  • 社会网络仿真软件:Pajek_(7).网络参数计算与分析
  • 社会网络仿真软件:Pajek_(7).网络可视化技术v1