内存中的数据结构
linux将文件系统的一部分磁盘数据结构保存在内存中,提高访问速度。
实现中设计两个数据结构:ext2_sb_info和ext2_inode_info。
当ext2文件系统被安装时,用类型为ext2_sb_info的结构装入VFS超级块的s_fs_info字段,以便内核能找到与这个文件系统相关的内容。
Struct super_block{
……
Void *s_fs_info;//文件系统相关信息,用ext2_sb_info赋值
……
}
当属于ext2文件的索引节点对象被初始化时,用ext2_inode_info类型的结构装载inode结构体的i_private字段。
Struct inode{
……
Void *i_private;//文件系统相关信息,用ext2_inode_info赋值
……
}
预分配(块预留机制)
在磁盘上组织文件时,我们想将文件的数据尽可能存放在连续的磁盘块上,这样读写文件时,因为磁头移动的距离比较短,故速度会有很大提高。
块预留机制的核心思想是文件系统应该提前考虑如果文件增长,可以从哪块空间分配磁盘块,并将这些磁盘块预留。采用这种方法,当文件增长时,会在磁盘的合适位置有空闲磁盘块供使用。
为了达到这个目的,ext2块分配器被改为基于预留机制了。当一个文件第一次需要分配一个新块时,文件系统为它创建一个预留窗口,该窗口中保留了一些磁盘块(初始值为8个),然后从预留窗口中分配磁盘块。当预留窗口中的块用完时,尽量会在旧的预留窗口周围创建一个扩展的预留窗口,以代替旧的预留窗口。预留窗口会持续到写文件的进程关闭文件,然后,这些预留块又重新变为空闲块。
相关数据结构
1.预留窗口
structext2_reserve_window {
ext2_fsblk_t _rsv_start; /*第一个预留的字节 */
ext2_fsblk_t _rsv_end; /*最后一个预留的字节,或为0 */
};
该结构定义了一个预留区间:[_rsv_start,_rsv_end]。
2.预留窗口节点
structext2_reserve_window_node {
structrb_node rsv_node;
__u32 rsv_goal_size;
__u32 rsv_alloc_hit;
structext2_reserve_window rsv_window;
};
该结构体将用于组织红黑树的数据结构rsv_node和预留窗口封装在一起。预留块信息管理在一个红黑树中,通过rsv_node组织。
rsv_goal_size给出了预留窗口的预期长度;rsv_alloc_hit跟踪预分配的命中数,即多少次分配是在预留窗口中进行的。
3.块分配信息
structext2_block_alloc_info {
structext2_reserve_window_node rsv_window_node;
__u32 last_alloc_logical_block;
ext2_fsblk_t last_alloc_physical_block;
};
对上述预留窗口节点的又一次封装,描述了一个inode的预留窗口。与inode一一对应。
last_alloc_logical_block和last_alloc_physical_block分别表示上一次分配的逻辑磁盘块号和物理磁盘块号。
4.inode信息
structext2_inode_info {
……
structext2_block_alloc_info *i_block_alloc_info;
……
}
这个结构是根据磁盘上的inode信息建立起来的,每个文件一个。
5.超级块信息
struct ext2_sb_info{
spinlock_ts_rsv_window_lock;
structrb_root s_rsv_window_root;
structext2_reserve_window_node s_rsv_window_head;
};
这个结构是根据磁盘中的超级块在内存中建立起来的,每个文件系统一个。其中s_rsv_window_root就是红黑树的根节点,s_rsv_window_head就是包含红黑树的根节点的struct ext2_reserve_window_node。
以上数据结构间的关系如下图所示:
- 一个文件系统对应一个ext2_sb_info结构,一个ext2_sb_info结构指向一棵红黑树。
- 每个文件inode对应一个ext2_inode_info结构,每个ext2_inode_info结构拥有一个ext2_block_alloc_info结构。
- 每个ext2_block_alloc_info结构包含一个ext2_reserve_window_node结构。
- 每个ext2_reserve_window_node结构包含一个rb_node结构和一个ext2_reserve_window结构。
- rb_node结构用于组成一个树状结构。
- 每个ext2_reserve_window结构描述一个区间,并且多个ext2_reserve_window结构之间不会重叠。