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