Memory management 我们如何设计磁盘上的数据结构以及如何保存它?
我们如何设计磁盘上的数据结构?例如:看看ext3inode,我们有属性放置。特别是在内存使用/对齐、填充等方面,需要记住哪些事项Memory management 我们如何设计磁盘上的数据结构以及如何保存它?,memory-management,data-structures,storage,disk,Memory Management,Data Structures,Storage,Disk,我们如何设计磁盘上的数据结构?例如:看看ext3inode,我们有属性放置。特别是在内存使用/对齐、填充等方面,需要记住哪些事项 另外,是否有任何特殊的机制可以按照页面/块对齐方式将这些数据结构写入磁盘,或者您只需像文件写入一样进行写入?磁盘上数据结构是任何特别适合于硬盘或其他类型的块访问存储设备(与RAM相反)的数据结构 示例:(链接的)二叉树更适合于RAM,因为基本存储(和搜索)单元很小:单个节点有一个且只有一个键,比如100字节。b-树适合于硬盘,因为它的基本存储和搜索单元使用几个键(比如
另外,是否有任何特殊的机制可以按照页面/块对齐方式将这些数据结构写入磁盘,或者您只需像文件写入一样进行写入?磁盘上数据结构是任何特别适合于硬盘或其他类型的块访问存储设备(与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个是三重间接。这种简化可能只是为了描述,也可能是为了简化你将要做的全部工作
root
文件系统中)。您需要打开相应的文件系统对象,并使用ioctl
函数向其发送请求
为了理解对齐,区分两件事很重要:
- 输入/输出单位(扇区),是从设备发送/接收的基本字节数。通常是512字节
- 分配单元(块),它是分配给文件系统中文件的基本字节数。通常为1、2、4、8、16个扇区或另一个2的幂次方(但磁盘中所有块的数量相同)
short
s上运行得更快,当对齐为2(即内存地址的倍数为2)时,大小为2字节;在int
s上运行得更快,当对齐为4时,大小为4字节,依此类推,通常高达16字节。如果磁盘上的数据项遵循这些对齐方式,并且存储这些数据项的扇区总是以所需的最大对齐方式(16以确保安全)读取到内存块中,那么数据项也将在内存中正确对齐
以摘要的方式:
- 将磁盘上数据结构的基本元素精确地设置为1个扇区大(即使它们的重复是g