内核线程,是一种在内核空间实现后台任务的方式。
1. 创建内核线程
在内核被唤醒后,会激活一个用户模式辅助程序,并将切当的身份代码桩底给他。使用kernel_thread()可以创建内核线程:
ret = kernel_thread(mythread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);
2 .进程状态和等待队列
等待事件过程中将mythread置于睡眠状态的代码片段:
add_wait_queue(&myevent_waitqueue, &wait); for (; ; ) { /* */ Set_current_state(TASK_INTERRUPTIBLE); Schedule(); /* Relinquish the processor*/ /* Point A */ /* ... */ } set_current_state(TASK_RUNNING); Remove_wait_queue(&myevent_waitqueue, &wait);
进程队列用于存放需要等待事件和系统资源的线程。入列和出列的操作分别通过调用add_wait_queue()和remove_wait_queue()完成,唤醒队列中的任务通过wake_up_interruptible()完成。
内核线程可以处于如下状态:
运行状态(TASK_RUNNING),处于调度器的运行队列(run queue)中,等待CPU时间分给它;
可被打断的睡眠状态(TASK_INTERRUPTIBLE),等待一个事件的发生;
不可被打断的睡眠状态,信号发生不会导致该进程被重新放入运行队列;
停止状态(TASK_STOPPED),收到了某些信号已经停止执行;
追踪状态(TASK_TRACED),正在使用内核的ptrace支持;拦截一个进程;
僵死状态(EXIT_ZOMBIE),进程已经被终止,但是其父进程并未等待它完成;