news 2026/6/15 10:20:07

malloc底层实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

不污染堆

避免堆碎片

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 16:47:49

算法:二叉树最大路径和

核心解题思路 要理解这个算法,你需要明白二叉树中的任何一个节点在计算路径时,其实扮演了两个不同的角色: 1. 对“上级”(父节点)的角色:只能提供一条腿 当一个节点(比如 root)向…

作者头像 李华
网站建设 2026/6/5 20:11:27

社会网络仿真软件:Pajek_(4).数据导入与导出

数据导入与导出 在社会网络仿真软件Pajek中,数据的导入和导出是非常重要的功能,因为它们允许用户将网络数据从外部源导入到Pajek中进行分析,或者将分析结果导出到其他应用或文件格式中。本节将详细介绍Pajek中数据导入和导出的原理和操作方法…

作者头像 李华
网站建设 2026/6/13 6:19:24

AI应用架构师的上下文工程:开启AI智能体高性能时代

AI应用架构师的上下文工程:开启AI智能体高性能时代 一、引入:当AI“忘记”了你的话,问题出在哪里? 你有没有遇到过这样的场景? 你问聊天机器人:“我昨天买的手机怎么连不上Wi-Fi?”它回复&am…

作者头像 李华
网站建设 2026/6/12 19:00:40

【前缀和】LCR_013_二维区域和检索-矩阵不可变

求解代码private int[][] preSum;public NumMatrix(int[][] matrix) {int m matrix.length;int n matrix[0].length;if(m0||n0){return;}preSum new int[m1][n1];for(int i1;i<m;i){for(int j1;j<n;j){preSum[i][j]preSum[i-1][j]preSum[i][j-1]matrix[i-1][j-1]-preS…

作者头像 李华
网站建设 2026/5/25 16:35:43

Kimi K2.5实测翻车了?我花3小时测完,发现真相没那么简单

Kimi K2.5实测翻车了?我花3小时测完,发现真相没那么简单 昨天 Kimi 发布 K2.5 的时候&#xff0c;朋友圈都在刷“开源最强”。我本来也准备跟风夸一波&#xff0c;结果测了三个小时后&#xff0c;我发现事情远比想象的复杂——这个模型既让我惊艳到拍大腿&#xff0c;又让我气…

作者头像 李华