MySQL内核:innodb动态数组内部实现
2008-12-03 11:15:15 来源:WEB开发网图1表示的是只有一个节点时的情况,当节点分裂时的变化,见图2。
通过图2,并集合前面的代码,我们可以发现,从第一个节点,变为两个节点的时候,首节点先把自己挂到base链表中,并分配一个新的节点,挂在base的最后一个节点。链表中的节点通过list进行互连。同样,如果还需要再增加一个节点,那么就在base链表的结尾再增加一个。因为是新增节点,所以设置该节点的used值为0。
我们在关注一下这一行代码:
block->used = block->used | DYN_BLOCK_FULL_FLAG;
从这一行代码,我们可以猜想一下该行代码的含义:
a) FULL表明该节点已经完全使用完,不可以再使用其中的空间。所以,链表只有最后一个节点才是可以使用的。每增加一个节点,总要设置前面一个节点的DYN_BLOCK_FULL_FLAG。
b) 每个块,data数组的预设值是DYN_ARRAY_DATA_SIZE(值为512),
#define DYN_BLOCK_FULL_FLAG 0x1000000UL
所以,use的值小于等于512,那么该节点为尾节点。因为非尾节点的值肯定大于512,它与DYN_BLOCK_FULL_FLAG进行了或操作。
2)used
used表示data[DYN_ARRAY_DATA_SIZE]字段中已经使用的字节的数量,假设需要申请len字节的长度,在使用之前需要判断的是,尾 block中的可用空间是否够用。也就是判断判断下used+len是否满足used+len<= DYN_ARRAY_DATA_SIZE,如果满足就可以放进该block,并将已使用的字节数used加上len。
如果,该block空间不够,那么就会申请一个新的block,这里我们就可以明白了,为什么需要满足len的长度小于等于DYN_ARRAY_DATA_SIZE。
更多精彩
赞助商链接