上面讲完了用户进程/线程的创建,这里我们看下内核是如何创建线程的。
通过 ps 命令可以看到红色方框标出的都是父进程为2号进程的内核线程,2号进程即蓝色方框标出的进程 kthreadd,1号进程是绿色方框标出的进程 init,它们的父进程号都是0。

下面我们一起看下,内核的0号,1号,2号线程的创建过程。
0号线程
linux 内核中为0号进程专门定义了一个静态的 task_struct 的结构,称为 init_task:
/* include/linux/init_task.h */
#define INIT_TASK_COMM "swapper"
/* init/init_task.c */
struct task_struct init_task
#ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK
__init_task_data
#endif
__aligned(L1_CACHE_BYTES)
= {
#ifdef CONFI