免费注册 查看新帖 |

Chinaunix

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

写了一个内核模块 实现简单的类似ps命令. [复制链接]

论坛徽章:
0
1 [报告]
发表于 2005-12-26 17:44 |显示全部楼层
原帖由 albcamus 于 2005-11-22 15:19 发表
mq110兄,写的不错

一个小问题,for_each_process时,要加读锁的。

read_lock(&tasklist_lock);
…………
read_unlock(&tasklist_lock);

否则在SMP机器上容易出问题


问下albcamus兄
你说这里要加锁是不是为了保护什么?为了保护static char buf[1024*8]缓冲吗?

不太明白 谢谢了

[ 本帖最后由 xdkui 于 2005-12-26 17:47 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-26 18:03 |显示全部楼层
原帖由 albcamus 于 2005-12-26 17:48 发表


保护task链表。 多个CPU的机器上,假如别的CPU在更改它,你同时试图访问它,可能会出问题。


不好意思,还是不太明白

    rwlock_t tasklist=RW_LOCK_UNLOCKED;

    if(offset >0)
        return 0;
    memset(buf,0,sizeof(buf));
    read_lock(&tasklist);
    for_each_process(p)   //遍例内核进程链表.

我的理解是:
1   for_each_process(p)的时候,如果别的cpu要改变task链表,该cpu也不会读取tasklist锁,所以不会被锁,仍会继续改变task链表。

2  这里tasklist锁只是为了保护buf缓冲,使其不会同时被写。而buf是static静态的,不是位于stack中,是全局的,所以需要保护。但如果在ps_read的时候buf是kmalloc分配的话,就不需要保护buf了。

请albcamus兄指教下,谢谢

论坛徽章:
0
3 [报告]
发表于 2005-12-26 20:53 |显示全部楼层
原帖由 albcamus 于 2005-12-26 18:09 发表
>>  for_each_process(p)的时候,如果别的cpu要改变task链表,该cpu也不会读取tasklist锁,所以不会被锁,仍会继续改变task链表。

是的。锁是这样一种机制,给哪些想要得到保护的人用的。 如果某个程序员 ...


albcamus兄,还是没有解释我的第一个理解阿。我的意思就是加了那个rwlock_t  tasklist锁,还是达不到保护task链表的目的阿。

那这里rwlock_t  tasklist锁到底是为了保护什么呢?
不好意思,还是没有理解清楚,

论坛徽章:
0
4 [报告]
发表于 2005-12-27 10:54 |显示全部楼层
原帖由 albcamus 于 2005-12-27 09:18 发表
我表达能力有限了。 如果每一个要访问tasklist的代码,都把访问动作用rwlock保护起来,那么就保护得住了。自旋锁、读写自旋锁、信号量、读写信号量都是这样的:只有大家都用,才能真正保护。


呵呵
不好意思   我再好好看看资料
谢谢了

论坛徽章:
0
5 [报告]
发表于 2005-12-27 18:11 |显示全部楼层
原帖由 albcamus 于 2005-11-22 15:19 发表
mq110兄,写的不错

一个小问题,for_each_process时,要加读锁的。

read_lock(&tasklist_lock);
…………
read_unlock(&tasklist_lock);

否则在SMP机器上容易出问题



晕,终于明白了,tasklist_lock是个全局rwlock_t变量,专门用于锁任务队列。任何想处理任务队列的内核任务应该先获取该锁。

而mq110兄的代码是这样的:
    rwlock_t tasklist=RW_LOCK_UNLOCKED;

    if(offset >0)
        return 0;
    memset(buf,0,sizeof(buf));
    read_lock(&tasklist);
                     ^^^^^^这里的tasklist是自己定义的,所以mq110兄这里的代码有问题,根本没有达到锁任务队列的目的。

albcamus兄说的没错,应该这样:
read_lock(&tasklist_lock);
…………
read_unlock(&tasklist_lock);
                      ^^^^^^^^应该用这个全局变量,而不是自己定义的。

难怪我看得糊涂

论坛徽章:
0
6 [报告]
发表于 2005-12-28 16:16 |显示全部楼层
原帖由 mq110 于 2005-12-28 14:16 发表


谢谢xdkui 指出问题.

我还是感觉有些问题.即使是加上全局的tasklist_lock后
25904           1                       vsftpd
12018           1                       crond
9535            1      ...



什么意思?我用你的模块挺好的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP