FreeSwitch系列之内存管理
1.sofia-sip库的内存管理
home-based 内存管理机制,在需要分配许多内存块的情况下非常有用。分配器是通过分配中心保存各个分配内存块的引用来实现的。当分配中心释放,所有它保持引用的内存块都会被释放。
为一个给定任务分配大量的内存块时基于home的内存管理将非常高效。分配将通过home内存来执行,home内存保留着每个分配内存块的地址。当home内存被释放时,它也将释放那些它跟踪的内存块。这大大简化了应用代码逻辑,不再需要维护每块分配的内存空间,不需要保留他们的地址也不再需要一个个单独释放。
核心代码剖析
核心数据结构
/** Memory home structure */
struct su_home_s {int suh_size;su_block_t *suh_blocks;su_alock_t *suh_lock;
};struct su_block_s {su_home_t *sub_parent; /**< Parent home */char *sub_preload; /**< Preload area */su_home_stat_t *sub_stats; /**< Statistics.. */void (*sub_destructor)(void *); /**< Destructor function */size_t sub_ref; /**< Reference count */
#define REF_MAX SIZE_MAXsize_t sub_used; /**< Number of blocks allocated */size_t sub_n; /**< Size of hash table */unsigned sub_prsize:16; /**< Preload size */unsigned sub_prused:16; /**< Used from preload */unsigned sub_hauto:1; /**< "Home" is not from malloc */unsigned sub_auto:1; /**< struct su_block_s is not from malloc */unsigned sub_preauto:1; /**< Preload is not from malloc */unsigned sub_auto_all:1; /**< Everything is from stack! */unsigned :0;su_alloc_t sub_nodes[SUB_N]; /**< Pointers to data/lower blocks */
};typedef struct {unsigned sua_size:SIZEBITS; /**< Size of the block */unsigned sua_home:1; /**< Is this another home? */unsigned :0;void *sua_data; /**< Data pointer */
} su_alloc_t;
从结构体类型来看,整个Home based memory management包括三个层级。最上层是su_home_s,中间一层是su_block_s,最下那层是su_alloc_t。su_home_s结构体保留一个指向su_block_s结构体的指针,su_block_s包含一个su_alloc_t类型的数组。
使用方法
1、先申明一个包含有su_home_s结构体对象的结构体,类似于这样
struct context { su_home_t ctx_home[1]; other_t *ctx_stuff; ...}
context结构体内第一个就是su_home_s结构体对象。然后context结构体内包含了其他的对象。要求就是必须确保context结构体内第一个对象一定时su_home_s对象。
2、然后就是调用创建函数创建、初始化context结构体对象。
struct context *ctx = su_home_new(sizeof (struct context));
3、接着使用su_zalloc函数处理内存分配事宜。
zeroblock = su_zalloc(ctx->ctx_home, sizeof (*zeroblock));
4、调用su_home_deinit(ctx->ctx_home)释放内存。
2.APR内存池
Apache中的内存分配的基本结构都是资源池,包括线程池,套接字池等等。内存池通常是一块很大的内存空间,一次性被分配成功,然后需要的时候直接去池中取,而不需要重新分配,这样避免的频繁的malloc操作,而且另一方面,即时内存的使用者忘记释放内存或者根本就不想分配,那么这些内存也不会丢失,它们仍然保存在内存池中,当内存池被销毁的时候这些内存将自动的被销毁。
使用方法
1、创建一个内存池。
switch_core_new_memory_pool(&usepool);
2、从内存池中分配。
session = switch_core_alloc(usepool, sizeof(*session));
3、销毁内存池,回收内存。
switch_core_destroy_memory_pool(usepool);
内存回收剖析
在Freeswitch使用apr内存池中,在调用
switch_core_perform_destroy_memory_pool后,并没有马上回收内存,而是放到了memory_manager.pool_queue的队列里面,再由单独的一个线程,从这个队列里面取出指针进行销毁。
FreeSwitch系列之内存管理相关推荐
- 服务器设计系列:内存管理
服务器性能的关键在于内存.从收包到解析,到消息内存的申请,到session结构内存的申请都要小心处理,尽量减少内存数据copy,减少内存动态申请,减少内存检索.为达到这个目的,不同的地方有不同的方法, ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- iOS内存管理系列之一:对象所有权与引用计数
原文地址:[转]iOS内存管理系列之一:对象所有权与引用计数作者:anynot 内存管理是iPhone或iPad开发中最为重要的一部分.掌握好了内存管理,开发出的应用就能运行流畅:掌握不好,开发出的东 ...
- Android面试系列文章2018之内存管理之UI卡顿篇
Android面试系列文章2018之内存管理之UI卡顿篇 1.UI卡顿的原理 60ftp –> 16ms: Android系统每隔16ms都会对界面进行渲染一次,造成卡顿的原因就是Andro ...
- IOS开发系列—Objective-C之内存管理
概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
- [译]C# 7系列,Part 10: Spanlt;Tgt; and universal memory management Spanlt;Tgt;和统一内存管理
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...
- MIT-JOS系列4:内存管理
在MIT-JOS lab1的实验中我们了解了bootloader和kernel载入的过程,并在kernel中完成了最初的虚拟内存映射.栈设置和硬件相关的一系列初始化.在Lab2中,我们将在JOS操作系 ...
- ARM和英特尔的386系列内存管理MMU硬件机制不同,ARM是基于协处理CP15(核心是C2 TTRB0,1)分页式,386是以段寄存器和CR3寄存器分段分页式内存管理
ARM和英特尔的386系列内存管理MMU硬件机制不同,ARM是基于协处理CP15(核心是C2 TTRB0,1)分页式,386是以段寄存器和CR3寄存器分段分页式内存管理
- Android官方开发文档Training系列课程中文版:APP的内存管理
写在开头的话: 如果有同学对Android性能比较关注的,可以阅读这篇文章:Android性能优化建议 原文地址:http://android.xsoftlab.net/training/articl ...
最新文章
- 计算机组成原理——知识结构体系
- 1.2 什么是神经网络-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
- mybatis教程--一对多查询
- 分布式计算引擎MapReduce
- ASP.NET MVC5+ 路由特性
- VTK:图表之SelectedVerticesAndEdges
- Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
- 设计模式--请参阅本质
- 销售的基本功(倾听、提问、聊天)
- 'bout_magi
- VMRC 控制台的连接已断开
- 宝立食品上交所上市:年营收15.78亿 市值58亿
- jstl和el表达式
- 资金合规结算——聚焦银行内部两种不同账户
- 【观察】联想“内生外化”:能干肯干、真招实招加速中小企业数字化转型
- 青海行--(7月28日)凯旋归程
- 招商头条:2018成都快递业中西部第一;合肥高新区30个项目签约125亿;芯盾时代完成3亿元融资
- Macbook电池出现“建议维修”的解决办法
- “第四产业”升级,中软国际“蝶变”
- 酷派大神F2使用QPST进行nv备份恢复,解决无信号问题