免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2516 | 回复: 7
打印 上一主题 下一主题

关于内核源码中void hash_pid(struct task_struct *p)的疑惑。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-19 11:39 |只看该作者 |倒序浏览
linux/sched.h中
hash表项中的双向链表
extern __inline__ void hash_pid(struct task_struct *p)
{
        struct task_struct **htable = &pidhash[pid_hashfn(p->;pid)];

        if((p->;pidhash_next = *htable) != NULL)
                (*htable)->;pidhash_pprev = &p->;pidhash_next;
        *htable = p;
        p->;pidhash_pprev = htable;
}
各位请看此句 (*htable)->;pidhash_pprev = &p->;pidhash_next;
我单独调试了一下,每一个节点都会将pidhash_pprev 指向自己的地址啊,这代码是否有问题?
谢谢了~  

论坛徽章:
0
2 [报告]
发表于 2004-02-19 12:47 |只看该作者

关于内核源码中void hash_pid(struct task_struct *p)的疑惑。

看起来像是每一个实体都有一个pidhash_pprev吧?

论坛徽章:
0
3 [报告]
发表于 2004-02-19 13:03 |只看该作者

关于内核源码中void hash_pid(struct task_struct *p)的疑惑。

好乱,怎么看着像是只有一个节点的双向链表!

论坛徽章:
0
4 [报告]
发表于 2004-02-19 14:34 |只看该作者

关于内核源码中void hash_pid(struct task_struct *p)的疑惑。

这个哈希表的作用是尽快的找到PID对应的进程的TASK STRUCTURE!
但是哈希表并不能保证PID与表的索引一一对应,
所以使用了数据结构中的链地址法解决冲突问题!
pidhash[0]
            |1|<-->;x<-->;y<-->;z....-->;NULL
            |2|<-->;.....
            |3|<-->;.....
            |4|..
            |5|..
            |6|..
            |7|..
             ..

所以(*htable)->;pidhash_pprev = &p->;pidhash_next;
这句话改为(*htable)->;pidhash_pprev = p;
是不是就对了!

论坛徽章:
0
5 [报告]
发表于 2004-02-19 15:49 |只看该作者

关于内核源码中void hash_pid(struct task_struct *p)的疑惑。

我觉得这样的做法不是很好。因为后续的
void unhash_pid(struct task_struct *p)
{
if(p->;pidhash_next)
p->;pidhash_next->;pidhash_pprev = p->;pidhash_pprev;
*p->;pidhash_pprev = p->;pidhash_next;
}如果我执行
unhash_pid(p) N次,其实每次做得工作都一样(if(p->;pidhash_next)永远都为true得),感觉并没有把p从链表中移除,只是说在struct task_struct *find_task_by_pid(int pid) 中寻找时p已经不在其中了。

论坛徽章:
0
6 [报告]
发表于 2004-02-19 17:47 |只看该作者

关于内核源码中void hash_pid(struct task_struct *p)的疑惑。

原来是struct task_struct ** pidhash_pprev; 怪不得!
就是说 (*pidhash_pprev) 指向p->;pidhash_next,
而(**pidhash_pprev) 指向P->;old,也就是它自己!
其实&p->;pidhash_next就是p的地址!
写的妙呀!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP