在innodb中实现了自己的内存池系统和内存堆分配系统,在innodb的内存管理系统中,大致分为三个部分:基础的内存块分配管理、内存伙伴分配器和内存堆分配器。innodb定义和实现内存池的主要目的是提供内存的使用率和效率,防止内存碎片和内存分配跟踪和调试。我们先来看看他们的关系和结构。
下面是它的关系结构图:
上图中的:
ut_mem_block块是基础内存管理
Buddy allocator是内存伙伴分配器
mem_heap是内存堆分配器
通过一个链表结构体来管理已经分配的内存。结构体例如以下:
typedef ut_mem_block_struct
{
ulint size; /*这个被分配block的内存大小*/
ulint magic_n; /*节点魔法字,用于校验所用*/
UT_LIST_NODE_T(ut_mem_block_t) mem_block_list; /*block list node,指定prev node和next node*/
};关于block的list定义是个全局的变量。UT_LIST_BASE_NODE_T(ut_mem_block_t)
ut_mem_block_list;全部分配的block都会增加到这个list其中。在ut_malloc_low函数分配内存的时候会将分配的block增加到list其中。在ut_free的时候会所释放的内存所在的block从list其中删除。
除了这两个函数以外,innodb还提供ut_free_all_mem函数来释放全部分配的block和统计分配内存的总数ut_total_allocated_memory功能。
ut_free_all_mem 释放ut_mem_block_list全部的内存块并清空ut_mem_block_list
以上函数是支持多线程并发操作的。也就是说是线程安全的。
innodb的伙伴分配器是基于2的基数为基础的管理方式,其buddy alloc pool的定义例如以下:
struct mem_pool_struct
{
byte* buf; /*总体内存的句柄*/
ulint size; /*总体内存大小*/
ulint reserved; /*当前分配出去的总内存大小*/
mutex mutex; /*多线程相互排斥量*/
UT_LIST_BASE_NODE_T(mem_area_t) free_list[64]; /*area_t链表数组,每一个数组单元能管理2的i次方内存块列表,i是数组的下标*/
};
struct mem_area_struct
{
ulint size_and_free; /*area的内存大小(一定是2的次方),最后一个bit表示是否已经释放*/
UT_LIST_NODE_T(mem_area_t) free_list; /*area链表的上下area,由于buddy area是会分裂的,有可能多个*/
};mem_area_t是一个buddy的内存区域。也就是mem_area_struct。下面是一个32位机器管理1024字节内存块的buddy list分布:
struct mem_block_info_struct
{
ulint magic_n; /*魔法字*/
char file_name[8]; /*分配内存的文件*/
ulint line; /*分配内存的文件所在行*/
ulint len; /*block的长度*/
ulint type; /*依赖的底层分配类型,有DYNAMIC、BUFFER、BTR_SEARCH三种类型*/
ibool init_block; /*是否是外部分配的内存块*/
ulint free; /*被占用的空间大小*/
ulint start; /*可分配内存的起始位置*/
byte* free_block; /*备用block,只在BTR_SEARCH方式可用*/
UT_LIST_BASE_NODE_T(mem_block_t) base;
UT_LIST_NODE_T(mem_block_t) list;
};
备注:mem_block_info_struct/mem_block_info_t/mem_block_t/mem_heap_t是等价
4.mem_heap_t在释放mem_block_t时候总是从顶端開始释放,直到不能释放为止(mem_block_t没有被使用者归还)。在mem_block_t释放的时候也是须要參考DYNAMIC、BUFFER、BTR_SEARCH类型进行相对于的归还规则(和2要点是相相应的)。
在MySQL-5.6的版本号中。innodb提供两种选择,一种是使用innodb提供的内存池管理内存,另一种是提供系统的malloc和free来作为内存管理。MySQL默认的是系统管理内存方式,一些有经验的DBA会使用系统的管理内存方式+TMalloc来做内存优化。借助TMalloc高效的内存管理方式实现MySQL的性能提升。
原文:http://www.cnblogs.com/jhcelue/p/7150637.html