磁盘存储文件的底层设计探究

文件 = 文件内容 + 文件属性

那么文件在磁盘中是如何存储这些数据的呢?


目录

一、磁盘分区

二、数据管理

1、Data Block —— 放文件内容

2、inode Table —— 放文件属性

(1) inode Table 结构

 (2) inode 和 block之间的关系

 3、inode Bitmap —— 告诉OS哪些inode是没有被占用的

4、Block Bitmap —— 告诉OS 哪些block是没有被使用的

5、Group Descriptor Table —— 当前组的相关信息(如组的使用情况)

6、Super Block —— 当前分区的相关信息

三、目录是文件吗??

三、磁盘文件或者目录的增删改查原理

1、增加文件

2、删除文件

3、修改/查询文件内容


一、磁盘分区

现实中的磁盘是这样的

但是站在计算机的角度,磁盘是一个线性结构,假设有1024GB

但是这么大一段空间,管理起来不是特别方便,我们一般会对这块区域分区,也就是我们电脑上的C盘、D盘等各种盘

——》我们对磁盘的管理就变成了 对C、D、E、F四个区的管理

 以E盘为例,200GB依然很难管理,所以需要继续分块,所以我们要继续对E盘划分多个小区域

——》我们对各个区的管理变成了对 Block group的管理

Boot Block:与开机启动相关的块,每个分区都有至少一个启动块,启动时告诉操作系统,磁盘分了多少个区、每个区的起始位置等,每个区都设置启动块的目的是为了备份

二、数据管理

现在我们知道,对一个磁盘的额管理其实就是对 Block group的管理

那么我们要怎么向这个Block group存入数据呢?

——》我们需要继续对Block group分块,不同的模块具有不同的功能

我们先对最后四个模块说明,最后我们再说明前面两个模块Super Block、Group Descriptor Table

1、Data Block —— 放文件内容

存放文件数据 或者 文件名和inode编号的映射关系

 Data Block中包含多个小块,我们称之为block,每个block会存一定大小的数据,并分配对应的编号,便于OS查找

 注意:并不是一个block就对应一个文件,如果一个文件比较大,那就可能需要多个block

2、inode Table —— 放文件属性

(1) inode Table 结构

存放文件属性以及Data block中 block的编号

inode Table同样分为多个小块,每一个小块我们称之为inode,每个inode都有自己的编号,

可以认为一个 inode对应着一个文件或者目录

 为了方便理解,我们可以把每一个inode想象成一个存放数据的结构体

struct inode
{
    //文件大小、文件权限等文件属性数据

    int inode_number;    //inode编号  
}

 (2) inode 和 block之间的关系

我们知道inode就可以看作是一个文件,其中存放着inode编号和属性数据

但是要怎么通过inode找到对应的 文件数据呢??

inode 除了包含文件属性信息外,还包含 block的编号

struct inode
{
    //文件大小、文件权限等文件属性数据

    int inode_number;    //inode编号  
    int blocks[32];      //存放 block编号,即当前文件的数据
}

 数组大小并不一定是 32 个,方便了解即可

这样的话,我们只要找到inode,就能找到对应的文件数据块

 3、inode Bitmap —— 告诉OS哪些inode是没有被占用的

我们要存文件属性的时候,肯定是优先使用没有被占用的 inode 

莫非我们要遍历所有的 inode,然后再存吗??这样未免太耗时间了,这里就用到了位图

比如 0000 0101

我们使用0、1表示某一个位置上的 inode是否被占用

相比于逐个查询inode,位操作的遍历会相对快很多

所以inode Bitmap描述的是 inode Table中 inode 的使用情况

4、Block Bitmap —— 告诉OS 哪些block是没有被使用的

知道了 inode bitmap的作用,不难猜出 Block Bitmap的作用

Block Bitmap 描述的是 Data Block 中 block的使用情况

5、Group Descriptor Table —— 当前组的相关信息(如组的使用情况)

描述的是当前组的相关信息,如当前组的编号、当前组中inode或者block的使用情况

6、Super Block —— 当前分区的相关信息

每个group都会存在 super block(目的是备份),描述的是整个分区的相关信息,比如当前区的inode使用了多少,block还剩多少

假设当前区是E盘,super block描述的就是 E盘的使用情况及相关文件信息

三、目录是文件吗??

答案是肯定的,目录也有自己 inode,也有属性信息

 但是目录的inode 指向的 block包含了什么??

——》放的是 文件名和inode编号的映射

因为用户层使用的是 文件名,但是OS不认识文件名,所以需要通过某种映射将文件名转化为 inode编号

三、磁盘文件或者目录的增删改查原理

了解了上述的知识以后,现在我们就可以解释 文件的增删改查 是如何实现的了

1、增加文件

touch log.txt

增加文件那就得考虑,新增的文件放在哪??

inode bitmap帮我们解决了这个问题,bitmap通过位操作快速找到没有被占用的inode,然后我们就可以使用这个inode来存放文件属性

同理我们要增加文件内容时,先去Block Bitmap看看哪些block没有被占用,然后把数据放到没有被使用的block中,同时inode记录下 block的编号

2、删除文件

删除文件无需找到对应的inode

首先需要找到当前目录的inode ——》 查看block中的映射,看看要删除的inode的编号是什么

——》然后在inode Bitmap中的对应位置,把 1 改为 0 

 为什么不释放对应的inode呢,因为有可能短时间内我们需要恢复原本的文件?

等到下一次创建文件的时候,这个位置上的inode 就会被新的文件属性覆盖

3、修改/查询文件内容

涉及文件的增加和删除时,就需要先去 inode bitmap和 Block Bitmap中查看inode 和block的占用情况,然后再分配

若是查询文件内容,就无需这么做了

首先需要找到当前目录的inode ——》 然后根据 block中的映射关系找到要查询文件的inode编号

——》找到对应的文件inode ——》 找到这个文件存放数据的块 ——》读取里面的数据

若是修改文件内容,

如果文件不为空,参考查询文件的方式i

如果文件为空,参考 上面"增加文件"部分的内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值