linux内核线程的创建与销毁
linux将创建内核线程的工作交给了一个专门的内核线程kthreadd来完成,该线程会检查全局链表kthread_create_list,如果为NULL,就会调schedule()放弃cpu进入睡眠状态,否则就取下该链表中的一项创建对应的线程。本文就从khtreadd内核线程的创建开始来展示一下内核线程的创建过程。
1 kthreadd
linux2.6.30,创建内核线程是通过kethradd内核守护线程来完成的,虽然机制上有所变化,但是最终还是调用do_fork来完成线程的创建。Kthreadd守护线程是在linux内核启动时就已经创建的内核线程。在start_kernel调用的结束位置,会调用rest_init接口,而kthreadd就是在这个接口中创建的,代码如下所示:
asmlinkage void __init start_kernel(void)
{
。。。。。。。。。。。。。。。。。。。。。。
rest_init();
}
static noinline void __init_refok rest_init(void)
__releases(kernel_lock)
{
int pid;
/*在启动时创建内核线程,该线程主要用来创建内核线程*/
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
}
Kthreadd守护线程本身也是一个内核线程,这个内核线程本质上与其他内核线程都一样,只不过是这个内核线程所做的工作是用来创建内核线程的。函数的调用关系如下所示:
Start_kernel=》rest_init=》kernel_thread=》do_fork
没有内核线程创建请求时,Kthre