免费注册 查看新帖 |

Chinaunix

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

请教一个内核线程 父进程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-23 22:21 |只看该作者 |倒序浏览
本帖最后由 javacool 于 2010-10-23 22:28 编辑

最近在看2.6.34的代码,根据以前的说法 init 进程1是除进程0以外的所有进程的父进程

但是在rest_init()函数中,实际上担负后续内核线程建立的kthread_add线程是在线程0中创建的,
也就是说kthread_add以及通过ktread_add建立的其他内核线程,父进程应该都是进程0,不知道我的理解是不是正确的?
另外我查过2.6.11的代码,开始的描述便是正确的,所有除0线程以外,其他进程的父进程因该都是init进程
static noinline void __init_refok rest_init(void)
        __releases(kernel_lock)
{
        int pid;

        rcu_scheduler_starting();
        kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);       
              numa_default_policy();
        pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
        rcu_read_lock();
        kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
        rcu_read_unlock();
        unlock_kernel();

        /*
         * The boot idle thread must execute schedule()
         * at least once to get things moving:
         */
        init_idle_bootup_task(current);
        preempt_enable_no_resched();
        schedule();
        preempt_disable();

        /* Call into cpu_idle with preempt disabled */
        cpu_idle();
}

论坛徽章:
0
2 [报告]
发表于 2010-10-24 11:38 |只看该作者
本帖最后由 奇门遁甲-lu 于 2010-10-24 17:40 编辑
根据以前的说法 init 进程1是除进程0以外的所有进程的父进程

你说的不完整,应该是, 一个进程的父进程没了,这个进程将变成孤儿进程,
所有孤儿进程的父进程都是init进程.

2.6.22以前没有kthreadd这个线程,那么除了进程0外,其他进程都是init进程
或其子进程不断fork出来的。
2.6.22及以后,很多内核线程由kthreadd线程create_kthread出来。

看,下面很多内核线程的父进程都是2,   kthreadd的pid = 2;

  1. [lu@localhost ~]$ ps -ef
  2. UID        PID  PPID  C STIME TTY          TIME CMD
  3. root         1     0  0 09:20 ?        00:00:01 /sbin/init
  4. root         2     0  0 09:20 ?        00:00:00 [kthreadd]
  5. root         3     2  0 09:20 ?        00:00:00 [ksoftirqd/0]
  6. root         4     2  0 09:20 ?        00:00:00 [watchdog/0]
  7. root         5     2  0 09:20 ?        00:00:00 [events/0]
  8. root         6     2  0 09:20 ?        00:00:00 [cpuset]
  9. root         7     2  0 09:20 ?        00:00:00 [khelper]
  10. root        10     2  0 09:20 ?        00:00:00 [async/mgr]
  11. root       259     2  0 09:20 ?        00:00:01 [kblockd/0]
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-10-24 12:11 |只看该作者
本帖最后由 javacool 于 2010-10-24 12:13 编辑

恩 谢谢楼上  我原来的理解是 其他所有task都是从 init进程为根的进程树下生成出来的  比较新的内核版本现在内核线程都是在kthread_add内核线程为根的一颗子树下生成,而init进程是另外一棵子树。这两颗子树 的祖先是进程0。  不过不知道为什么要这么做?是否为了区分开 普通进程和内核进程?

老版本                              
   0
    1
  。。。。。


新版本
     0
    1    2
。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP