为啥我们使用基数树(或 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)来存储页面缓存?的主要内容,如果未能解决你的问题,请参考以下文章