Linux用户级(pthread)线程是否在多个核心上运行?

7
我知道有以下内容:
1)用户级线程 - 在进程的同一地址空间中,但具有不同的堆栈。
2)内核级线程 - 在内核内存堆栈中(我猜测在这里)。
因此,当我创建用户级线程时,内核不知道它们 [1]。那么内核如何知道如何在不同的核心中安排不同的用户级线程?这个问题涉及到pthread。如果pthread是用户级线程,它如何在多个核心上运行?
未来的答案搜索者请阅读:
1)Ziffusion的回答(下面)
2)David Schwartz的回答 3)Tutorial point链接

2
pthread通常不是用户级线程。请参见此处:https://dev59.com/2moy5IYBdhLWcg3wUcRL - Jeremy Friesner
1
这些讲义是用 Comic Sans 字体写的吗? - paddy
1
内核不知道用户空间线程的想法是一种错觉。此外,任何线程在任何给定时间只能在单个核心上运行。如果内核有任何理由这样做,下次可能会在另一个核心上重新调度。 - Serge
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user253751
2
根据维基百科的说法,"用户空间(或用户态)是指在操作系统内核之外运行的所有代码"。因此,在用户(而非内核)上下文中运行的任何代码都可以互换地称为用户空间或用户态。尽管可能存在完全独立于内核、在用户软件中进行线程上下文切换的pthread实现,但考虑到大多数现代内核都支持用户空间线程,我怀疑这样的解决方案现在是否被广泛使用。 - Serge
显示剩余2条评论
1个回答

4
当我创建用户级线程时,内核并不知道它们的存在。但这并非完全正确,至少不是你所想象的那样。用户空间线程库可以选择实现不与内核线程一对一映射的线程,但这些用户空间线程中的每一个在运行时都运行于内核线程上。这意味着该库可以在用户空间中进行自己的调度,并决定将其认为已准备好运行的用户空间线程从池中映射到内核线程。从这个意义上说,内核并不知道用户空间线程的存在,但它非常清楚用于运行这些用户空间线程的内核线程。内核管理和调度内核线程。如果决定这样做,它可以在多个CPU上运行它们。这样做会导致映射到这些内核线程的用户空间线程也在这些CPU上运行。实际上,在许多系统中都可以看到这种情况。Java或Python中的线程,Python中的greenlets,golang中的goroutines都使用这种机制。

Pthreads以前也是这样的,但它们的实现方式已更改为将每个pthread映射到一个专用内核线程。但是,仍有可能使用用户空间线程模型来实现Pthreads。

还有另一种模型,其中用户空间线程可以完全是用户空间的抽象,而内核完全不知道。例如,可以使用setcontext()getcontext()来实现生存在单个进程中的用户空间线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接