C++ malloc下申请内存途径

五年前的时候,因为OOM导致进程无故被kill掉,也没有coredump,分析了好久,最后发现是因为因为glibc的free不一定会将内存归还OS,导致OOM,造成了上千万损失,当时心态差点崩了。

当时大概用了1个月的时间分析gblic下内存管理的源码
之前一直以为glibc只是一个中介,应用程序每次申请和释放内存都是通过glibc来操作,即应用程序每次调用malloc都是gblic向os申请内存,调用free都是gblic向os归还内存。但是,自从看了glibc源码之后,颠覆了我的认知,glibc下的内存管理器(ptmalloc),也可以说是一个内存池(我们暂且称之为内存池),应用程序的申请内存或者释放内存,都是在该内存池中实现,只有满足ptmalloc的某些特定条件之后,ptmalloc才会调用sys_trim函数,将内存归还操作系统。 

glibc补充知识:

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。

 

 

下面是针对glibc中内存管理主要函数mallocfree的实现原理

 

1、下面是application申请内存时候的宏观图

2、glibc的分配和释放远比我想象复杂的多,里面涉及到bin概念

fast bins,small bins,largebins,top chunk,mmaped chunk以及lastremainder chunk

内存的释放和分配都是在上面这些里面操作的

 

希望后面有时间精进一些关于这方面的理解

来源:https://www.zhihu.com/question/575065794/answer/2869761623

需要了解更多,请继续阅读

https://mp.weixin.qq.com/s/pdv5MMUQ9ACpeCpyGnxb1Q

posted @   woodx  阅读(198)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示