kthread 内核线程
内核线程模块定义在common/kthread.h
中,提供对内核线程的及支持功能。内核线程作为内核的“分身”,能够提升系统的并行化程度以及故障容错能力。
原理
每个内核线程都运行在内核态,执行其特定的任务。
内核线程的创建是通过调用kthread_create()
或者kthread_run()
宏,向kthreadd
守护线程发送创建任务来实现的。也就是说,内核线程的创建,最终是由kthreadd
来完成。
当内核线程被创建后,虽然会加入调度队列,但是当其被第一次调度,执行引导程序kthread()
后,将进入休眠状态。直到其他模块使用process_wakeup()
,它才会真正开始运行。
当内核其他模块想要停止一个内核线程的时候,可以调用kthread_stop()
函数。该函数将会置位内核线程的worker_private
中的KTHREAD_SHOULD_STOP
标志位,并等待内核线程的退出,然后获得返回值并清理内核线程的pcb。
内核线程应当经常检查KTHREAD_SHOULD_STOP
标志位,以确定其是否要退出。当检测到该标志位被置位时,内核线程应当完成数据清理工作,并调用kthread_exit()
或直接返回一个返回码,以退出内核线程。