高级OS(九) - 文件系统设计之数据结构

一.题目

VPS中有很多数据结构,看起来很复杂,实际上从设计的角度进行梳理,搞清楚为什么要设计这些数据结构实际上就可以让这些数据结构融入到自己的思维中,结合教材P215 图8.6,并调试例8-1,截图,同时参考http://news.eeworld.com.cn/mp/ymc/a71974.jspx(300来行代码带你实现一个能跑的最小Linux文件系统),结合上次的2个实验,请回答下列问题(不局限于这些问题),自己提出2个问题并回答,自己提问并回答在评论区:

  1. mount机制与超级块是什么关系,与文件系统的类型又是什么关系?
  2. inode是如何分配的?磁盘inode和内存inode有什么区别?
  3. 有了inode,为什么还要dentry? 如果没有denrty,会出现什么情况?
  4. files_struct结构和file结构是什么关系,如果没有file结构是否可以?
  5. 为什么要有一个fs_strcut结构?

二.解答

实验:

查看super_blocks变量的地址,为ffffffffbb9e84f0。
在这里插入图片描述
查看sb_lock变量的地址,为ffffffffbc036098。
在这里插入图片描述
make + insmod + lsmod
在这里插入图片描述
dmesg
在这里插入图片描述

1.mount机制与超级块是什么关系,与文件系统的类型又是什么关系?

将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使他们成为一个整体,称为”mount(安装)”,linux内核采用VFS框架来组织文件系统,每个文件系统用一个超级块(super_block)数据结构来描述,每个注册的文件系统,对应着相应的超级块对象。

若两个都为xfs文件系统,则xfs的file_system_type的fs_supers把两个同为xfs文件系统的super_block串连在自己下面。另一个minix文件系统没挂载使用,所以没他的super_block信息被读入内存。一个文件系统对应一个super_block,所以同一个文件系统当然只有一个super_block。但是因为挂载了两次,所有每一次挂载对应一个挂载实例struct mount,也就是有两个mount实例。
在这里插入图片描述

2.inode是如何分配的?磁盘inode和内存inode有什么区别?

linux文件系统使用索引节点来记录文件信息,系统给每个索引节点分配一个号码。Linux采用一种叫做Orlov allocator的算法来负责选择inode的位置。在linux中,文件的内容和属性是分离的,inode用来保存文件属性的结构。通常情况,一个文件一个inode,一个inode号。操作任何一个文件都是在特定目录下查找的,目录也是文件,所以目录里存放的是目录下所有文件的文件名和inode的映射关系。尽可能使得一个文件的数据和其inode在相同的块组中,这种方法减少了data寻址耗时,特别是刚刚读取inode后就访问数据这种场景。
在这里插入图片描述
区别
内存中的inode: VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。磁盘上的inode:EXT2通过使用inode来定义文件系统的结构以及描述系统中每个文件的管理信息,每个文件都有一个inode且只有一个,即使文件中没有数据,其索引结点也是存在的。
位置:VFS inode结构位于内存中,而Ext2_inode位于磁盘。

生存期:VFS inode在需要时才会被建立,如果系统断电,此结构也随之消失。而Ext2_inode的存在与系统是否上电无关,而且无论文件是否包含数据,Ext2_inode都是存在的。

唯一性:两者在自己的作用域中都是唯一的。

关系:VFS inode是Ext2 inode的抽象、映射与扩充,而后者是前者的静态信息部分,也是对前者的具体化、实例化和持久化。

操作:对VFS inode的操作具有通用性,对文件系统inode的操作则是文件系统相关的,依赖于特定的实现。

组织管理:系统通过VFS inode链表来对其进行组织,并且为了提高访问效率相应地构造了inode构造缓存和hash table。
Ext2 inode的信息位于EXT2文件系统的划分的块组中,在每个块组中包含相应的inode位图、inode表指定具体的inode信息,每个inode对应Ext2_inode结构。

3.有了inode,为什么还要dentry? 如果没有denrty,会出现什么情况?

所谓"文件", 就是按一定的形式存储在介质上的信息,所以一个文件其实包含了两方面的信息,一是存储的数据本身,二是有关该文件的组织和管理的信息。内存中,每个文件都有dentry(目录项)和inode(索引节点)结构,dentry记录着文件名,上级目录等信息,正是它形成了我们所看到的树状结构;该文件的组织和管理的信息主要存放inode里面,它记录着文件在存储介质上的位置与分布。
因为有可能一个文件有好几个文件名,所以有inode,还要有dentry,dentry与inode是多对一的关系。
如果没有dentry可能会出现的情况是,根据inode找到了文件位置,但不知道其文件名、上级目录等信息。

4. files_struct结构和file结构是什么关系,如果没有file结构是否可以?

如图,file字段指向files_struct结构体,这个结构体是用来记录该进程打开的所有文件的信息;每个打开的文件都会为它建立一个file(图中的files错误)结构体;files_struct结构体中,用fd_array[]数组字段,维护着所有指向file结构体的指针;而每个被打开的file也有其所在目录f_entry; 所有的operations都是对应目录或是inode或是文件的操作方法。
在这里插入图片描述
没有file结构的话就无法记录文件和进程交互的信息以及一些文件操作,将file对象f_op指向了所属文件系统的操作函数集file_operations,而该函数集又来自具体文件的inode,于是虚拟文件系统就与实际文件系统的操作就衔接起来了。

5.为什么要有一个fs_strcut结构?

如上图,fs字段指向fs_struct结构体,是用来记录这个进程的工作目录pwd,和它的根目录root, 每个进程都有自己的根目录和当前工作目录,fs_struct来记录这些信息。显然目录信息是由dentry结构体保存的;在linux中,目录也是一种文件,因此dentry结构体会有指向inode结构体的指针字段d_inode。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据表结构说明 4 1、基础字典 4 1.1设备分类字典sb_zd_class 4 1.2折旧方法字典sb_zd_depreciation(暂时没用到) 4 1.3折旧率字典sb_zd_depreciation_rate 4 1.4折旧类型字典sb_zd_depreciation_type 5 1.5设备名称字典sb_zd_equipname 5 1.6设备入出库类型字典sb_zd_in_out_type 5 1.7 设备库帐号字典sb_zd_kzh 6 1.8设备维修单位字典sb_zd_maintenance_unit 6 1.9设备制造厂商字典sb_zd_manufacture 6 1.10设备计量单位类型字典 sb_zd_measure_type 7 1.11设备计量单位字典 sb_zd_measurer 7 1.12设备调配原因字典sb_zd_move_cause 8 1.13设备状态字典sb_zd_state 8 1.14设备供应商字典 sb_zd_supplyer 8 1.15设备单位字典sb_zd_unit 9 1.16设备用途字典sb_zd_usage 9 1.17设备维修类型sb_zd_maintenance_kind 9 1.18设备内部帐号字典sb_zd_inner_acct_no 9 2、业务数据表 10 2.1设备现有附件表sb_appendix 10 2.2设备附件使用表sb_appendix_use 11 2.3设备成本效益信息表sb_cost_benefit 11 2.4设备折旧变更记录表sb_depreciation_alter_record 12 2.5设备折旧记录表sb_depreciation_record 12 2.6设备进口说明表sb_import_comment 12 2.7设备贷款记录表sb_in_credit(暂时没用到) 13 2.8设备购进明细表sb_in_detl 13 2.9主设备表sb_main_equipment 14 2.10设备维修计划单sb_maintenance_plan(暂时没用到) 15 2.11设备维修记录sb_maintenance_record 15 2.12设备计量记录sb_measure_record 16 2.13设备调配明细sb_move_detl 16 2.14设备付款明细sb_pay_detl 17 2.15设备服务计划sb_service_plan(暂时没用到) 17 2.16设备服务记录sb_service_record(暂时没用到) 18 2.17设备增值表sb_value_increment 18 2.18设备销减表sb_waste 19 2.19设备月结信息sb_report 19 2.20设备配置表sb_config 20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值