文件系统实现中的基本概念

3

我对文件系统实现不太清楚。特别是(《操作系统》- Tannenbaum(第3版),第275页)中指出:“每个块的第一个字用作指向下一个块的指针。块的其余部分是数据。”

请问有人能解释一下这里的层次结构吗?比如,每个磁盘分区包含块,块包含字等等...

3个回答

4

我手头没有这本书,但我怀疑引用的那句话并不是在谈论文件、目录或其他文件系统结构。(请注意,分区通常不是文件系统概念。)我认为你引用的那句话只是在指出一些关于存储在磁盘块中的数据结构如何链接在一起的事情。它的意思就是字面上的意思。每个块(通常是4k,但也可能只有512B)大致看起来像这样:

+------------------+------------- . . . . --------------+
| next blk pointer | another 4k - 4 or 8 bytes of stuff |
+------------------+------------- . . . . --------------+

下一个块指针后的内容取决于存储在该特定块中的内容。从给定的句子中,我无法确定代码如何找出这一点。
关于文件系统结构:
- 磁盘是一组扇区,几乎总是512B大小的数组。在内部,磁盘由盘片构成,每个盘片被分成许多同心圆轨道。但是,ATA或SCSI磁盘接口硬件完全隐藏了这些细节。 - 操作系统将扇区数组划分为分区。分区是连续的扇区范围,分区不重叠。(实际上,在某些操作系统上允许这样做,但思考起来很混乱。) - 因此,分区也是一组扇区。
到目前为止,文件系统并没有真正涉及。大多数文件系统都是在分区内构建的。文件系统通常具有以下概念。(我使用的名称来自unix传统,但其他操作系统将具有类似的想法。)
- 在分区的某个固定位置是超级块。超级块是所有文件系统数据结构的根,包含足够的信息指向所有其他实体。(实际上,通常在分区上散布着多个超级块作为简单的容错形式。) - 文件系统的基本概念是inode,发音为“eye-node”。Inode代表构成文件系统的各种对象,其中最重要的是普通文件和目录。Inode可能是自己的块,但某些文件系统将多个inode打包到单个块中。Inode可以指向一组数据块,这些数据块组成文件或目录的实际内容。如何在磁盘上组织和索引文件的数据块是文件系统的关键任务之一。对于目录,数据块保存有关目录中包含的文件和子目录的信息,对于普通文件,数据块保存文件的内容。 - 数据块是分区上大部分块的主体。一些被分配给各种inode(即目录和文件),而其他的则是空闲的。另一个关键的文件系统任务是在写入文件时分配空闲的数据块,并在截断或删除时从文件中释放数据块。

在所有这些概念中,有很多变化,我相信有一些文件系统与我上面所说的不太符合现实。但是,通过上述内容,您应该能够推断出文件系统如何完成其工作,并且至少能够理解任何特定文件系统中遇到的差异。


并非所有的文件系统都使用索引节点(inode)。这基本上是Unix类似系统所特有的。许多文件系统根本没有这种机制。(例如古老的FAT文件系统。) - JUST MY correct OPINION
我使用Unix术语,因为那是我最熟悉的。然而,我认为即使是FAT也必须在表示给定文件的分区上有一些位置,并以某种方式指向其内容:无论FAT称其为什么,都类似于“inode”。 - Dale Hagglund

3
我不知道这句话的上下文,但它似乎在描述一个块链表。一般来说,“块”是少量字节(通常是2的幂次方)。它可能是4096个字节,也可能是512个字节,这取决于情况。硬盘设计为一次检索一个块的数据;如果您想获得第1234567个字节,您必须获取它所在的整个块。一个“字”要小得多,指的是单个数字。它可能低至2个字节(16位),也可能高达8个字节(64位);同样,这取决于文件系统。
当然,块和单词并不是文件系统的全部。文件系统通常实现某种B-tree来使查找快速(它不必搜索整个文件系统以查找文件,只需沿着树向下走)。在文件系统B-tree中,每个节点都存储在一个块中。许多文件系统使用B-tree的变体称为B+-tree,它使用链接将叶子连接在一起以加快遍历速度。此处描述的结构可能描述了B+-tree的叶子,也可能描述用于存储单个大文件的块链。
总之,磁盘就像一个巨大的字节数组,可以分解为单词,通常为2-8个字节,以及块,通常为512-4096个字节。还有其他的分解方式,例如磁头、柱面、扇区等。在这些基本元素之上,实现了更高级别的索引结构。通过理解文件系统开发人员需要满足的约束条件(通过一次存储/检索块来有效地模拟文件树),文件系统设计应该相当直观。

我真的很喜欢你的回答。它用最简单的语言解释了问题!!谢谢。 - name_masked

1

磁道 >> >> 扇区 >> >> 字节 >> 半字节 >>

磁道 是从磁盘盘片的内部到外部的同心圆。

每个磁道都被分成称为扇区的切片。

是一组扇区(1、2、4、8、16等)。驱动器越大,块可以容纳的扇区就越多。

是CPU可以一次处理的位数(16位、32位、64位等),在您的示例中,存储下一个块的地址(或偏移量)。

字节 包含半字节。1字节=2半字节;1半字节=4位。


很抱歉,其中一些内容并不完全正确。轨道确实如您所描述的那样,但它们几乎完全被现代磁盘驱动器隐藏:我不知道最近的文件系统是否使用它们。在文件系统的上下文中,块几乎总是空间分配的基本单位,4kB和8kB是传统的大小。块不会随着磁盘变大而容纳更多扇区,磁盘只会容纳更多块。最后,字节不包含单词。单词始终是多个字节。“单词”本身通常表示4或8个字节。 - Dale Hagglund
我只是为其他词汇提供背景。轨道被从文件系统中抽象出来并不意味着它们不存在。 - Dolph
1
还有,我是在“word”指的是2个字节时学到这些东西的,非常感谢。我们不需要你那些花里胡哨的8字节单词! - Dolph
我和戴尔在一起。轨道是低级概念,如硬盘的柱面、盘片和磁头,这些都是特定于硬盘的物理实现。SSD(闪存驱动器)没有这些东西。 - Gabe
足够真实,尽管我记得,是新兴的x86架构从S/360大型机中窃取了“word”这个词,而它已经愉快地被用来表示四个字节。虽然这不是我的问题,但你在说块随着磁盘变大而变大的陈述是错误的。你可以这样定义块,但我所知道的文件系统都没有这样做。 - Dale Hagglund
当地址空间成为限制时,利用更大的存储设备的唯一方法是增加每个块的大小。我认为这在今天不是问题,但过去曾经是问题,并且将来会再次成为问题。 - Dolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接