idr and radix-tree
来源:互联网 发布:h5易企秀模板源码 编辑:程序博客网 时间:2024/06/11 22:47
idr用到了radix-tree。如果只有一个节点数据结构如下:
crash> idr ffff880b4d726dd0struct idr { idr_rt = { gfp_mask = 0x6000000, rnode = 0xffff880bd74d7909 }, idr_next = 0x0}crash> radix_tree_node ffff880bd74d7908struct radix_tree_node { shift = 0x0, offset = 0x0, count = 0x1, exceptional = 0x0, parent = 0x0, root = 0xffff880b4d726dd0, { private_list = { next = 0xffff880bd74d7920, prev = 0xffff880bd74d7920 }, callback_head = { next = 0xffff880bd74d7920, func = 0xffff880bd74d7920 } }, slots = {0x0, 0xffff880b4d726000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, tags = {{0xfffffffffffffffd}, {0x0}, {0x0}}}
这里有几点需要注意。第一,如果node末位是1,说明不是叶子节点。dump的时候一定要把1去掉。
#define RADIX_TREE_ENTRY_MASK 3UL#define RADIX_TREE_INTERNAL_NODE 1ULstatic inline bool radix_tree_is_internal_node(void *ptr){ return ((unsigned long)ptr & RADIX_TREE_ENTRY_MASK) == RADIX_TREE_INTERNAL_NODE;}
第二,count就是孩子的个数,包括中间节点和叶子节点。
第三,tags就是bitmap,是叶子节点置为0。否则为1。
再举个例子63个节点的例子:
crash> radix_tree_node ffff880bc1dc16d0struct radix_tree_node { shift = 0x0, offset = 0x0, count = 0x3f, exceptional = 0x0, parent = 0x0, root = 0xffff880b5354add0, { private_list = { next = 0xffff880bc1dc16e8, prev = 0xffff880bc1dc16e8 }, callback_head = { next = 0xffff880bc1dc16e8, func = 0xffff880bc1dc16e8 } }, slots = {0x0, 0xffff880b5354aa00, 0xffff880b5354b800, 0xffff880b5354ba00, 0xffff880b5354b600, 0xffff880b53548600, 0xffff880b5354b200, 0xffff880b53549a00, 0xffff880b5354a800, 0xffff880b53548400, 0xffff880b5354bc00, 0xffff880b5354b400, 0xffff880b5354be00, 0xffff880b5354ae00, 0xffff880b53549400, 0xffff880b53549e00, 0xffff880b53549200, 0xffff880b5354b000, 0xffff880b53549c00, 0xffff880b5354a400, 0xffff880b53548800, 0xffff880b53549800, 0xffff880b5354a000, 0xffff880b53549000, 0xffff880b53548c00, 0xffff880b53548200, 0xffff880b5354a200, 0xffff880b53548a00, 0xffff880b9a415600, 0xffff880b9a417600, 0xffff880b9a415800, 0xffff880b9a417200, 0xffff880b9a417800, 0xffff880b9a414800, 0xffff880b9a414200, 0xffff880b9a414000, 0xffff880b9a414e00, 0xffff880b9a415000, 0xffff880b9a417400, 0xffff880b9a414600, 0xffff880b9a416400, 0xffff880b9a414c00, 0xffff880b9a414a00, 0xffff880b9a415200, 0xffff880b5e3f7c00, 0xffff880b5e3f5400, 0xffff880b5e3f4400, 0xffff880b5e3f6e00, 0xffff880b5e3f5e00, 0xffff880b5e3f5c00, 0xffff880b5e3f7a00, 0xffff880b5e3f4c00, 0xffff880b5e3f6200, 0xffff880b5e3f5800, 0xffff880b5e3f6000, 0xffff880b5e3f7200, 0xffff880b5e3f6800, 0xffff880b5e3f5a00, 0xffff880b5e3f6400, 0xffff880b5e3f5000, 0xffff880b5e3f6c00, 0xffff880b5e3f4800, 0xffff880b5c46e000, 0xffff880b5c46ea00}, tags = {{0x1}, {0x0}, {0x0}}}
那么offset是什么的?首先创建有200个节点的树。
crash> radix_tree_node ffff880bd74d76c0struct radix_tree_node { shift = 0x6, offset = 0x0, count = 0x4, exceptional = 0x0, parent = 0x0, root = 0xffff880b4d7247d0, { private_list = { next = 0xffff880bd74d76d8, prev = 0xffff880bd74d76d8 }, callback_head = { next = 0xffff880bd74d76d8, func = 0xffff880bd74d76d8 } }, slots = {0xffff880bd74d7b51, 0xffff880bd74d7479, 0xffff880bd74d6da1, 0xffff880bd74d6fe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, tags = {{0xfffffffffffffff9}, {0x0}, {0x0}}}crash> radix_tree_node.offset 0xffff880bd74d7b50 offset = 0x0crash> radix_tree_node.offset 0xffff880bd74d7478 offset = 0x1crash> radix_tree_node.offset 0xffff880bd74d6da0 offset = 0x2crash> radix_tree_node.offset 0xffff880bd74d6fe8 offset = 0x3
应该可以理解为孩子的编号,从0开始。
阅读全文
0 0
- idr and radix-tree
- idr 机制 radix tree
- Radix tree/IDR/IDA
- radix tree
- Radix TRee
- Radix树 与 Linux IDR机制
- address_space 与 radix tree
- radix tree 基数树
- 基数树(radix tree)
- 基数树(radix tree)
- Radix tree--reference
- 基数树(radix tree)
- 基数树(radix tree)
- Linux内核Radix Tree
- 基数树(radix tree)
- 基数树(radix tree)
- 基数树(Radix Tree)
- radix tree 整理
- Linux安装mysql
- CCF Markdown
- Linux安装tomcat
- 将Excel中的数据导入到MySql数据库中
- Linux下的进程概论与编程二(进程控制)
- idr and radix-tree
- python OS shutil 模块中的函数
- 最大似然估计和贝叶斯参数估计.md
- MySQL乱码问题以及utf8mb4字符集
- python文件打开方式详解——a、a+、r+、w+区别
- linux系统下查看文件权限、修改文件权限的方法
- ArrayList和LinkedList底层实现的区别
- windows下centos双系统,恢复windows为默认启动项的两种办法(zz)
- 信噪比小结