用于构建文件系统的数据结构?

Posted

技术标签:

【中文标题】用于构建文件系统的数据结构?【英文标题】:Data structures used to build file systems? 【发布时间】:2012-12-17 02:05:40 【问题描述】:

哪种数据结构最适合用于文件组织? B树是最好的还是有另一种数据结构可以更快地访问文件和良好的组织?谢谢

【问题讨论】:

我喜欢使用数据库来存储信息。我相信大多数数据库都使用 b 结构。您是否正在尝试完成一项特定的任务? 我只是好奇操作系统使用哪种数据结构进行文件组织,因为我正在学习数据结构并实现了其中的一些:红黑树、AVL 树、B 树、Skip列表.. 我想知道哪些可以用于更有用的任务(不存储数字) 我不确定大多数操作系统是如何存储数据的。祝研究顺利。 红黑树、AVL 树等都是内存数据结构。它们不适合对文件系统更重要的持久性(磁盘上)数据结构。另外,我不确定你是否知道,但是 B 树和二叉树是完全不同的鞋子。只是为了澄清。 感谢@dmeister 提供的信息。是的,您是对的 RBT、AVL 等用于内存。这就是为什么我需要研究持久数据结构。当然,B-Tree 和二叉树之间存在巨大差异! 【参考方案1】:

所有文件系统都不同,因此文件系统中实际使用的数据结构数量巨大。

许多文件系统使用某种bit vector(通常称为位图)来跟踪某些空闲块的位置,因为它们在查询特定磁盘块是否正在使用和(对于并没有完全满)支持对空闲块的合理快速查找。

许多较旧的文件系统(ext 和 ext2)使用简单的链表存储目录结构。显然,对于大多数应用程序来说,这实际上已经足够快了,尽管使用大量大型目录的某些类型的应用程序会遭受明显的性能损失。

XFS 文件系统以将B+-trees 用于几乎所有内容而闻名,包括目录结构及其日志系统。根据我在本科操作系统课程中的记忆,其理念是,由于编写、调试和性能调整 B+-树的实现需要很长时间,因此尽可能多地使用它是有意义的。

其他文件系统(ext3 和 ext4)使用 B 树的变体,称为HTree,我不太熟悉。显然,它使用某种散列方案来保持高分支因子,以便使用很少的磁盘访问。

我听说一些操作系统尝试使用splay trees 来存储它们的目录结构,但遇到了麻烦。具体来说,它阻止了多个读取器对同一目录的多线程访问(因为在展开树中,每次访问都会重塑树),并且遇到了一个边缘情况,如果树的所有元素都是按顺序访问的,那么树将退化为链表。也就是说,我不知道这是否只是一个都市传说,因为这些问题在任何人尝试编写代码之前就已经很明显了。

Microsoft 的 FAT32 系统使用一个巨大的数组(文件分配表)来存储哪些文件存储在哪里以及哪些磁盘扇区在一个文件中在逻辑上彼此跟随。主要缺点是必须提前设置表,因此最终限制了可以存储在磁盘上的文件大小。但是,基于数组的系统很容易实现。

这不是一个详尽的列表 - 我确信其他文件系统使用其他数据结构。不过,我希望它可以帮助您朝着正确的方向前进。

希望这会有所帮助!

【讨论】:

非常有用的帖子,谢谢!然后我会研究位向量,然后对其他操作系统做更多的研究。我听说splay tree很麻烦!我最熟悉 B 树,但我期待学习其他对这类东西有用的数据结构!感谢您的长篇回答:)

以上是关于用于构建文件系统的数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

系统服务构建运维

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - 准备虚拟内核文件系统

6.824分布式系统笔记LEC 3: GFS |HDFS背景GFS架构文件读写一致性

您将如何构建数据库文件系统 (DBFS)?

构建调试Linux内核网络代码的环境MenuOS系统

Notes on Artifactory