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系列之内存管理相关推荐

  1. 服务器设计系列:内存管理

    服务器性能的关键在于内存.从收包到解析,到消息内存的申请,到session结构内存的申请都要小心处理,尽量减少内存数据copy,减少内存动态申请,减少内存检索.为达到这个目的,不同的地方有不同的方法, ...

  2. 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  3. iOS内存管理系列之一:对象所有权与引用计数

    原文地址:[转]iOS内存管理系列之一:对象所有权与引用计数作者:anynot 内存管理是iPhone或iPad开发中最为重要的一部分.掌握好了内存管理,开发出的应用就能运行流畅:掌握不好,开发出的东 ...

  4. Android面试系列文章2018之内存管理之UI卡顿篇

    Android面试系列文章2018之内存管理之UI卡顿篇 1.UI卡顿的原理   60ftp –> 16ms: Android系统每隔16ms都会对界面进行渲染一次,造成卡顿的原因就是Andro ...

  5. IOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

  6. [译]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- ...

  7. MIT-JOS系列4:内存管理

    在MIT-JOS lab1的实验中我们了解了bootloader和kernel载入的过程,并在kernel中完成了最初的虚拟内存映射.栈设置和硬件相关的一系列初始化.在Lab2中,我们将在JOS操作系 ...

  8. ARM和英特尔的386系列内存管理MMU硬件机制不同,ARM是基于协处理CP15(核心是C2 TTRB0,1)分页式,386是以段寄存器和CR3寄存器分段分页式内存管理

    ARM和英特尔的386系列内存管理MMU硬件机制不同,ARM是基于协处理CP15(核心是C2 TTRB0,1)分页式,386是以段寄存器和CR3寄存器分段分页式内存管理

  9. Android官方开发文档Training系列课程中文版:APP的内存管理

    写在开头的话: 如果有同学对Android性能比较关注的,可以阅读这篇文章:Android性能优化建议 原文地址:http://android.xsoftlab.net/training/articl ...

最新文章

  1. 计算机组成原理——知识结构体系
  2. 1.2 什么是神经网络-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  3. mybatis教程--一对多查询
  4. 分布式计算引擎MapReduce
  5. ASP.NET MVC5+ 路由特性
  6. VTK:图表之SelectedVerticesAndEdges
  7. Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
  8. 设计模式--请参阅本质
  9. 销售的基本功(倾听、提问、聊天)
  10. 'bout_magi
  11. VMRC 控制台的连接已断开
  12. 宝立食品上交所上市:年营收15.78亿 市值58亿
  13. jstl和el表达式
  14. 资金合规结算——聚焦银行内部两种不同账户
  15. 【观察】联想“内生外化”:能干肯干、真招实招加速中小企业数字化转型
  16. 青海行--(7月28日)凯旋归程
  17. 招商头条:2018成都快递业中西部第一;合肥高新区30个项目签约125亿;芯盾时代完成3亿元融资
  18. Macbook电池出现“建议维修”的解决办法
  19. “第四产业”升级,中软国际“蝶变”
  20. 酷派大神F2使用QPST进行nv备份恢复,解决无信号问题

热门文章

  1. EasyExcel导入数据
  2. CCNP--PVLAN-----交换安全
  3. 多变量微积分笔记24——空间线积分
  4. 【最新计算机毕业设计】JAVA基于微信小程序的英语学习激励系统
  5. FFmpe写一个多线程播放器1 基础逻辑和队列定义
  6. 用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美
  7. 智合同携手金山办公打造智能合同应用服务
  8. 将字符串转成int类型
  9. ASPICE详细介绍-3.ASPICE有多少能力等级?
  10. 网络安全态势感知运营中心建设解决方案