我知道有:
1)用户级线程 - 在进程的相同地址空间内但具有不同的堆栈。
2)内核级线程 - 内核内存堆栈(我猜这里)。
因此,当我创建用户级线程时,内核不知道它们 [1]。那么内核如何知道如何在不同的内核中调度不同的用户级线程。这个问题与pthread有关。如果pthread是用户级线程,它如何在多核上运行?
未来的答案读者:(感谢所有贡献的人)
1)Ziffusion的答案(下)
答案 0 :(得分:2)
所以当我创建用户级线程时,内核不知道它们
这不完全正确。至少不是你想的那样。
用户空间线程库可以选择实现不一对一地映射到内核线程- BUT -
的线程。这些用户空间线程中的每一个都在内核线程上运行(当它运行时)。这只意味着库可以在用户空间中进行自己的调度,并决定将用户空间线程(它认为可以运行的线程)映射到池中的内核线程。从这个意义上说,内核不知道用户空间线程- BUT -
它非常了解用于运行这些用户空间线程的内核线程。
内核管理和调度内核线程。如果它决定,它可以在多个CPU上运行它们。这样做会导致映射到此类内核线程的用户空间线程也在这些CPU上运行。
事实上,这可以在许多系统中看到。 Java或Python中的Threads
,Python中的greenlets
,golang中的goroutines
- 都使用此机制。
Pthreads过去也是这样,但是他们的实现被改变为将每个pthread映射到专用的内核线程。但是pthreads实现很可能仍然使用用户空间线程模型。
还有另一种模型,其中用户空间线程可以完全是用户空间抽象,内核完全没有意识到。例如,可以使用setcontext()和getcontext()来实现单个进程内的用户空间线程。