位置: 编程技术 - 正文
推荐整理分享MySQL MEM_ROOT详解及实例代码,希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!
MySQL MEM_ROOT详解
这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分。
在具体分析之前我们先例举在该结构体使用过程中用到的一些宏:
下面再来看看MEM_ROOT结构体相关的信息:
以下是分配具体的block信息.
其实MEM_ROOT在分配过程中,是通过双向链表来管理used和free的block:
MEM_ROOT的初始化过程如下:
初始化过程中,block_size空间为block_size-ALLOC_ROOT_MIN_BLOCK_SIZE。因为在内存不够,需要扩容时,是通过mem_root->block_num >>2 * block_size 来扩容的,所以mem_root->block_num >>2 至少为1,因此在初始化的过程中mem_root->block_num=4(注:4>>2=1)。
下面来看看具体分配内存的步骤:
上述代码的具体逻辑如下:
1.查看free链表,寻找满足空间的block。如果找到了合适的block,则:
1.1 直接返回该block从size-left处的初始地址即可。当然,在free list遍历的过程中,会去判断free list中第一个block中left的空间不满足需要分配的空间,且该block中已经查找过了次(ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP)都不满足分配长度,且该block剩余空间小于4k(ALLOC_MAX_BLOCK_TO_DROP),则将该block 移动到used链表中。
2.如果free链表中,没有合适的block,则:
2.1 分配 mem_root->block_size * (mem_root->block_num >> 2)和length+ALIGN_SIZE(sizeof(USED_MEM))中比较大的作为新的block内存空间。
2.2 根据该block的使用情况,将该block挂在used或者free链表上。
这里需要注意的是二级指针的使用:
prev指向的是最后一个block的next指向的地址的地址:
所以将prev的地址替换为new block的地址,即将该new block加到了free list的结尾:*prev=next;
总结:
MEM_ROOT的内存分配采用的是启发式分配算法,随着后续block的数量越多,单个block的内存也会越大:block_size= mem_root->block_size * (mem_root->block_num >> 2) .
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
MySQL 随机函数获取数据速度和效率分析 在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使
mysql group by having 实例代码 mysqlgroupbyhaving实例注意:使用groupby的时候,SELECT子句中的列名必须为分组列。如下实例必须包括name列名,因为name是作为groupby分组的条件。实例:我的
php mysql insert into 结合详解及实例代码 phpmysqlinsertinto结合详解ySQLINSERTINTO语句在实际应用中是经常使用到的语句,所以对其相关的内容还是多多掌握为好。向数据库表插入数据INSERTINTO语句用
友情链接: 武汉网站建设