MySQL 源码解读 -- server层内存管理
server层内存管理
数据结构
1 | struct Block { |
Block 的prev 指的都是历史Block, 已经分配完内存的Block
m_max_capacity 为0,表示不限制
m_allocated_size表示的使用的block 合起来的size
Block 内部结构
要求my_memory_head小于32个字节
内存申请流程
申请block内部
其中“设置当前block” ,
1 | char *new_mem = |
插入现有blockchain
1 | new_block->prev = m_current_block->prev; |
其中有个细节, 当申请big内存时, 会将blocksize 增加1/2
这个里面有一点内存浪费逻辑
当内存不够时,并且新申请的内存小于blocksize时, 当前block会变成历史block, 历史block 基本上内存用
Claim
MEM_ROOT Claim 会对每个Block 进行Claim
而Block->claim, 主要是设置PSI
1 | void my_claim(const void *ptr) { |
Clear
如果设置了MY_MARK_BLOCKS_FREE或MY_KEEP_PREALLOC标记位, 则root->ClearForReuse();
否则直接调用root->Clear
ClearForReuse 和Clear 主要的区别就是, 对当前block的处理, Reuse 会重新使用当前Block, 而clear会清理当前Block
Clear
1 | Block *start = m_current_block; |
ClearForReuse
1 | m_current_free_start = pointer_cast<char *>(m_current_block) + |
Block 内部
内存申请/释放都是走my_malloc/my_free/my_realloc, 这几个函数比较简单, 就是申请一块内存,然后将内存header设置相应的数据