1、内核线程,只是一个称呼,实际上就是一个进程,有自己独立的TCB,参与内核调度,也参与内核抢占。
这个进程的特别之处有两点,第一、该进程没有前台。第二、永远在内核态中运行。
2、创建内核线程有两种方法,一种是 kthread_create() ,一种是 kernel_thread() ,两种有什么区别?使用场景分别是什么?
http://www.cnblogs.com/sky-heaven/p/5395864.html
3、内核线程既然也是进程,那么新创建出来的内核线程,用户是谁?所属哪个组?
4、内核线程的父进程PPID,有的为0,有的为2,绝大部分是2,是什么含义?
解答:仔细观察得知,既然PPID是2,那么进程ID为2的内核线程是谁?从上图可以看到,它是kthreadd线程,该线程启动后,在这个线程的运行期间,
会去启动其他内核线程,代码如下:
文件:kthread.c (kernel)
内容:
源码解析:可以看出,kthread_create_list是需要创建内核线程的列表,一定有一个函数供其他模块调用,往这个列表中增加内容。
那么,kthreadd本身在哪里启动的呢?见下面的rest_init函数实现。
5、既然每个内核线程都是一个进程,进程的地址空间是互相隔离的,为何说所有的内核线程共享同一个地址空间?
同样的问题,在Linux用户态编程中,线程也是通过进程控制块的方式管理的,他们如何实现共享地址空间的呢?
(待补充)
6、kernel_thread()的关键是调用在内核中实现的 do_fork(),核心本质上还是一个进程。