Linux内核线程的思考与总结

1、内核线程,只是一个称呼,实际上就是一个进程,有自己独立的TCB,参与内核调度,也参与内核抢占。

这个进程的特别之处有两点,第一、该进程没有前台。第二、永远在内核态中运行。

2、创建内核线程有两种方法,一种是 kthread_create() ,一种是 kernel_thread() ,两种有什么区别?使用场景分别是什么?

http://www.cnblogs.com/sky-heaven/p/5395864.html

3、内核线程既然也是进程,那么新创建出来的内核线程,用户是谁?所属哪个组?

  

4、内核线程的父进程PPID,有的为0,有的为2,绝大部分是2,是什么含义?

  Linux内核线程的思考与总结

  解答:仔细观察得知,既然PPID是2,那么进程ID为2的内核线程是谁?从上图可以看到,它是kthreadd线程,该线程启动后,在这个线程的运行期间,

  会去启动其他内核线程,代码如下:

  文件:kthread.c (kernel)

  内容:

    Linux内核线程的思考与总结

  源码解析:可以看出,kthread_create_list是需要创建内核线程的列表,一定有一个函数供其他模块调用,往这个列表中增加内容。

  那么,kthreadd本身在哪里启动的呢?见下面的rest_init函数实现。

  Linux内核线程的思考与总结

5、既然每个内核线程都是一个进程,进程的地址空间是互相隔离的,为何说所有的内核线程共享同一个地址空间?

  同样的问题,在Linux用户态编程中,线程也是通过进程控制块的方式管理的,他们如何实现共享地址空间的呢?

  (待补充)

6、kernel_thread()的关键是调用在内核中实现的 do_fork(),核心本质上还是一个进程。

上一篇:linux内核中创建线程方法【转】


下一篇:linux内核线程,进程,线程