linux服务器高效内存池的具体实现(含实例源码)

本文介绍了Linux服务器内存池的实现原理,通过数据结构定义、初始化、内存申请、释放及销毁等功能,阐述了内存池如何提高内存利用率和性能。文中还讨论了内存池的优化潜力,如动态扩展和内存使用率监测。
摘要由CSDN通过智能技术生成

linux服务器开发相关视频解析:

 

后台开发第174讲|nginx源码分析之内存池与线程池|1. nginx的使用场景 2. nginx源码 内存池,线程池,日志 3. nginx的多进程网络实现

 

c/c++ linux服务器开发免费学习地址:c/c++ linux后台服务器高级架构师

在编程过程中,尤其是对于C语言开发者,其实编程就是在使用内存,不停地变化内存中的数据。当我们想开辟一片新的内存使用时,就会使用malloc实现。但是通过查阅很多资料,发现频繁的使用malloc并不是很好的选择。原因就是如果频繁的申请、释放内存,操作系统由于内存管理算法原因,导致出现内存碎片。其实产生碎片是一件很平常的事情,为何会这样,我想主要是内存利用率与性能的一个平衡。如果操作系统很抠门,肯定会把内存分配的逻辑算的很严密,“见缝插针”这四个字能很到的诠释内存分配策略。正因为见缝插针,经过很长的使用,内存上会遍布“针眼”,但是由于针眼普遍很小,当你再去插一个较粗的针的时候,往往很久“插不进去”。因为需要判断这么多针眼哪个足够宽松的能插进去这根针。

所以,如果我们不那么抠的去实现内存分配,是不是在性能上会有很大的提高呢?答案绝对是肯定的,而且随着硬件技术的提升,内存已经不是当年的容量,服务器起步也得是16G吧,32 64也是很常见的。就连现在手机都有6G内存的,实在令台式机服务器都汗颜。

在内存池的实现结尾,会加入一块内存池使用率监测打印,开发一种内存池,通吃所有的项目场景,显然是不可取的。说一个比较时尚的名词“机器学习”。这块的目的在于通过观测内存池的使用率,从而发现哪些长度的内存比较受项目的欢迎,需要多设,哪些长度的内存使用较少,需要少设。哪些长度的没有,需要新设等等。目前这块是纯手动的,并不是动态变化的,有些调优的感觉。

开始真正介绍内存池的实现吧!

正文

首先,我们来介绍一下本内存池实现的数据总结构,如下图所示:

我们来详细的介绍一下该数据结构,主要有如下分结构:

第一结构:如下图(从总图截图而来)

其实途中已经注明了结构的各个元素的含义,不用多解释,从总图中可以看出,这种结构是用 数组 形式穿起来的。不用链表是因为可以用 array[i] 这种形式快速找到所需要内存池型号,这也是很多内存池实现的方法。

第二结构:更简单,它的任务就是描述一个内存节点,如下图(从总图截图而来)

同样的待遇,图片已将很好的诠释了元素的作用,这里需要解释的是,为何搞个列编号,这个编号其实就是 第一个数组结构的数组编号,此处记录列编号是不是多此一举??

其实不是的,这里主要是考虑到内存回收时使用,内存分配的单位不是 传统的 malloc 返回值 unsigned char 而是,一个结构体指针,也就是这第二结构,如果没有列编号,回收内存需要遍历所有内存节点,找到地址匹配之节点,而有了列编号,直接去遍历编号所在池就可以,性能上肯定会有提升。我们不仅要考虑申请内存高效,也得考虑释放内存高效。

第三结构:如下图,同样来自总图截图。

这就是整体结构的最小单位,相当于最后的粮仓,真实的数据区,直接在初始化的时候,调用malloc申请的。这个就不解释了。

最后一个东西,就是总图标注的 “总指针”,在内存池初始化之前,只有这个一个指针是存在的,为全局变量,其他的都是malloc而来。

经过上面的讲解,相信高手已经了解了 8 9 成,新手也懂了 5 6成吧,毕竟一种算法或者功能,最重要的就是看懂数据结构,数据结构懂了,代码自然能看懂,数据结构不懂,代码永远理解不了。

从上面的总图来看,内存节点在下面挂的参差不齐,这个是故意这么画的,意思就是没列的容量是可以自定义的,举个栗子,16字节内存池竟发现用的较多,分配10000个吧!! 1024字节用的很少,分配100个吧 !! 项目由于特定因素, 申请400字节特别多,那就加一列,定一个 410字节,个数20000吧!!这段话很重要,说明该结构是可以灵活配置的,并且经过某个项目使用,可以修改这些参数,达到优化的目的。

到这里数据定义告一段落,下面讲解源码

1.数据结构定义部分

这部分其实在上面已经定义很清楚了,这里只是国际惯例贴上去,如下代码段。

typedef struct bpn memory_pool_node;
struct bpn{
	unsigned int column;
	unsigned char * data;
	memory_pool_node * next;
};
 
typedef struct{
	unsigned int total_count;
	unsigned int used_count;
	unsigned int block_len;
	memory_pool_node  * free_header;
	memory_pool_node  * used_header;
}memory_pool_colume;

2.全局变量

memory_pool_colume * b_p = NULL;
int buffer_pool_no = 0;<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值