没有合适的资源?快使用搜索试试~ 我知道了~
简介此篇文章是描述 glibc 2.30 内存分配的,是结合源码做的分析,出于时间限制(分析起来还是很耗时的),我没有特别深入的进行分析和讲解(也有我自己没弄明
资源详情
资源评论
资源推荐
SP00F|版权属于我个人所有,你可以用于学习,但不可以用于商业目的
Glibc 内存分配
简介
此篇文章是描述 glibc 2.30 内存分配的,是结合源码做的分析,出于时间限制(分析
起来还是很耗时的),我没有特别深入的进行分析和讲解(也有我自己没弄明白的逻辑,
违背专业精神, 不过该篇文章应该还是有可以借鉴和学习的地方的);这导致文章可能存
在很多纰漏,还请大家见谅,我后续会抽时间在重新对该文章进行校正(同时把不理解的
逻辑重新理解)。
堆内存操作简介
操作系统提供了以下两个系统调用,来操作虚拟内存:
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment); [1]
它们都是通过位置移动来完成内存的分配和回收的。sbrk 参数 increment 为正数时,分
配内存;为负数时,回收内存;为 0 时,获得当前 break 位置;brk 是直接传入一个 addr
作为参数来更改 break 的位置。我们来写个程序测试一下(为方便演示,我关闭了系统的
ASLR):
SP00F|版权属于我个人所有,你可以用于学习,但不可以用于商业目的
程序做了以下几件事:通过调用 sbrk 获取当前 break 的位置(0x804a000);通过调用
sbrk 申请 16 字节的空间(设置 break 再原有基础上+16);调用 sbrk 获取当前 break 位
置;调用 sbrk 回收 4 个字节的空间(设置 break 再原有基础上-4);调用 sbrk 获取当前
break 的位置;调用 brk 设置 break 位置为 0x804b000;调用 sbrk 获取当前 break 位
置;调用 brk 设置当前 break 为 0x804a000(最初 break 的位置);调用 sbrk 获取当前
break 位置。运行结果如下:
从程序运行结果我们可以非常清楚的了解 brk 和 sbrk 的大致细节(底层机制我们不需要
SP00F|版权属于我个人所有,你可以用于学习,但不可以用于商业目的
过多关心),了解的这两个函数的工作细节,是不是就可以实现自己内存管理机制了呢?例
如我们可以设计一个内存池,或多个内存池,设计一个非常优秀的内存申请和回收算法等
等;答案是肯定的,你可以基于这两个函数实现自己的内存管理,其实只有这两个函数可
能还不够,你还需要 mmap 来管理申请比较大的内存。我们仍有其他的选择,借助已经
实现的优秀的内存管理算法:
dlmalloc – 第一个被广泛使用的通用动态内存分配器;
ptmalloc2 – glibc 内置分配器的原型;
jemalloc – FreeBSD & Firefox 所用分配器;
tcmalloc – Google 贡献的分配器;
libumem – Solaris 所用分配器;
……
这些管理内存的工具都宣称自己是最快最好的,我也不知道哪个好,我只用过 glibc 的内
存管理器,我们后面就来分析一下 glibc 是如何管理内存分配的。
glibc 内存分配器
我们通过 glibc 提供的函数 malloc、calloc、realloc、free 等来实现内存分配释放,我们
暂且不管 glibc 内存分配内部机制,先写个程序看看:
SP00F|版权属于我个人所有,你可以用于学习,但不可以用于商业目的
运行结果如下图;从运行结果我们可以看到,break 的起始位置为 0x804a000,从第一次
调用 malloc 开始后 break 位置就变为 0x806b000 了(产生了 132k 大小的堆,后面再介
绍原因),后续 b、c、d 申请内存 break 都没有发生改变(证明它们共用这 132k 内存),
从 e 申请内存开始 break 变为 0x808e000(截止到 e 申请的内存大小已经大于 132k
了)。
逆着申请内存的顺序调用 free 函数,当调用 free(e)后 break 变为了 0x808b000,调用
free(d)后 break 变成了 0x806b000(比较大的内存如果中间没有碎片会马上就被回
收,它可能是被映射的内存,超出 arena 范围的内存都会通过建立 heap 来分配内存),后
续 free 时 break 并没有改变(这里存在比较复杂的算法、释放的内存不会马上交给操作系
统,而是交给库内存管理器),即使后续不在申请内存,系统也没有马上回收剩余的内存。
SP00F|版权属于我个人所有,你可以用于学习,但不可以用于商业目的
我们在看另一种情况,该情况下我们一次性申请超过 arena 最大容量的内存 132k 内存:
运行结果:
剩余85页未读,继续阅读
芊暖
- 粉丝: 18
- 资源: 340
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0