前面我们说了段的结构,分了方便段管理区,段又分为inode entry链表来管理,分了方便管理区,区分为xdes entry链表来管理。
前面我们说了第一组extent0的第一个页面FSP_HDR的组成部分,下面主要介绍他的file space header和 xdes entry。
File Space Header部分
从名字可以看出,这部分组要存储表空间的一些整体属性:
space_id:4个字节,表空间id。
not used:4个字节,这四个字节未被使用,可以忽略。
size:4个字节,当前表空间占有的页面数。
free_limit:4个字节,尚未被初始化的最小页号,大于或等于这个页号的区对应的xdes entry结构 都没有被加入free链表。
space flags:4个字节,表空间一些占用存储空间比较小的属性。
frag_n_used:4个字节,free_frag链表中已使用的页面数量。
List Base Node for free List:16个字节,free链表的基节点。
List Base Node for free_frag list:16个字节,free frag链表的基节点。
List Base Node for full_frag list:16个字节,full frag 链表的基节点。
Next unused segment id:8个子节,当前表空间下一个未使用的segment id。
List base node for seg_inodes_full list:16个字节,seg_inodes_full链表的基节点。
List base node for seg_inodes_free list:16个字节,seg_inodes_free 链表的基节点。
这里的space_id肯定就是表空间的唯一主键,not used就是未使用的,size代表当前表空间有多少页面。
List base node for free List 和 List Base Node for free_frag list 和 List Base Node for full_frag list都属于表空间直管的链表基节点,都在表空间的第一个页面,也就是FSP HDR页面,方便之后定位这几个链表。
Free_limit:中心思想就是啥时候用到,啥时候初始化,因为我们磁盘上的结构,目录名称文件名称都是和表建立时候同名的,但是每次建立就申请空间这样开销很大,所以我们直接一次申请很大一部分,这样再磁盘上就有很多空闲的空间,这些就放在表空间直管的free链表中,啥时候用到啥时候就把需要用的初始化,于是这个字段前面的就是代表未初始化的,这个字段后面的就代表已经初始化可以使用的。
Next unused segments id:表中每个索引都会生成两个段,当我们创建一个索引的时候,就意味着创建两个段,新段这个唯一id怎么来的呢,总之不是遍历以前的段,这样太耗费性能,这个字段就是记录最大段id,当生成新id直接用最大id的下一个id就好了。
Seg_inodes_full list 和 seg_inodes_free list:seg_inodes_full表示当前段里的链表中已经没有剩余空间存放inode entry了,seg_inodes_free表示还有剩余空间存放inode entry的链表。
XDES Entry 部分
前面我们已经详细介绍过xdes entry的结构 ,全程是extent descritor entry,这个部分就在表空间的第一个页中保存着。Extent0 和extent1的意思其实就是xdes entry0 和xdes entry1,我们把256个区分为一组,在每个组的第一个页存放着xdes entry部分。这样我们每个组的extent entry结构都是固定的,所以这里直接访问就很简单。