文档章节

一个c/c++内存分配器

画面太美我不敢看
 画面太美我不敢看
发布于 2017/03/30 20:10
字数 701
阅读 116
收藏 0

2010年之前我被外派到了华为的彩信项目组里面做c++的开发,对于我们刚刚毕业的人来讲,了解到项目代码里面居然有自己的内存分配管理模块,让我们很是激动。从那时候就萌生了一个原来好的c++程序是需要自己管理内存的分配和释放,尽量重用已经分配到的内存。

时隔六年,机缘巧合下,重新参与了windows下的一个c++项目开发,本项目设计到极大量的,不定长大块内存的频繁的申请和释放。这些内存分配和释放严重的影响了系统的性能,即便是在20核40线程的超高cpu下,多线程性能依然表现平平。

面对这样的问题,归根结底就是要提高内存的重复利用率。目前不定长的内存分配,在我们的系统中,重复利用率搞到了99%以上,基本杜绝了大量内存的频繁申请和释放,提高了性能。现将基本设计思路随后奉上,欢迎大家批评指正。

1:从64Byte到1个G,按照根号2指数级创建各个块大小的仓库。

2:分配内存的时候,按照需要分配的大小,找到合适的仓库。仓库里面如果有空闲的内存块直接使用。没有则向操作系统分配新的块。

3:释放内存的时候,找到这个内存归属的块,归还到对应的仓库里面去。

4:定时清除超时没有被重用的块。

 

技术难点

1:除了块需要占用内存,本内存分配器还需要一些管理数据,如何提升性能并且最小化这部分管理数据的开销。

2:内存的分配和释放时,如果快速的找到仓库和空闲的块。

性能:

循环的测试1万次内存分配和释放,每次分配的内存为1byte-5M的随机值。
random bytes length begin:1, end:5242880, test times:10000, system api cost:8891, greedyMemory cost:15,totalMallocCount:9999, blockReuseCount:9983, call system malloc count:16
如此宽范围不定长的内存分配,此内存分配器性能提升依然到达了(8891/15) = 593倍。内存重复利用率也高达:99.83%

一些思考

1:关于内存对齐。内存对齐只是在16Byte倍数比较小的内存范围内才有优化的必要,比起对齐需要多分配的内存以及管理消耗,大内存对不对齐没有什么影响。

 

 

本内存分配器已经开源:http://git.oschina.net/apengge/TrickyMemoryAllocator

© 著作权归作者所有

画面太美我不敢看
粉丝 0
博文 1
码字总数 701
作品 0
南京
后端工程师
私信 提问
一个从硬盘上取空间的STL内存空间分配器

最近在读侯捷写的《STL源码剖析》。 看完STL的内存空间分配器这章。在这章里,作者开玩笑的说,你甚至可以写一个直接从硬盘上取空间的配置器。我想,我确实可以写这样的分配器。然后今天就动...

costaxu
2012/12/09
712
0
《Effective STL》读书总结--关于STL 你不一定都懂的

春节期间一次用手机上网无意间发现了这本书,说起来还得感谢智能手机的发展,有时候还是很方便的。当时随便的翻了几页,于是我停不下来了,因为我发现原来我不知道的东西太多了。 我第一次接...

长平狐
2012/06/08
148
0
功能强大的 C++ redis 客户端库增加至 acl 项目中

虽然 redis 开发库已有不少,但 C/C++ 的客户端库好用的并不多,虽然官方也提供了 C 版的客户端库,但易用性较差,而且不支持连接池功能,相对于 C/C++ 的库,JAVA 版的 jedis 要好用的多,j...

郑树新
2015/02/04
8.6K
9
linux内存管理伙伴算法(基本概念介绍)

在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用bootmem分配器,毕竟不能同时用两个分配器管理内存。在UMA和 NUMA系统上,停用分别由freeallbootmem和freeallbootmemn...

慎思
2012/09/04
668
0
Linux中常用C/C++一些头文件的作用

1、 Linux中一些头文件的作用: <assert.h>:ANSI C。提供断言,assert(表达式) <glib.h>:GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。使用glib只需要包含<glib.h...

SibylY
2013/09/25
229
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx+tomcat配置https

1、nginx配置https和【proxy_set_header X-Forwarded-Proto $scheme;】 2、java代码: String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServe......

perofu
28分钟前
4
0
必看的Linux系统新手进阶老手心得

不知道从什么时候起,linux这个话题变得越来越普及,成为大家经常讨论的话题。无论在网络上还是实际生活中,竟然很多人都在纠结学习linux的问题。网络上给的答案千千万万,而却还有很多人踌躇...

Linux就该这么学
31分钟前
4
0
Spring Boot 配置元数据指南

1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的。但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot Configuration Proces...

liululee
34分钟前
3
0
foreach查找子类

$list = $menu_model -> menu_list();$parent_list = [];foreach ($list as $v){ if ($v['pid'] == 0) { $parent = $v; foreach ($list as $v1) ......

小小小壮
46分钟前
3
0
基于 HTML5 Canvas 实现的 TP-LINK 电信拓扑设备面板

前言 今天我们以真实的 TP-LINK 设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动。 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink_20170511/index.h...

htdaydayup
52分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部