用户线程和核心线程
https://www.cnblogs.com/FengZeng666/p/14219477.html#SGZR3
https://cloud.tencent.com/developer/article/1839593
https://zhuanlan.zhihu.com/p/410266069
用户线程
由对应的程序运行库创建的线程,堆和栈分配处于用户态空间,操作系统对此无感的线程。所以操作系统对此的感知是一个进程而已,即使有多核的cpu,也只能利用其中之一而已。
核心线程
属于核心态下创建的线程,堆和栈的分配都处于核心态空间,操作系统可以感知。在Linux下相当于lwp轻量级进程。操作系统可以进行调度。
用户线程和核心线程的关系
用户线程存在多线程中,如果存在线程发送阻塞,该进程中其他的线程,由于无法感知到用户态的线程,会同等的阻塞其他的线程,无法充分利用cpu。所以将用户线程映射到核心线程中,当用户线程发生阻塞的时候,就可以切换其他的用户线程完成上下文的切换。
用户线程和核心线程的关系为
- 1对1
- 多对1
- m对n
其中JVM和Linux使用的是1对1的线程关系,一个用户线程对应一个核心线程。这样的好处是,当发生阻塞的时候,操作系统一定能感知到,可以进行线程的调度,利用多核的cpu,坏处是随着线程的增多,核心空间分配的受限。
多对一的线程,常常不被使用,此过程依然会发生线程的阻塞问题。因为多个用户态线程,无法被感知到,所以单个核心线程对应多个用户线程,会阻塞。
m对n,设计相对复杂,可以有效地限制核心线程的数目。
职责
- 用户线程的创建销毁调度全是在用户态完成。
- 核心线程的创建销毁和调度是在核心态完成。