为啥我们使用基数树(或 xarray)来存储页面缓存?

Posted

技术标签:

【中文标题】为啥我们使用基数树(或 xarray)来存储页面缓存?【英文标题】: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 指向)?

【问题讨论】:

【参考方案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,把这个设计机制描述的很清楚。

【讨论】:

以上是关于为啥我们使用基数树(或 xarray)来存储页面缓存?的主要内容,如果未能解决你的问题,请参考以下文章

基数树的空间复杂度是多少?

Mysql 索引为啥使用B+树?不用哈希或B树?红黑树?

为啥我们不使用 2-3 或 2-3-4-5 树?

xarray:大于使用 map_blocks 将结果转储到 .zarr 存储的内存数组

10基数排序

C语言之清空缓存区