MySQL系列:innodb源码分析之表空间管理
innodb在实现表空间(table space)基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space、segment inode、extent和page.在实现层的逻辑使用了磁盘链表这种结构来管理逻辑关系。我们先来介绍磁盘链表。
1.磁盘链表
typedef struct fil_addr_struct
{ulint page; /*page在space中的编号*/ulint boffset; /*page中的字节偏移量,在内存中使用2字节表示*/
}fil_addr_t;
flst_node_t可以通过buf_ptr_get_fsp_addr来确定fil_addr_t。
1.1磁盘链表的结构关系
2.space结构分析
2.1 FSP HDR/XDES Page
2.1.1XDES结构分析(extent)
XDES list 是磁盘双向链表的一个节点,分别指向前一个XDES entry的page位置和后一个
state extent的状态, XDES_FREE、XDES_FREE_FRAG、XDES_FULL_FRAG、
bitmap 当前extent的所有page的状态索引,一个page占用2 bit,第一个bit表示是否被使用
2.1.2 FSP Header
limit 当前space已经分配初始化的page数,包括空闲的和已经使用的
flag 未起作用
frage used FSP_FREE_FRAG列表中已经被使用的page数
free list space中可用的extent对象列表,extent里面没有一个page被使用
frag free list 有可用碎叶page的extent列表,exntent里面有部分page被使用
frag full list 没有有可用page的extent列表,exntent里面全部page被使用
segment id 下一个可利用的segment id
full inode list space当前完全占满的segment inode页列表
free inode list space当前完全占满的segment inode页列表
2.2 Fseg inode Page
not full used FSEG_NOT_FULL列表中的page数
FSEG_FREE inode中空闲的extent列表
FSEG_NOT_FULL extent有部分page被占用,有部分page空闲的extent列表
FSEG_FULL 完全占满的extent的列表
FSEG_MAGIC_N 校验魔法字
fragment array 一个长度为32的零散page索引存储的数组,如果这个数据满了.主要的作用是
3.space结构图
3.1space框架关系图
3.2模块关系示意图
4.space的inode、extent和page分配流程
4.1 inode的分配流程
第2步:在申请inode时,如果FSP_SEG_INODES_FREE有可以的inode page,从inode page或的一个inode,对应函数fsp_alloc_seg_inode
第3步:如果在申请inode后,inode所处的inode page已经没有空闲的inode了,会将这个inode page放入FSP_SEG_INODE_FULL,并将其从FSP_SEG_INODES_FREE中删除。
第4步:如果inode管理的所有的页都是空闲,那么这个inode状态会被置为空闲状态,这个时候会将这个inode page从FSP_SEG_INODE_FULL移 到FSP_SEG_INODES_FREE中;这个过程只有在segment删除的时候才会调用。对应的函数fsp_free_seg_inode
4.2extent的分配流程
1: 当inode的free list为空,如果需要使用申请使用新的extent,innodb会从space free list获得空闲的extent加入到inode free list当中。
2: 当inode free list中有extent,如果申请使用新的extent,只只需要从inode free list中拿取,并将extent移到inode not full当中。
3:只是通过inode方式申请页的一个操作,这个时候extent有足够多的空闲page.
4: 当extent中没有空闲的page时,会将这个extent从inode not full中转移到inode full当中。
5: 当一个page释放时,这个page所处的extent是一个完全占用的且被inode管理的extent,那么page释放后,就会将这个extent从inode full移到inode not full
6:当一个page释放时,这个page所处的extent有且只有这一个page被占用,那么page释放后,这个extent就会归还给inode list.并且会直接进行 7将extent归还给space free list.
4.3page的分配流程
1. 指定的inode的hint位置的页是空闲状态,直接返回对应的page
2.descr是空闲状态,但segment inode中的空闲page数量 < 1/8,且碎片页被全部用完,为其分配一个extent,并获得hint对应的page
3.如果descr不是空闲状态,且segment inode中的空闲page数量 < 1/8,在inode当中获得一个空闲的extent,并且将这个extent descr对应的页返回。
4.descr是XDES_FSEG状态,且这个extent中还有空闲page,从其中获取一个page.
5.除了以上情况外,如果descr不是空闲的,但是inode还有其他的空闲extent,从其他的extent获得一个空闲。
6.如果其他的extent没有空闲页,但是fragment array还有空闲的碎片page,从空闲的碎片page中获得一个空闲页。
7.如果连碎页也没有,直接申请分配一个新的extent,并在其中获取一个空闲的page.
5.综述
MySQL系列:innodb源码分析之表空间管理相关推荐
- Mybatis源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...
- Java集合Collection源码系列-ArrayList源码分析
Java集合系列-ArrayList源码分析 文章目录 Java集合系列-ArrayList源码分析 前言 一.为什么想去分析ArrayList源码? 二.源码分析 1.宏观上分析List 2.方法汇 ...
- Linux内核源码分析—从用户空间复制数据到内核空间
Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...
- v63.04 鸿蒙内核源码分析(文件系统) | 用图书管理说文件系统 | 百篇博客分析OpenHarmony源码
司马牛忧曰:"人皆有兄弟,我独亡."子夏曰:"商闻之矣:死生有命,富贵在天.君子敬而无失,与人恭而有礼.四海之内,皆兄弟也.君子何患乎无兄弟也?" <论语 ...
- php,mysql 项目--商城--源码分析。
php项目–商城–源码分析. 此商城网站源码下载地址:https://github.com/jeremywong1992/nuomi_shop php项目---商城--源码分析 网站目录下包含六个文件 ...
- mysql page header_MySQL系列:innodb源码分析之page结构解析
page header是page的头信息,占用38个字节,分别存储以下信息: FIL_PAGE_SPACE 4字节 page所属的表 ...
- MySQL系列之源码浅析
源码才是王道. 真正的高手从来不是临场发挥,随机应变是外人看来的错觉. 1. 主函数sql/mysqld.cc中,代码如下: int main(int argc, char **argv) //标准入 ...
- [NIO系列]NIO源码分析之Buffer
在以前的一篇文章中我们介绍过IO模型 IO模型总结 http://www.cnblogs.com/coldridgeValley/p/5449758.html ,而在实际运用中多路复用IO使用很多,J ...
- View系列 :源码分析:RecyclerView滑动删除 全解析
1:效果展示 效果很简单,就是 RecycleView的 滑动删除功能 2:效果分析 主要是三个步骤: 步骤一:是RecyclerView 的每一个条目上增加 删除 View控件,这个是静态xml页面 ...
最新文章
- Java处理高并发、高负载类网站的优化方法
- 996 成福报?拼多多个别部门让员工在 “11-11-6” 和 996 中二选一
- 神策数据斩获大数据星河奖,首发用户行为分析标准
- 本地消息表实现机制讲解
- 通过 Azure Pipelines 实现持续集成之docker容器化
- 【数字信号】基于matlab GUI DTMF双音多频电话拨号仿真【含Matlab源码 805期】
- MySQL(15)-----运算符和优先级查询结果拼接处理及CONCAT()、CONCAT_WAS()和GROUP_CONCAT()函数的使用
- LINUX移植——LED驱动移植
- matplotlib 使用简明教程(三)-一些专业图表简介
- 影视观影神器:ZY Player for Mac使用教程
- 阿里小蜜:语音识别、语义分析、深度学习在手机淘宝的实战分享
- MySql实验嵌套查询_MySQL数据库实验四:嵌套查询
- 图片识别转公式,GitHub 又一 LaTeX 神器面世!
- Tc27x的MTCR与MFCR指令
- 图解RAM结构与原理,系统内存的Channel、Chip与Bank
- java ca认证_java编程方式生成CA证书
- VB6不能加载MSCOMCTL.OCX
- No qualifying bean of type found for dependency: expected at least 1 bean which qualifies as autowir
- 论文解读9——TabNet: Attentive Interpretable Tabular Learning
- Unsupported Personality :UNKNOWN