操作系统真象还原:文件系统概述

14.1 文件系统概念简介

这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件

14.1.1 inode、间接块索引表、文件控制块FCB简介

硬盘是低速设备,其读写单位是扇区,为了避免频繁访问硬盘,操作系统不会有了一扇区数据就去读写一次磁盘,往往等数据积攒到“足够大小”时才一次性访问硬盘,这足够大小的数据就是,硬盘读写单位是扇区,因此一个块是由多个扇区组成的,块大小是扇区大小的整数倍。

块是文件系统的读写单位,因此文件至少要占据一个块,当文件体积大于1个块时,文件肯定被拆分成多个块来存储,那么问题来了,这多个块该如何组织到一起? 其所有的块被用于链式结构来组织,在每个块的最后存储下一个块的地址,从而块与块之间串联到一起,这样一来,文件可以不连续存储,文件中的块可以分布在各个零散的空间中,有效地利用了存储空间,或者说是提升了磁盘的利用率,相当于节省了空间。
在这里插入图片描述

但通过链式结构来组织文件的弊端是当访问文件中的某个块时,必须要从头开始遍历块结点,比如要访问文件 A 的第 3 个块(块5 ),需要先访问第 1个块(块 3 ),获得第 2 块的地址 (块6 ),再从第 2 块中获取第 3 块(块们的地址,软件上算法效率低下,而且每访问一个结点,就要涉及一次硬盘寻道,使得对原本低速的设备访问更加频繁了。

下面讨论下另 一种文件组织形式, UINX 操作系统中的索引结构一一inode,它将文件以索引结构来组织,避免了访问某一数据块需要从头把其前所有数据块再遍历一次的缺点。采用索引结构的文件系统,文件中的块依然可以分散到不连续的零散空间中,保留了磁盘高利用率的优点,更重要的是文件系统为每个文件的所有块建立了一个索引表,索引表就是块地址数组,每个数组元素就是块的地址,数组元素下标是文件块的索引,第 n 个数组元素指向文件中的第 n 个块,这样访问任意一个块的时候,只要从索引表表中获得块地址就可以了,速度大大提升。包含此索引表的索引结构称为inode,即index inode,索引结点,用来索引、跟踪一个文件的所有块。

强调下, inode 是文件索引结构组织形式的具体体现,必须为每个文件者单独分配备一个这样的元信息数据结构,因此在UINX 文件系统中,一个文件必须对应一个inode,磁盘中有多少文件就有多少 inode。
在这里插入图片描述

每个索引表中共 15 个索引项,暂时称此索引表为老索引表。老索引表中前 12 个索引项是文件的前 12 个块的地址,它们是文件的直接块,即可直接获得地址的块。若文件大于 12 个块,那就再建立个新的块索引表,新索引表称为一级间接块索引表,表中可容纳 256 个块的地址,各表项都是块的地址,这 256 个块地址需要通过一级间接块索引表才能获得,因此称为“间接块”,这也是一级间接块索引表中包含“间接”二字的原因。此表也要占用一个物理块来存储,该物理块的地址存储到老索引表的第 13 个索引项中。有了一级间接块索引表,文件最大可达 12+256=268 个块

文件系统为实现文件管理方案,必然会创造出一些辅助管理的数据结构,只要用于管理、控制文件相关信息的数据结构都被称为 FCB (File Contd Block),即文件控制块, inode 也是这种结构,因此 inode是 FCB 的一种。

inode 的数量等于文件的数量,为方便管理,分区中所有文件的 inode 通过一个大表格来维护,此表格称为 inode_table,在计算机中表格都可以用数组来表示,因此 inode_table 本质上就是 inode 数组,数组元素的下标便是文件 inode 的编号

文件的数量间接决定了分区空间的利用率,说“间接”的原因是文件可大可小,每个文件大小不一 ,比如对于大小分别为 I0KB 和 I0GB 的文件,同一个 16GB 大小的分区可分别容纳的文件数必然相差甚远。因此一个分区的利用率分为 inode 的利用率和磁盘空间利用率两种.

14.1.2 目录项与目录简介

无论文件在哪个路径,它肯定要位于某个目录中(至少要有个根目录‘/’),因此文件名应该存储在和目录相关的地方,这就引出了另外一个概念一一目录。

在 Linux 中,目录和文件都用 inode 来表示,因此目录也是文件,只是目录是包含文件的文件 。 为了表述清楚这两种文件,我们这里称目录为目录文件, 一般意义上的文件称为普通文件 。 因此区分该 inode 是普通文件,还是目录文件,唯一的地方只能是数据块本身的内容了,如您所料,它们必须是不同的。如果该 inode 表示的是普通文件,此 inode 指向的数据块中的内容应该是普通文件自己的数据。如果该 inode表示的是目录文件,此 inode 指向的数据块中的内容应该是该目录下的目录项
在这里插入图片描述

目录项中包含文件名、 inode 编号和文件类型,它们三个的作用有两个,一是标识此 inode 表示的文件是目录,还是普通文件,也就是 inode 所指向数据块中的内容是什么 。二是将文件名与 inode 做个绑定关联,这样用户便可以通过文件名来找到文件的实体数据。

有了目录项后,通过文件名找文件实体数据块的流程是 。

  1. 在目录中找到文件名所在的目录项 。
  2. 从目录项中获取 inode 编号 。
  3. 用 inode 编号作为 inode 数组的索引下标,找到 inode。
  4. 从该 inode 中获取数据块的地址,读取数据块 。

只要用于管理文件相关信息的数据结构都可称为文件控制块,因此目录项也是。创建文件的本质是创建了文件的文件控制块,即目录项和 inode。

总结:

在这里插入图片描述

14.1.3 超级块与文件系统布局

超级块是保存文件系统元信息的元信息

咱们所讨论出来的内容己经足够实现一个简单的文件系统了,总结一下它们有: inode 数组的地址及大小、 inode 位图地址及大小、根目录的地址和大小、空闲块位图的地址和大小, 以上这几类信息要在超级块中保存。

在这里插入图片描述

超级块是文件系统元信息的“配置文件”,它是在为分区创建文件系统时创建的,所有有关文件系统元信息的配置都在超级块中,因此超级块的位置和大小不能再被“配置”了,必须是固定的,它被固定存储在各分区的第 2 个扇区,通常是占用一个扇区的大小,具体大小与实际文件系统类型为准。

对文件系统来说,该有的数据都有了,下面该讨论下它们在磁盘上的布局了

在这里插入图片描述

总结:

  1. inode

    • inode记录了文件与磁盘位置的映射。

    • 每个文件对应一个inode。当我们找到了这个文件对应的inode,就能知道这个文件在磁盘中的存储位置。

    • 每个磁盘分区的所有inode都会形成一个数组。使用文件的inode数组下标,我们可以在该数组中查找对应的inode信息。

  2. 目录

    • 一个目录其实也是一个特殊的文件。

    • 目录由众多目录项构成,目录项记录了文件名到inode的映射。如果一个目录管理/Desktop文件夹,那么这个目录下的众多目录项就是管理/Desktop文件夹下的各个文件和子目录。

  3. 超级块

    • 超级块包含了关于inode、目录及其他文件系统元数据的信息。

    • 通常,它位于每个磁盘分区的第二个扇区,这是一个固定位置。

    • 对于inode,它记录了inode数组在磁盘中的起始位置;对于根目录,超级块还会记录其inode标号。

  • 38
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值