Chinaunix

标题: 请教一个内核线程 父进程的问题 [打印本页]

作者: javacool    时间: 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();
}
作者: 奇门遁甲-lu    时间: 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]
复制代码

作者: javacool    时间: 2010-10-24 12:11
本帖最后由 javacool 于 2010-10-24 12:13 编辑

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

老版本                              
   0
    1
  。。。。。


新版本
     0
    1    2
。。。。。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2