内核线程
创建内核线程由内核线程kthreadd完成
rest_init->kthreadd->create_kthread->kernel_thread->do_fork
int kthreadd(void *unused)
{
for(;;)
{
if (list_empty(&kthread_create_list))
schedule();
spin_lock(&kthread_create_lock);
while (!list_empty(&kthread_create_list))
{
struct kthread_create_info *create;
create = list_entry(kthread_create_list.next,
struct kthread_create_info, list);
list_del_init(&create->list);
spin_unlock(&kthread_create_lock);
create_kthread(create);
spin_lock(&kthread_create_lock);
}
spin_unlock(&kthread_create_lock);
}
return 0;
}
创建
#define kthread_run(threadfn, data, namefmt, ...) \
({ \
struct task_struct *__k \
= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
if (!IS_ERR(__k)) \
wake_up_process(__k); \
__k; \
})
struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...)
__attribute__((format(printf, 3, 4)));
终止
int kthread_stop(struct task_struct *k)
{
kthread->should_stop = 1;
}
int kthread_should_stop(void) //子线程退出条件
{
return to_kthread(current)->should_stop;
}
终止子线程需要手动置1使子线程退出循环
绑定CPU
void kthread_bind(struct task_struct *p, unsigned int cpu)
提高内核线程的工作效率
查看CPU
#define cpu_possible_map (*(cpumask_t *)cpu_possible_mask)
#define cpu_online_map (*(cpumask_t *)cpu_online_mask)
#define cpu_present_map (*(cpumask_t *)cpu_present_mask)
#define cpu_active_map (*(cpumask_t *)cpu_active_mask)
cpu_possible_map:
最多有多少个CPU,包括本机的CPU,以及可以热插拔的CPU
1. 假设cpu_possible_map为10,本机CPU个数为8个,则最多可以再添加2个可插拔CPU
cpu_present_map:
当前有多少个CPU
1. 本机CPU个数为8个,都是online的,则cpu_present_map为8
2. 再插入1个可插拔CPU,则cpu_present_map为9
cpu_online_map:
在当前的CPU中,有多少个可用的CPU
1. 本机CPU个数为8个,都是online的,则cpu_online_map为8
2. 将其中一个设置为offline,则cpu_online_map变为7
#define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
#define for_each_online_cpu(cpu) for_each_cpu((cpu), cpu_online_mask)
#define for_each_present_cpu(cpu) for_each_cpu((cpu), cpu_present_mask)
总结
线程是跑在CPU上的,如果是单CPU单核,那么主子线程只能有一个在跑;除非是多CPU或多核心,才会多线程同时跑
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· Tinyfox 简易教程-1:Hello World!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!