【问题标题】:Why we use radix-tree(or xarray) for storing page caches?为什么我们使用基数树(或 xarray)来存储页面缓存?
【发布时间】:2020-10-08 08:08:56
【问题描述】:

我现在正在研究 linux 内核,了解 linux 内核(第 3 版),我对使用 radix tree 存储整个页面缓存和使用 radix tree 的原因感到非常困惑。 (听说4.20版本以后内核使用xarray)。

所以,这是我的问题:

一旦我们想要某个 I 节点的一些信息,我们应该查看“address_space”指向的整个页面缓存。

书上说他们使用基数树来快速搜索页面缓存,但我无法理解这一点。

搜索哪些页面缓存?我们不需要所有这些吗?

请给我一些例子,为什么我们使用基数树来快速搜索页面缓存。

并跟进问题:

如果某个“I-node”是 address_space 的主机,并且它保存 radix_tree_root,并且在这个 radix 树中,我们有所有的页面缓存保存与文件相关的所有数据(由该 I-node 指向)?

【问题讨论】:

    标签: memory memory-management linux-kernel filesystems inode


    【解决方案1】:

    基数树是一个压缩树,其中trie 是一种数据结构,它实现了关联数组的接口并允许将值存储为键值。键通常是字符串,但可以使用任何数据类型。 trie 与 n-tree 的不同之处在于它的节点。 trie 的节点不存储密钥;相反,trie 的节点存储单个字符标签。与给定节点相关的密钥是通过从树的根遍历到该节点而得出的。例如:

        +-----------+
                   |           |
                   |    " "    |
                   |           |
            +------+-----------+------+
            |                         |
            |                         |
       +----v------+            +-----v-----+
       |           |            |           |
       |    g      |            |     c     |
       |           |            |           |
       +-----------+            +-----------+
            |                         |
            |                         |
       +----v------+            +-----v-----+
       |           |            |           |
       |    o      |            |     a     |
       |           |            |           |
       +-----------+            +-----------+
                                      |
                                      |
                                +-----v-----+
                                |           |
                                |     t     |
                                |           |
                                +-----------+
    

    所以在这个例子中,我们可以看到带有键、go 和 cat 的 trie。压缩的 trie 或基数树与 trie 的不同之处在于,所有只有一个子节点的中间节点都会被删除。

    基数树在主线内核树中有几个用户。 PowerPC 体系结构使用树在真实和虚拟 IRQ 编号之间进行映射。 NFS 代码将树附加到相关的 inode 结构以跟踪未完成的请求。然而,基数树最广泛的用途是在内存管理代码中。用于跟踪后备存储的address_space 结构包含一个基数树,它跟踪与该映射相关的核心页面。除其他外,此树允许内存管理代码快速查找脏页或正在回写的页。

    给你一个paper,把这个设计机制描述的很清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2020-09-23
      相关资源
      最近更新 更多