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

时间:2016-01-11 12:04:05

标签: c linux multithreading linux-kernel kernel-module

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

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

2 个答案:

答案 0 :(得分:2)

内核线程始终列在进程表中,但这只是一个常见问题。它们共享相同的地址空间和* -tables,因此从这个意义上说它们非常轻量级(即上下文切换并不是非常昂贵)。

如果您的2 * 16内核线程主要执行相同的操作,那么可能值得评估是否可以将功能移动到单独的内核模块中,该模块公开了所有16个内核模块使用的API并执行只用1或2个线程工作。

答案 1 :(得分:1)

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

在Linux中,内核线程是一个没有有效用户空间的进程。它们被安排为正常过程,但从不进入用户土地。

所以,答案是,当你理解轻量级的含义时,你就会知道根本没有轻量级的内核线程。所有内核线程自然地共享相同的内核空间地址。

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