如何创建轻量级内核线程?

How to create light weight kernel thread?

当我创建一个内核线程(kthread_run)时,它变成了一个新进程。(我可以使用 top 命令看到它)。我怎样才能创建一个轻量级内核线程(就像我们在用户 space 中拥有的那样)?

如果我没记错的话,kthread_create 最终会调用 fork(),它会调用具有适当配置的 clone() 以创建一个新的 process/lw 进程。是否可以使用 clone() 或类似的 api 创建 lw 内核线程?非常感谢。

内核线程始终列在进程 table 中,但这只是一个表面问题。它们共享相同的地址 space 和 *-tables,所以从这个意义上说它们是相当轻量级的(即 context-switch 不是很昂贵)。

如果您的 2*16 kernel-threads 主要做同样的事情,则可能值得评估是否可以将功能移至单独的 kernel-module,从而将 API 暴露给被所有 16 个 kernel-module 使用并且只在 1 或 2 个线程中完成工作。

用户 space 中的轻量级线程只是一组进程(或任务)共享相同的地址 space 和许多其他资源。此外,轻量级线程的创建速度比普通进程快。 Linux使用1对1映射模型,即用户space中的每个线程在内核space中作为一个单独的进程实现。

在Linux中,内核线程是一个没有有效用户的进程space。它们被安排为正常进程,但从未进入用户领域。

所以,答案是当你理解了轻量级的意思时,你就会知道根本就没有轻量级内核线程。所有内核线程自然共享同一个内核space地址。

此外,top只是一个用户程序,天气出现在top输出中并不能真正反映底层内核实现的本质。