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

pok*_*che 6 c linux multithreading pthreads

我知道有:

1) 用户级线程 - 在进程的相同地址空间内,但具有不同的堆栈。

2)内核级线程 - 在内核内存堆栈内部(我在这里猜测)。

所以当我创建用户级线程时,内核不知道它们[1]。那么内核如何知道,如何调度不同内核中的不同用户级线程。这个问题是关于 pthread 的。如果 pthread 是用户级线程,它如何在多核上运行?

未来答案寻求者阅读:( 感谢所有贡献者)

1)Ziffusion的回答(下)

2)大卫施瓦茨的回答

3)教程点链接

Zif*_*ion 4

所以当我创建用户级线程时,内核不知道它们

这并不完全正确。至少不是你想的那样。

用户空间线程库可以选择实现不一对一映射到内核线程的线程,- BUT -这些用户空间线程中的每一个都在内核线程上运行(当它运行时)。这仅意味着该库可以在用户空间中进行自己的调度,并决定将用户空间线程(它认为准备好运行的线程)映射到池中的内核线程。从这个意义上说,内核不知道用户空间线程- BUT -,它非常了解用于运行这些用户空间线程的内核线程。

内核管理和调度内核线程。如果它决定的话,它可以在多个 CPU 上运行它们。这样做时,它会导致映射到此类内核线程的用户空间线程也在这些 CPU 上运行。

事实上,这在很多系统中都可以看到。Threads在Java或Python中,greenlets在Python中,goroutines在golang中——都使用这种机制。

Pthread 过去也是这样,但它们的实现已更改为将每个 pthread 映射到专用的内核线程。但是 pthread 实现很可能仍然使用用户空间线程模型。

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