这是一个概念性问题。
根据这个post,pthread实际上是使用clone()系统调用实现的。因此,我们可以推断出在用户空间中有一个内核线程(或轻量级进程)备份pthread。内核知道pthread并且可以像进程一样安排它。
至于kthread,根据Robert Love,kthreads也是用clone()系统调用创建的:
clone(CLONE_VM| CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)
所以pthread和kthread都使用clone()调用。我的第一个问题是:
为了回答我自己的问题,我继续阅读:
内核线程和正常进程之间的显着差异 是内核线程没有地址空间(事实上,他们的mm 指针为NULL)。
这是一个区别吗?我的意思是,由pthread_create()创建的线程与正常进程共享地址空间。相反,kthread没有自己的地址空间。那是对的吗?
还有什么不同?
答案 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进程出现还是加载了一些内核模块(从文件系统开始)。