Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何创建轻量级内核线程?_C_Linux_Multithreading_Linux Kernel_Kernel Module - Fatal编程技术网

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

C 如何创建轻量级内核线程?,c,linux,multithreading,linux-kernel,kernel-module,C,Linux,Multithreading,Linux Kernel,Kernel Module,当我创建一个内核线程(kthread\u run)时,它就变成了一个新进程(我可以使用top命令查看它)。我如何创建一个轻量级的内核线程(就像我们在用户空间中的线程) 如果我没有记错的话,kthread_create最终将调用fork(),它将使用适当的配置调用clone(),以创建一个新进程/lw进程。是否可以使用clone()或类似的API创建lw内核线程?非常感谢。内核线程总是列在进程表中,但这只是一个装饰性的问题。它们共享相同的地址空间和*-表,因此从这个意义上讲,它们是非常轻量级的(即

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


如果我没有记错的话,kthread_create最终将调用fork(),它将使用适当的配置调用clone(),以创建一个新进程/lw进程。是否可以使用clone()或类似的API创建lw内核线程?非常感谢。内核线程总是列在进程表中,但这只是一个装饰性的问题。它们共享相同的地址空间和*-表,因此从这个意义上讲,它们是非常轻量级的(即,上下文切换不是非常昂贵)


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

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

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

因此,答案是,当您理解了轻量级的含义时,您将知道根本不存在轻量级内核线程。所有内核线程自然共享相同的内核空间地址


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

@Neijwiert:如果我没有弄错的话,内核线程和posix线程是两个完全不同的概念,所以我不确定这是否有帮助Karthik@MikeMB我也不确定OP想要什么,因为他/她要求“像我们在用户空间中拥有的那样”,我正在编写16个内核模块,其中每个模块需要创建两个线程。我不希望内核将这些线程列为进程。就像没有为用户线程创建新进程一样,我也希望为内核线程实现类似的行为。如果我不能理解
,比如新进程不是为用户线程创建的
——如果用户线程假设
pthreads
,那么你就错了:在Linux
pthreads
中,pthreads
是用
clone
创建的,也就是说每个pthread实际上都基于进程(或者任务,如下面的Matteo Italia所述). 当然,
clone
的参数对于
fork()
pthread\u create()
是不同的。如果你指的是
用户线程
其他,那么,请澄清。我所知道的任何最近的Linux机器上的“用户空间”中的线程与内核空间中描述的线程完全相同-它们创建了一个新的“任务”,与父级共享大部分资源(地址空间、文件表等)。在Linux上,进程和线程由内核以同样的方式处理——它们是“任务”(可调度实体),具有一些相关的资源,可以(线程)共享,也可以不(进程)与其他任务共享。据我所知,内核甚至不知道一个进程有多少线程。用户级线程与内核无关,这就是阻塞线程影响所有其他线程的原因。-参考了一些网站,他们也这么说。@Karthik,不,内核什么都知道。tid表示线程id,pid表示进程id。