看起来 imap 的作用是保存指向各个 inode 的指针,以便能够以非常快的方式进行写入(有人能解释一下这是如何工作的吗?)但我想知道 imap 中包含指向其他 imap 的指针有什么意义。不仅如此,它们还存在于多个级别...
答案1
iNode Map(有时会被误认为 imap,尽管 IMAP 是一种电子邮件协议)是指向 iNode 的指针(似乎您已经知道了)。这在日志记录(主要是日志文件系统)中用作抽象层。基本上,当您想要查找给定的文件系统 iNode 时,转换层会查找该位置的 iNode Map,并返回文件系统实际应该指向的当前 iNode。然后读取此位置以查找文件。
一些文件系统可以堆叠这些。当单个逻辑文件系统 iNode 被多次写入而不刷新日志/日志时,每次写入都将使用磁盘上的新物理位置,包括指向该位置的 iNode。每个过时的 iNode 映射都会更新以指向新的 iNode 映射,并最终指向当前 iNode。
这些背后的原因不是速度,而是一致性。在写入期间,在磁盘上选择一个新位置,写入正在进行,然后更新旧位置以指向新位置。当日志/日志合并时,文件系统将更新以指向最新位置,旧位置将被释放。这样,如果任何时候发生电源故障,您将永远不会丢失数据,文件系统要么指向文件的旧版本,要么指向新版本,但永远不会指向其他任何东西(例如写入一半的文件、损坏的数据或草丛中)。
答案2
这是处理指向其他结构且大小可能相差很大的结构的相当典型的方法。文件系统已经在管理分区上的固定大小的存储空间块。因此,您通常使用该大小(或其倍数)作为单元大小。
如果您拥有足够多的对象,以至于可以将它们保存在一个块中,则可以这样做。如果某个块溢出,则将该块中的一个项目替换为指向新分配的块的指针,该块保存您替换的指针和新指针。
选择这种方法是因为:
它与缓存配合得很好。最高级别的块往往被多次访问并保留在缓存中。
它只需要以块大小为单位跟踪可用空间,因此它可以与基于位图的可用空间管理配合良好。
它的扩展性很好,平均查找时间大致与元素数量的对数成正比。(理论上,如果你在一个块中存储 32 个指针,则可以通过 n 次查找访问 32^n 个指针。)
它动态平衡得很好。当你添加或删除指针时,可以执行相当简单的操作来保持树的平衡。(你不想得到一棵又长又瘦的树。你想让它又粗又短。这实际上很容易做到。)