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()
或直接返回一个返回码,以退出内核线程。
创建内核线程
kthread_create()
kthread_create(thread_fn,
data,
name_fmt,
arg...)
在当前NUMA结点上创建一个内核线程(DragonOS目前暂不支持NUMA,因此node可忽略。)
请注意,该宏会创建一个内核线程,并将其设置为停止状态.
thread_fn
该内核线程要执行的函数
传递给
thread_fn
的参数数据
name_fmt
printf-style format string for the thread name
name_fmt的参数
返回值
创建好的内核线程的pcb
kthread_run()
kthread_run(thread_fn,
data,
name_fmt,
...)
创建内核线程并加入调度队列。
该宏定义是
kthread_create()
的简单封装,提供创建了内核线程后,立即运行的功能。
kthread_run_rt()
kthread_run_rt(thread_fn,
data,
name_fmt,
...)
创建内核实时线程并加入调度队列。
类似
kthread_run()
,该宏定义也是
kthread_create()
的简单封装,提供创建了内核实时线程后,在设置实时进程的参数后,立即运行的功能。