Memory management 我们如何设计磁盘上的数据结构以及如何保存它?

Memory management 我们如何设计磁盘上的数据结构以及如何保存它?,memory-management,data-structures,storage,disk,Memory Management,Data Structures,Storage,Disk,我们如何设计磁盘上的数据结构?例如:看看ext3inode,我们有属性放置。特别是在内存使用/对齐、填充等方面,需要记住哪些事项 另外,是否有任何特殊的机制可以按照页面/块对齐方式将这些数据结构写入磁盘,或者您只需像文件写入一样进行写入?磁盘上数据结构是任何特别适合于硬盘或其他类型的块访问存储设备(与RAM相反)的数据结构 示例:(链接的)二叉树更适合于RAM,因为基本存储(和搜索)单元很小:单个节点有一个且只有一个键,比如100字节。b-树适合于硬盘,因为它的基本存储和搜索单元使用几个键(比如

我们如何设计磁盘上的数据结构?例如:看看ext3inode,我们有属性放置。特别是在内存使用/对齐、填充等方面,需要记住哪些事项


另外,是否有任何特殊的机制可以按照页面/块对齐方式将这些数据结构写入磁盘,或者您只需像文件写入一样进行写入?

磁盘上数据结构是任何特别适合于硬盘或其他类型的块访问存储设备(与RAM相反)的数据结构

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

停电时,RAM数据结构会立即丢失。试图恢复没有任何意义。但是,硬盘驱动器并非如此。这类数据结构的恢复能力(部分或全部)通常是选择它们的一个重要标准


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

通常,由于其相对低级的特性,此类结构的处理是在C中完成的。例如,当您定义一个
struct
时,您总是可以提前知道它需要多少字节,甚至知道每个字段的对齐方式。C永远不会在
struct
控件或其他类型的字段中引入它自己使用的内容。这允许直接从磁盘读取和写入这些
struct
s

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

  • 它说对应于EXT3。但是,它没有显示任何添加到EXT2的EXT3特定结构。对于您当前的目的来说,对EXT2有一个很好的理解就足够了。我强烈建议你阅读或类似的书籍
  • 它将块(指针)数组的最后一个条目显示为单个间接寻址条目,并且没有提到两个或三个间接寻址条目。在EXT2(和EXT3)中,块(指针)数组包含15个条目。前12个是直接,13个是单间接,14个是双间接,15个是三重间接。这种简化可能只是为了描述,也可能是为了简化你将要做的全部工作
这些结构是文件概念的起源。您无法将其作为文件读取,因为还没有文件。您确实需要与代表硬盘驱动器的“块设备驱动程序”交互。与许多其他Linux对象一样,设备(以及隐式地它们的驱动程序)在文件系统中表示为元素(不,不是在还不存在的文件系统中,而是在任何Linux机器启动时拥有的
root
文件系统中)。您需要打开相应的文件系统对象,并使用
ioctl
函数向其发送请求

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

  • 输入/输出单位(扇区),是从设备发送/接收的基本字节数。通常是512字节
  • 分配单元(块),它是分配给文件系统中文件的基本字节数。通常为1、2、4、8、16个扇区或另一个2的幂次方(但磁盘中所有块的数量相同)
因此,磁盘被划分为块,这些块被分配给文件以保存其内容。创建大小为0的文件时,它没有任何块。写入第一个字节时,分配第一个块。写入第二个字节时,不会分配新的块,因为第一个块仍应有大量可用空间(例如4095字节)。当写入字节4096时,它仍然适合第一个块,但当写入字节4097时,第二个块被分配给文件,新字节被写入其第一个位置。等等平均而言,每个文件都会浪费一半的块,特别是在其最后一个块中

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

然而,这些扇区最终将被读入RAM,出于效率原因,在使用前不应进行任何操作。另一方面,许多CPU架构在
short
s上运行得更快,当对齐为2(即内存地址的倍数为2)时,大小为2字节;在
int
s上运行得更快,当对齐为4时,大小为4字节,依此类推,通常高达16字节。如果磁盘上的数据项遵循这些对齐方式,并且存储这些数据项的扇区总是以所需的最大对齐方式(16以确保安全)读取到内存块中,那么数据项也将在内存中正确对齐

以摘要的方式:

  • 将磁盘上数据结构的基本元素精确地设置为1个扇区大(即使它们的重复是g