Linux内核线程kthread创建与管理
内核线程是Linux内核中由内核创建和管理的特殊线程,用于执行后台任务、处理中断下半部、管理设备等系统级操作
内核线程创建
1. 创建函数
kthread_create() - 创建内核线程,返回task_struct*
kthread_run() - 创建并唤醒内核线程(常用)
kthread_create_on_node() - 在指定NUMA节点上创建线程
kthread_create_on_cpu() - 在指定CPU上创建线程
2. 创建流程
定义线程函数:int thread_func(void *data)
调用kthread_run(thread_func, data, "thread_name")
内核分配task_struct结构并初始化
设置线程标志为PF_KTHREAD
将线程加入运行队列等待调度
注意:内核线程没有用户空间上下文,不能访问用户空间内存,运行在内核态,使用内核栈。
内核空间执行
PF_KTHREAD标志
无用户上下文
内核栈
内核线程管理
1. 线程控制
wake_up_process() - 唤醒休眠的内核线程
kthread_should_stop() - 检查线程是否应该停止
kthread_stop() - 请求线程停止并等待其结束
kthread_bind() - 将线程绑定到特定CPU
kthread_unpark() - 取消线程的暂停状态
2. 状态管理
运行状态
TASK_RUNNING - 可运行
TASK_INTERRUPTIBLE - 可中断休眠
TASK_UNINTERRUPTIBLE - 不可中断休眠
停止状态
TASK_STOPPED - 停止执行
TASK_TRACED - 被跟踪
EXIT_ZOMBIE - 僵尸状态
3. 资源清理
内核线程退出时应调用do_exit()或返回,内核会自动清理资源。使用kthread_stop()确保线程正确终止。
最佳实践:始终使用kthread_should_stop()检查停止请求,确保线程可以优雅终止。避免线程函数无限循环而不检查停止条件。
全行业学习资料加V:iuelonglong