当我创建一个内核线程(kthread_run
)时,它就变成了一个新进程。(我可以使用top
命令看到它)。如何创建轻量级内核线程(就像我们在用户空间中使用的那样)?
如果我没有错,kthread_create最终将调用fork(),它将使用适当的配置调用clone()来创建一个新的进程/ lw进程。是否可以使用clone()或类似的apis创建lw内核线程?非常感谢提前。
答案 0 :(得分:2)
内核线程始终列在进程表中,但这只是一个常见问题。它们共享相同的地址空间和* -tables,因此从这个意义上说它们非常轻量级(即上下文切换并不是非常昂贵)。
如果您的2 * 16内核线程主要执行相同的操作,那么可能值得评估是否可以将功能移动到单独的内核模块中,该模块公开了所有16个内核模块使用的API并执行只用1或2个线程工作。
答案 1 :(得分:1)
用户空间中的轻量级线程只是一组进程(或任务)共享相同的地址空间和许多其他资源。此外,轻量级线程的创建速度比正常进程快。 Linux使用1对1映射模型,即用户空间中的每个线程都作为内核空间中的单独进程实现。
在Linux中,内核线程是一个没有有效用户空间的进程。它们被安排为正常过程,但从不进入用户土地。
所以,答案是,当你理解轻量级的含义时,你就会知道根本没有轻量级的内核线程。所有内核线程自然地共享相同的内核空间地址。
另外,top只是一个用户程序,顶级输出中出现的天气并不能真正反映底层内核实现的本质。