gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:32:20 26 4
gpt4 key购买 nike

这是一个概念性的问题。

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

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

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

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

  1. 这两种线程有区别吗?

为了回答我自己的问题,我继续阅读:

The significant difference between kernel threads and normal processes is that kernel threads do not have an address space (in fact, their mm pointer is NULL).

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

还有什么不同?

最佳答案

In contrast, a kthread does not have its own address space. Is that correct?

是的

a thread created by pthread_create() shares the address space with the normal process.

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

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

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

关于linux - Linux 内核 v2.6+ 中的 pthread 与 kthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27581747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com