Linux内核v2.6 +中的pthread与kthread

时间:2014-12-20 15:41:32

标签: linux multithreading linux-kernel pthreads kernel

这是一个概念性问题。

根据这个post,pthread实际上是使用clone()系统调用实现的。因此,我们可以推断出在用户空间中有一个内核线程(或轻量级进程)备份pthread。内核知道pthread并且可以像进程一样安排它。

至于kthread,根据Robert Love,kthreads也是用clone()系统调用创建的:

clone(CLONE_VM| CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)

所以pthread和kthread都使用clone()调用。我的第一个问题是:

  1. 这两种线程有区别吗?
  2. 为了回答我自己的问题,我继续阅读:

      

    内核线程和正常进程之间的显着差异   是内核线程没有地址空间(事实上,他们的mm   指针为NULL)。

    这是一个区别吗?我的意思是,由pthread_create()创建的线程与正常进程共享地址空间。相反,kthread没有自己的地址空间。那是对的吗?

    还有什么不同?

1 个答案:

答案 0 :(得分:5)

  

相反,kthread没有自己的地址空间。那是对的吗?

  

由pthread_create()创建的线程与正常进程共享地址空间。

kernel: how to find all threads from a process's task_struct

pthreads pthread_create()用于用户空间,其中应用程序中的多个线程共享相同的进程地址空间。为此,您需要将程序与pthread库链接以使用此功能。 pthreads在应用程序级别或用户空间中提供多线程。在内部,这会转换为clone()系统调用,它将新的struct task_struct映射到每个应用程序线程。

kthreads :内核线程的一些示例用于刷新磁盘缓存,服务softirqs,刷新脏缓冲区等。这些线程仅在内核空间内运行,无法访问用户空间虚拟内存,它们仅在PAGE_OFFSET之后使用内核空间内存地址,因此任务描述符中的current->mm字段始终为NULL。在内部,此kernel_thread() api会在内核中转换为do_fork()。内核线程是异步创建的,无论是init进程出现还是加载了一些内核模块(从文件系统开始)。