我们如何设计磁盘数据结构以及如何保存?

时间:2013-08-15 21:28:26

标签: memory-management data-structures storage disk

我们如何设计磁盘数据结构?例如:查看ext3 inode structure,我们有属性放置。有什么事要记住,特别是在内存使用/对齐,填充等方面?

另外,是否有任何特殊的机制可以将这些数据结构写入磁盘/页面/块对齐,或者只是简单地写入文件写入?

2 个答案:

答案 0 :(得分:2)

通常,这种结构的处理是在C中完成的,因为它具有相对低级的特性。例如,当您定义struct时,您可以预先知道将采用多少字节,甚至每个字段的对齐方式。 C永远不会在struct控件或其他类型的字段中引入它自己的用途。这允许直接从磁盘读取和写入struct

问题中包含的链接似乎对应于Linux EXT2(扩展2)文件系统,保存了两件事:

  • 它表示与EXT3相对应。但是,它没有显示任何添加到EXT2的EXT3特定结构。对当前目的来说,对EXT2的充分理解应该足够了。我强烈建议您阅读Wikipedia's article on EXT2或类似内容。
  • 它将块(指针)数组的最后一个条目显示为单个间接间接引用,并且它没有提到双或三个间接条目。在EXT2(和EXT3)中,块(指针)数组包含15个条目。前12个是直接的,13个是单个间接,14个是双间接,15个是三个。这种简化本来只能用于描述,或者也可以简化你将要做的整个工作。

这些结构是文件概念的起源。您无法将它们作为文件读取,因为还没有文件。您需要与"块设备驱动程序进行交互"代表硬盘。与许多其他Linux对象一样,设备(以及隐含的驱动程序)在文件系统中表示为元素(不,不在您的文件系统中,但尚未存在,但在{{1}中任何Linux机器在启动时都有的文件系统)。您需要打开相应的文件系统对象,并使用root函数向其发送请求。

为了理解对齐,区分两件事情很重要:

  • 输入/输出单元(扇区),它是您从设备发送/接收的基本字节数。通常,它是512字节。
  • 分配单元(块),它是您分配给文件系统中文件的基本字节数。通常为1,2,4,8,16个扇区或2的另一个幂(但磁盘中所有块的数量相同)。

因此,磁盘被分成块,这些块被分配给文件以保存其内容。创建大小为0的文件时,它没有任何块。写入第一个字节时,将分配第一个块。写入第二个字节时,不会分配新块,因为第一个块仍应有大量可用空间(比如4,095字节)。当写入字节编号4,096时,它仍然适合第一个块,但是当写入字节4,097时,将为文件分配第二个块,并将新字节写入其第一个位置。等等。平均而言,每个文件总是浪费一半的块,特别是在最后一个块中。

磁盘上数据结构的基本部分应该是512字节大小,因此可以完全读取和写入它们。当然,这些基本部分的多个实例可以连续存储,但基本信息不应跨越一个扇区到下一个扇区,而是完全包含在其中一个扇区中。超过512字节对齐,这是512字节大小要求。

然而,这些扇区最终将被读取到RAM,并且出于效率原因,它们在使用前不应受到任何操纵。另一方面,许多CPU体系结构在ioctl上运行速度更快,其大小为2字节,当它们的对齐为2(即2的内存地址倍数)时,short s, 4个字节,当它们的对齐为4时,依此类推,通常最大为16个。如果磁盘上的数据项服从这些对齐,并且存储它们的扇区总是被读入一个具有最大可能所需对齐的存储块( 16为了安全),那么数据项也将在内存中正确对齐。

摘要模式:

  • 使磁盘上的数据结构的基本元素恰好为1扇区(即使它们的重复将连续存储)。
  • 根据这些扇区/基本元素的大小对齐数据项,
  • 读取16字节对齐的内存块(或任何最大的基本数据项)的磁盘数据结构(可能还有所有扇区)。

最后,回答不同评论中表达的一些问题:

  • 现在你提到了Java,这是我第一次理解为什么它对你来说如此重要呢?" on-disk"和"记忆中"数据结构。见下文。
  • 在Java中,您无法控制对象大小或数据项对齐。如果要符合上面建立的条件,每次要将Java DS编写到磁盘时,都需要将其编码为int,并写入。每次从磁盘读取DS时,都需要读取byte[512]并将其解码为相应的Java DS。这违反了内存和磁盘内数据结构之间无数据转换的原则。
  • 此外,在Java中,您通常无法访问设备。但是,您可以通过文件模拟块设备。
  • 您可以调用"磁盘上的数据结构"到读取/写入磁盘的byte[512]数据元素,以及源/结果磁盘扇区(模拟或物理)本身。
    • 在这种情况下,您可以调用"内存中的数据结构"将Java对象编码到byte[512]中,然后写入磁盘,或从已从磁盘读取的byte[512]解码。
  • 正确,简单byte[512]," on-disk"数据结构基本上是纯数据"。
  • 是的,因为Java反对" in-memory"数据结构将属于类,而类又包含函数,常量,数据类型/辅助类等。
  • 有关详细信息,请说明EXT2的实施方式是否与公开指定完全相同,或仅作为您将定义详细信息的一般模型。
  • byte[512]仅作为一个表格(包含水平和垂直组件),仅出于美学原因。可以将其视为一维(水平或垂直)数据。

答案 1 :(得分:0)

磁盘数据结构是特别适用于硬盘或其他类型的块访问存储设备(而不是RAM)的任何数据结构。

示例:(链接的)二叉树更适合RAM,因为基本存储(和搜索)单元很小:单个节点只有一个密钥,比如100个字节。 b树适用于硬盘,因为它的基本存储和搜索单元使用多个密钥(比如20),总大小为2000字节。这更接近于硬盘的存储和访问单元,这意味着当一个节点存储在磁盘存储单元中时很少或没有浪费,并且当执行磁盘访问操作时,所有传输的信息都是真正需要的,用过的。事实上,b-trees每个节点接受不同数量的密钥,可以调整以适应特定的硬盘驱动器。

停电时,RAM数据结构立即丢失。尝试任何恢复没有任何意义。但是,硬盘驱动器不是。在选择这种数据结构时,(部分或全部)恢复这种数据结构的能力通常是一个重要的标准。

它还可以指管理块访问内存系统所需的数据结构,通常采用文件和目录(及其属性,包括安全属性)的形式。