ncx_mempool 轻量级内存池
- 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 轻量级内存池相关推荐
- java内存池实现_Netty精粹之轻量级内存池技术实现原理与应用
在Netty中,通常会有多个IO线程独立工作,基于NioEventLoop的实现,每个IO线程负责轮询单独的Selector实例来检索IO事件,当IO事件来临的时候,IO线程开始处理IO事件.最常见的 ...
- 一个轻量级内存池的实现与细节
引言 内存池作为一种的内存管理机制被广泛地运用于各种领域当中,内存池拥有快速的内存分配与更加健壮的管理机制,同时在不同的平台与环境当中也拥有不同的实现方式,本文提出一种轻量级的内存池实现,可以非常方便 ...
- apr_pool -- 内存池
这个指南主要介绍如何使用 libapr ( apache portable runtime ). 版权所有, Copyright (C) 2005 INOUE Seiichiro <inoue& ...
- Netty内存池 (5w长文+史上最全)
文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...
- leveldb:Arena内存池
leveldb : Arena内存池 Arena Arena内存管理模型 Arena的构造与析构实现 Arena提供的接口 Allocate AllocateFallback AllocateNewB ...
- linux内存分配 连续 足够,linux内存池能分配连续物理内存吗
中. size参数: 内核是基于页技术分配内存,以最佳的利用系统的RAM. linux处理内存分配的方法是:创建一系列的内存对象池,每个池的内存大小事固定的,处理分配请求时,就直接在包含足够大的内存块 ...
- ceph bluestore源码分析:admin_socket实时获取内存池数据
环境: 版本:ceph 12.2.1 部署完cephfs 使用ceph-fuse挂载,并写入数据 关键参数: debug_mempool = true 将该参数置为true即可查看详细的blustor ...
- Memcached内存池分析
针对Memcacged1.4.15代码 1.完整slabs内存池图 这是我画的memcached的slabs内存池对象关系图: 2.内存池数据结构 typedef struct {unsigned i ...
- 提高C++性能的编程技术笔记:多线程内存池+测试代码
为了使多个线程并发地分配和释放内存,必须在分配器方法中添加互斥锁. 全局内存管理器(通过new()和delete()实现)是通用的,因此它的开销也非常大. 因为单线程内存管理器要比多线程内存管理器快的 ...
最新文章
- ISME:沈农栾军波组揭示水平转移基因的功能
- 释放skb buffer指针引出的指针传递问题
- 621. Task Scheduler 任务调度器
- 3年工作经验你的程序员应该具备的技能
- 高考前几天我们应该干什么?
- 模块之re模块 —— 正则
- 9 Characteristics of Free Software Users
- 如何在虚拟linux环境运行python_linux下使用virtualenv虚拟独立python环境
- c语言存为pdf,c语言10年保存(免费).pdf
- 今天母亲节,作为程序员,我是这样表达母爱的……
- 搭讪达人这样和女生发短信
- 常见五轴机床的机械结构形式讲解!
- 海量数据搜索算法优化-存储/查询/排序算法
- html调用一言api,「许巍定制」自建 Typecho/WordPress 一言API本地服务并调用
- linux 媒体管理器,Linux系统的多媒体管理大师-Compupic
- elasticsearch(ES)日志迁移
- Java网上商城服装衣服店毕业设计包含前后端springboot+mysql
- 一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。
- Ubuntu19安装Nvidia显卡驱动
- 湖北武汉劳务员考试劳务员建筑安装的劳务成本建筑七大员考试
热门文章
- 上市 | 章泽天 : 刘强东用10秒钟时间决定投资这个汽车
- FT232RL制作的USB转uart ttl,rs232,rs485.兼容3.3V及5V接磁珠
- android系统的市场占有率,安卓系统市场占有率竟然比苹果iOS高了这么多
- [转]英文中的偏旁部首及其记忆
- 多项式乘积求极值点与拐点“比较快速”的方法:沉鱼落雁闭月羞花
- python中的下划线是啥意思?
- 递归算法计算Legendre多项式
- 简单步骤实现wordpress添加og协议
- ArcGIS API for JavaScript 4.X Basemap类(史上最全)
- 【欣赏】logo设计原则 + 一组设计独特的logo欣赏