pok*_*che 6 c linux multithreading pthreads
我知道有:
1) 用户级线程 - 在进程的相同地址空间内,但具有不同的堆栈。
2)内核级线程 - 在内核内存堆栈内部(我在这里猜测)。
所以当我创建用户级线程时,内核不知道它们[1]。那么内核如何知道,如何调度不同内核中的不同用户级线程。这个问题是关于 pthread 的。如果 pthread 是用户级线程,它如何在多核上运行?
未来答案寻求者阅读:( 感谢所有贡献者)
1)Ziffusion的回答(下)
2)大卫施瓦茨的回答
3)教程点链接
所以当我创建用户级线程时,内核不知道它们
这并不完全正确。至少不是你想的那样。
用户空间线程库可以选择实现不一对一映射到内核线程的线程,- BUT -这些用户空间线程中的每一个都在内核线程上运行(当它运行时)。这仅意味着该库可以在用户空间中进行自己的调度,并决定将用户空间线程(它认为准备好运行的线程)映射到池中的内核线程。从这个意义上说,内核不知道用户空间线程- BUT -,它非常了解用于运行这些用户空间线程的内核线程。
内核管理和调度内核线程。如果它决定的话,它可以在多个 CPU 上运行它们。这样做时,它会导致映射到此类内核线程的用户空间线程也在这些 CPU 上运行。
事实上,这在很多系统中都可以看到。Threads在Java或Python中,greenlets在Python中,goroutines在golang中——都使用这种机制。
Pthread 过去也是这样,但它们的实现已更改为将每个 pthread 映射到专用的内核线程。但是 pthread 实现很可能仍然使用用户空间线程模型。
还有另一种模型,其中用户空间线程可以完全是用户空间抽象,而内核完全不知道这一点。例如,可以使用setcontext()和getcontext()来实现位于单个进程内的用户空间线程。