文件系统实现中的基本概念
Posted
技术标签:
【中文标题】文件系统实现中的基本概念【英文标题】:Basic concepts in file system implementation 【发布时间】:2011-02-14 16:50:45 【问题描述】:我不清楚文件系统的实现。具体而言(操作系统 - Tannenbaum(第 3 版),第 275 页)指出“每个块的第一个字用作指向下一个字的指针。块的其余部分是数据”。
谁能在这里向我解释一下部门的层次结构?就像,每个磁盘分区都包含块,块包含单词?等等……
【问题讨论】:
【参考方案1】:我面前没有这本书,但我怀疑引用的句子并不是真正在谈论文件、目录或其他文件系统结构。 (请注意,分区通常不是文件系统概念)。我认为您引用的句子实际上只是指出了有关存储在磁盘块中的数据结构如何链接在一起的内容。它的意思就是它所说的。每个块(通常为 4k,但可能只有 512B)看起来非常粗略如下:
+------------------+------------- . . . . --------------+
| next blk pointer | another 4k - 4 or 8 bytes of stuff |
+------------------+------------- . . . . --------------+
下一个块指针之后的内容取决于该特定块中存储的内容。仅从给出的句子中,我无法判断代码是如何计算出来的。
关于文件系统结构:
disk 是 sectors 的数组,大小几乎总是 512B。在内部,磁盘由盘片构成,它们是被锈迹覆盖的旋转盘状物体,每个盘片被分成许多同心的轨道。但是,ATA 或 SCSI 磁盘接口硬件对操作系统完全隐藏了这些细节。 操作系统将 sectors 数组划分为 partitions。分区是连续的扇区范围,分区不重叠。 (事实上,这在某些操作系统上是允许的,但想想就令人困惑。) 因此,partition 也是 sectors 的数组。到目前为止,文件系统还没有真正出现。大多数文件系统都构建在一个分区内。文件系统通常有以下几个概念。 (我使用的名称是来自 unix 传统的名称,但其他操作系统也会有类似的想法。)
在分区的某个固定位置是超级块。超级块是所有文件系统数据结构的根,包含足够的信息来指向所有其他实体。 (事实上,作为一种简单的容错形式,通常有多个超级块分散在分区中。)
文件系统的基本概念是inode,即“eye-node”。索引节点代表构成文件系统的各种类型的对象,最重要的是普通文件和目录。一个 inode 可能是它自己的块,但某些文件系统将多个 inode 打包到一个块中。索引节点可以指向一组构成文件或目录实际内容的数据块。如何在磁盘上组织和索引文件的数据块是文件系统的关键任务之一。对于目录,数据块保存目录中包含的文件和子目录的信息,而对于普通文件,数据块保存文件的内容。
数据块是分区上的大部分块。一些被分配给各种inode(即,目录和文件),而另一些则是免费的。另一个关键的文件系统任务是在数据写入文件时分配空闲数据块,并在文件被截断或删除时从文件中释放数据块。
所有这些概念都有很多变体,而且我确信在某些文件系统中我上面所说的内容与现实不太相符。但是,通过以上内容,您应该能够推理文件系统如何完成其工作,并至少了解您在任何特定文件系统中遇到的差异。
【讨论】:
并非所有文件系统都使用 inode。这几乎与 Unix 类似。许多文件系统都没有这种情况。 (例如古老的 FAT 系统。) 我使用了 unix 术语,因为这是我最熟悉的。但是,我认为即使是 FAT 在分区上也必须有某个位置来表示给定文件并以某种方式指向其内容:无论 FAT 怎么称呼它,它都类似于“inode”。【参考方案2】:Tracks >> Blocks >> Sectors >> Words >> Bytes >> Nibbles >> Bits
磁道是从磁盘盘片内部到外部的同心环。
每条轨道都分为称为扇区的切片。
块是一组扇区(1、2、4、8、16 等)。驱动器越大,一个块将容纳的扇区越多。
word 是 CPU 一次可以处理的位数(16 位、32 位、64 位等),在您的示例中,存储地址(或者可能下一个块的偏移量)。
字节包含半字节和位。 1 个字节 = 2 个半字节; 1 个半字节 = 4 个位。
【讨论】:
恐怕有些不太对劲。轨道确实如您所描述的那样,但它们几乎完全被现代磁盘驱动器隐藏:我不知道最近有一个使用它们的文件系统。在文件系统的上下文中,块几乎总是空间分配的基本单位,4kB 和 8kB 是传统大小。随着磁盘变大,该块不会容纳更多扇区,磁盘只是容纳更多块。最后,字节不包含单词。字总是多个字节。 “字”本身通常表示 4 或 8 个字节。 我只是为其他词汇提供上下文。仅仅因为轨道是从文件系统中抽象出来的,并不意味着它们不存在。 另外,当“单词”本身意味着 2 个字节时,我学到了这些东西,非常感谢。我们不需要你花哨的 8 字节单词! 我和戴尔在一起。磁道是一个低级概念,例如特定于硬盘驱动器的物理实现的柱面、盘片和磁头。 SSD(闪存驱动器)没有这些东西。 确实如此,尽管我记得,是新贵的 x86 体系结构从 S/360 大型机中窃取了单词“word”,它已经被愉快地用作四个字节的含义。不是我的问题,但是您的说法仍然不正确,即随着磁盘变大块变大。您可以通过这种方式定义块,但我所知道的文件系统都没有这样做。【参考方案3】:我不知道这句话的上下文,但它似乎在描述一个块的链接列表。一般来说,“块”是少量字节(通常是 2 的幂)。它可能是 4096 字节,也可能是 512 字节,这取决于。硬盘驱动器旨在一次检索一个块的数据;如果要获取第 1234567 个字节,则必须获取它所在的整个块。“单词”要小得多,并且指的是单个数字。它可能低至 2 字节(16 位)或高达 8 字节(64 位);同样,这取决于文件系统。
当然,块和单词并不是文件系统的全部。文件系统通常会实现某种B-tree 来快速查找(它不必搜索整个文件系统来查找文件,只需沿着树向下走)。在文件系统 B 树中,每个节点都存储在一个块中。许多文件系统使用 B-tree 的一种变体,称为 B+-tree,它通过链接将叶子连接在一起以加快遍历速度。这里描述的结构可能是描述 B+-tree 的叶子,也可能是描述用于存储单个大文件的块链。
总而言之,磁盘就像一个巨大的字节数组,可以分解为通常为 2-8 字节的字和通常为 512-4096 字节的块。还有其他方法可以将其分解,例如磁头、柱面、扇区等。在这些原语之上,实现了更高级别的索引结构。通过了解文件系统开发人员需要满足的约束(通过一次存储/检索块来有效地模拟文件树),文件系统设计应该非常直观。
【讨论】:
我真的很喜欢你的回答。这是用最简单的术语解释的!谢谢。以上是关于文件系统实现中的基本概念的主要内容,如果未能解决你的问题,请参考以下文章