免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cluter
打印 上一主题 下一主题

linux内核priority search tree详解--->王者归来,先发一篇狠的 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-04-25 18:14 |只看该作者
回复 10# Godbach


    哦。。原来不知道啊,谢谢提醒哈。。

论坛徽章:
0
12 [报告]
发表于 2011-05-07 12:17 |只看该作者
大神 图片压缩一下啊,也挺清晰的
手机被你搞挂了!

论坛徽章:
0
13 [报告]
发表于 2011-05-07 23:48 |只看该作者
回复 12# gooopler


    就怕看不清楚,错了,下次发附件。。。

论坛徽章:
0
14 [报告]
发表于 2011-05-13 16:45 |只看该作者
不解释 先顶下

论坛徽章:
0
15 [报告]
发表于 2012-05-12 10:34 |只看该作者
我最近也看了prio_tree的代码。对楼主的代码剖析有点异议。
按照根节点heap_index=7的话,root->index_bits=3没错,可是溢出子树以上应该有3层吧,lz少画了一层。根节点是不占用index_bits的,所以根节点的基索引不受r_index&mask的限制,从根节点的子节点开始才用
r_index&mask判断向左还是右遍历,遍历一层则mask>>1;直至mask==0,这样当要建立或访问溢出子树时已经遍历了4层(连根节点所在层)。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
16 [报告]
发表于 2012-05-13 16:35 |只看该作者
本帖最后由 embeddedlwp 于 2012-05-13 18:33 编辑

回复 15# aweii

从prio_tree_insert函数的这段代码来看:
  1. 201        cur = root->prio_tree_node;
  2. 202        mask = 1UL << (root->index_bits - 1);
  3. 203
  4. 204        while (mask) {
  5. 205                get_index(root, cur, &r_index, &h_index);
复制代码
并没有区分是第0层,还是第1层啊
如果root->index_bits为3
那么
level  mask  
0        4         
1        2
2        1
3        1<<31   suboverflow tree



   

论坛徽章:
0
17 [报告]
发表于 2012-05-17 16:45 |只看该作者
感谢楼主分享,顶一个

论坛徽章:
0
18 [报告]
发表于 2012-05-19 16:13 |只看该作者
判断的是下一层的路径取向,index & mask=1,向右子结点,否则向左子节点,所以mask对根节点不起作用,向下一层,则右移一位。3的话就是移3层。所以根节点下应有3层,然后才是溢出子树。另外《深入理解linux内核》书中这部分的示意图是错的,基索引相同的节点应该在一条路径上,但是该图把r_inde=0的节点放在了兄弟节点的位置,明显有问题。
if (index & mask) {
                        if (prio_tree_right_empty(cur)) {
                                INIT_PRIO_TREE_NODE(node);
                                cur->right = node;
                                node->parent = cur;
                                return res;
                        } else
                                cur = cur->right;
                } else {
                        if (prio_tree_left_empty(cur)) {
                                INIT_PRIO_TREE_NODE(node);
                                cur->left = node;
                                node->parent = cur;
                                return res;
                        } else
                                cur = cur->left;
                }

                mask >>= 1;
……

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
19 [报告]
发表于 2012-05-19 17:41 |只看该作者
回复 18# aweii


判断的是下一层的路径取向,index & mask=1,向右子结点,否则向左子节点,所以mask对根节点不起作用,向下一层,则右移一位。3的话就是移3层。所以根节点下应有3层,然后才是溢出子树
======================================================
mask = 1UL << (root->index_bits - 1);
从这句来看,根的那层移位被忽略了,所以如果index_bits为3,那么这里的mask为1^2,也就是说只能移动两次,然后就是suboverflow tree了。所以根下边到suboverflow tree之间只能有两层

另外《深入理解linux内核》书中这部分的示意图是错的,基索引相同的节点应该在一条路径上,但是该图把r_inde=0的节点放在了兄弟节点的位置,明显有问题。
======================================================
对这个图我也比较疑惑,0,0,0与0,2,2为什么是这个排布
         
              0,4,4
       __  |   
      |
   0,2,2
  __ |
|
0,0,0

为什么不是这个样子??


   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
20 [报告]
发表于 2012-05-21 08:54 |只看该作者
顶起!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP