细说MySQL 之MEM_ROOT

栏目: Mysql · 发布时间: 7年前

内容简介:这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分。

这篇文章会详细解说 MySQL 中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分。

在具体分析之前我们先例举在该结构体使用过程中用到的一些宏:

下面再来看看MEM_ROOT结构体相关的信息:

以下是分配具体的block信息.

其实MEM_ROOT在分配过程中,是通过双向链表来管理used和free的block:
细说MySQL 之MEM_ROOT

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)。

细说MySQL 之MEM_ROOT

下面来看看具体分配内存的步骤:

上述代码的具体逻辑如下:
1.查看free链表,寻找满足空间的block。如果找到了合适的block,则:
   1.1 直接返回该block从size-left处的初始地址即可。当然,在free list遍历的过程中,会去判断free list
         中第一个block中left的空间不满足需要分配的空间,且该block中已经查找过了10次
         (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指向的地址的地址:
细说MySQL 之MEM_ROOT

所以将prev的地址替换为new block的地址,即将该new block加到了free list的结尾:
*prev=next;

细说MySQL 之MEM_ROOT

总结:
MEM_ROOT的内存分配采用的是启发式分配算法,随着后续block的数量越多,单个block的内存也会越大:block_size= mem_root->block_size * (mem_root->block_num >> 2) .


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Social Web Applications

Building Social Web Applications

Gavin Bell / O'Reilly Media / 2009-10-1 / USD 34.99

Building a social web application that attracts and retains regular visitors, and gets them to interact, isn't easy to do. This book walks you through the tough questions you'll face if you're to crea......一起来看看 《Building Social Web Applications》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具