【问题标题】:How to create light weight kernel thread?如何创建轻量级内核线程?
【发布时间】:2016-01-11 12:04:04
【问题描述】:

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

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

【问题讨论】:

  • @Neijwiert:如果我没记错的话,内核线程和 posix 线程是两个完全不同的概念,所以我不确定这是否对 Karthik 有帮助
  • @MikeMB 我也不确定 OP 想要什么,因为他/她在问“就像我们在用户空间中拥有的一样”
  • 我正在编写 16 个内核模块,每个模块需要创建两个线程。我不希望内核将这些线程列为进程。就像没有为用户线程创建新进程一样,我也想为内核线程实现类似的行为。如果我不能理解,请回来
  • Like new processes are not created for user threads - 如果用户线程假设pthreads,那么你就错了:在Linux中pthreads是用clone创建的,即每个pthread实际上是基于流程(或任务,如下面的 Matteo Italia 所述)。当然,clone 的参数对于fork()pthread_create() 是不同的。如果您的意思是 user threads 别的意思,那么请澄清一下。
  • 你在我所知道的任何最近的 Linux 机器上“在用户空间”中的线程与你在内核空间中描述的完全一样——它们创建了一个共享大部分资源的新“任务”(地址空间,文件表,...)与父。 IOW,在 Linux 上,进程和线程由内核以相同的方式处理 - 它们是具有一些相关资源的“任务”(可调度实体),这些资源可能(线程)或可能不(进程)与其他任务共享。跨度>

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


【解决方案1】:

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

如果你的 2*16 内核线程主要做同样的事情,那么可能值得评估是否可以将功能移动到一个单独的内核模块中,它公开了一个可供所有 16 个内核模块使用的 API 并做仅在 1 或 2 个线程中工作。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 据我所知,内核甚至不知道一个进程有多少线程。用户级线程与内核无关,这就是为什么阻塞线程会影响所有其他线程的原因。-参考了一些网站,他们也这么说。
    • @Karthik,不,内核知道一切。 tid 用于线程 ID,pid 用于进程 ID。 stackoverflow.com/questions/4517301/…
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2017-05-06
    相关资源
    最近更新 更多