• April 14, 2013
  • Leave a comment

github地址: https://github.com/dcshi/ncx_mempool.

其中ncx_slab.c.orz详细地进行了源码分析,所以文章不会对代码实现细节详细讨论。

开发c、c++程序的时候,malloc、new等内存分配很函数很多时候会被使用到。
但对于长期运行的后台服务来说,出于性能和内存碎片等考虑,我们的做法一般是重新实现内存池来管理服务的内存使用,而不是使用malloc、free等动态分配。

Slab Allocation是一种很通用的内存池实现思路。如memcache,nginx,linux内核等都使用slab来做内存管理.
它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。
至于实现细节上,却各有不同。

  • ncx_mempool 实质上是nginx的slab allcation实现。分离了nginx私有的部分逻辑,并添加了如查看内存池使用状态等功能而来。
  • ncx_mempool 非常轻量级、简单易用,详细可见github的example和API使用说明.
  • ncx_mempool 性能比malloc明显要高,bench.c 分别测试了不同size的内存,各执行100w次分配和释放操作下,ncx_mempool 与 malloc的耗时。

ncx_mempool的源码分析请参考github的ngx_slab.c.orz。接下来主要结合具体使用场景对内存结构进行分析。

调用用例如下:

ncx_slab_init(sp);
p1 = ncx_slab_alloc(sp, 5);
p2 = ncx_slab_alloc(sp, 1000);
p3 = ncx_slab_alloc(sp, 5000);
ncx_slab_free(sp, p1);
ncx_slab_free(sp, p2);
ncx_slab_free(sp, p3);

一.ncx_slab_init(sp) 后内存池结构:

二.ncx_slab_alloc(sp, 5) 后内存池结构:

三.ncx_slab_alloc(sp, 1000) 后内存池结构:

四.ncx_slab_alloc(sp, 5000) 后内存池结构:

五.依次对p1, p2, p3 释放以后内存结构:

ncx_mempool 轻量级内存池相关推荐

  1. java内存池实现_Netty精粹之轻量级内存池技术实现原理与应用

    在Netty中,通常会有多个IO线程独立工作,基于NioEventLoop的实现,每个IO线程负责轮询单独的Selector实例来检索IO事件,当IO事件来临的时候,IO线程开始处理IO事件.最常见的 ...

  2. 一个轻量级内存池的实现与细节

    引言 内存池作为一种的内存管理机制被广泛地运用于各种领域当中,内存池拥有快速的内存分配与更加健壮的管理机制,同时在不同的平台与环境当中也拥有不同的实现方式,本文提出一种轻量级的内存池实现,可以非常方便 ...

  3. apr_pool -- 内存池

    这个指南主要介绍如何使用 libapr ( apache portable runtime ). 版权所有, Copyright (C) 2005 INOUE Seiichiro <inoue& ...

  4. Netty内存池 (5w长文+史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

  5. leveldb:Arena内存池

    leveldb : Arena内存池 Arena Arena内存管理模型 Arena的构造与析构实现 Arena提供的接口 Allocate AllocateFallback AllocateNewB ...

  6. linux内存分配 连续 足够,linux内存池能分配连续物理内存吗

    中. size参数: 内核是基于页技术分配内存,以最佳的利用系统的RAM. linux处理内存分配的方法是:创建一系列的内存对象池,每个池的内存大小事固定的,处理分配请求时,就直接在包含足够大的内存块 ...

  7. ceph bluestore源码分析:admin_socket实时获取内存池数据

    环境: 版本:ceph 12.2.1 部署完cephfs 使用ceph-fuse挂载,并写入数据 关键参数: debug_mempool = true 将该参数置为true即可查看详细的blustor ...

  8. Memcached内存池分析

    针对Memcacged1.4.15代码 1.完整slabs内存池图 这是我画的memcached的slabs内存池对象关系图: 2.内存池数据结构 typedef struct {unsigned i ...

  9. 提高C++性能的编程技术笔记:多线程内存池+测试代码

    为了使多个线程并发地分配和释放内存,必须在分配器方法中添加互斥锁. 全局内存管理器(通过new()和delete()实现)是通用的,因此它的开销也非常大. 因为单线程内存管理器要比多线程内存管理器快的 ...

最新文章

  1. ISME:沈农栾军波组揭示水平转移基因的功能
  2. 释放skb buffer指针引出的指针传递问题
  3. 621. Task Scheduler 任务调度器
  4. 3年工作经验你的程序员应该具备的技能
  5. 高考前几天我们应该干什么?
  6. 模块之re模块 —— 正则
  7. 9 Characteristics of Free Software Users
  8. 如何在虚拟linux环境运行python_linux下使用virtualenv虚拟独立python环境
  9. c语言存为pdf,c语言10年保存(免费).pdf
  10. 今天母亲节,作为程序员,我是这样表达母爱的……
  11. 搭讪达人这样和女生发短信
  12. 常见五轴机床的机械结构形式讲解!
  13. 海量数据搜索算法优化-存储/查询/排序算法
  14. html调用一言api,「许巍定制」自建 Typecho/WordPress 一言API本地服务并调用
  15. linux 媒体管理器,Linux系统的多媒体管理大师-Compupic
  16. elasticsearch(ES)日志迁移
  17. Java网上商城服装衣服店毕业设计包含前后端springboot+mysql
  18. 一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。
  19. Ubuntu19安装Nvidia显卡驱动
  20. 湖北武汉劳务员考试劳务员建筑安装的劳务成本建筑七大员考试

热门文章

  1. 上市 | 章泽天 : 刘强东用10秒钟时间决定投资这个汽车
  2. FT232RL制作的USB转uart ttl,rs232,rs485.兼容3.3V及5V接磁珠
  3. android系统的市场占有率,安卓系统市场占有率竟然比苹果iOS高了这么多
  4. [转]英文中的偏旁部首及其记忆
  5. 多项式乘积求极值点与拐点“比较快速”的方法:沉鱼落雁闭月羞花
  6. python中的下划线是啥意思?
  7. 递归算法计算Legendre多项式
  8. 简单步骤实现wordpress添加og协议
  9. ArcGIS API for JavaScript 4.X Basemap类(史上最全)
  10. 【欣赏】logo设计原则 + 一组设计独特的logo欣赏