ext2在内存中的数据结构

内存中的数据结构

 

linux将文件系统的一部分磁盘数据结构保存在内存中,提高访问速度。

实现中设计两个数据结构:ext2_sb_infoext2_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_blocklast_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结构之间不会重叠。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值