用户级线程模型
此模型下的线程是由用户级别的线程库全权管理的
线程库并不是内核的一部分,而只是存储在进程的用户空间之中,这些线程的存在在对于内核来说是无法感知的
应用程序在对线程进行创建、终止、切换或同步等操作的时候, 并不需要让CPU从用户切换到内核态
并且,由于对线程的管理完全不需要内核的参与,导致在此模型下并不能够真正并发运行
- 例如,如果线程在I/O操作过程中被阻塞,那么其所属进程也会被阻塞
- 这正是由线程无法被内核调度造成的
在调度器的眼里,进程是一个无法再被分割的调度单元,无论其中存在多少个线程
- 即使计算上有多个CPU,进程中的多个线程也无法被分配给不同的CPU运行
包含了多个用户级线程的进程只与一个KSE(Kernel Scheduling Entiy, 内核调度实体)相对应,因此这种线程实现模型又称为多对一(M:1) 的线程实现
内核级线程模型
该模型下的线程是由内核负责管理的,它们是内核的一部分
应用程序对线程的创建、终止和同步都必须通过内核提供的系统调用来完成的。进程中的每一个线程都与一个KSE相对应
也就是说,内核可以分别对每一个线程进程调度。由此,内核级线程模型又称一对一(1:1)的线程实现
- 一对一线程实现了消除了多对一线程的很多弊端,可以真正实现线程的并发
内核可以在不同的时间片内让CPU运行不同的线程。内核在极短的时间内快速切换和运行各个线程,使得它们看起来就像正在同时运行
即使进程中的一个线程由于某种原因进入到阻塞状态,其他线程也不会受到影响,这也使得内核在多个CPU上进行负载均衡变得容易和有效。
同时,内核对线程的全权接管使操作系统在库级别几乎无需为线程管理做什么事情
- 内核线程的管理成本显然要比用户线程高出很多
如果一个进程包含了大量的线程,那么它会给内核的调度器造成非常大的负担,甚至会影响到操作系统的整体性能
两级线程模型
两级线程模型的目标是取前模型之精华,也称为多对多(M:N)的线程实现
在此模型下,一个进程可以与多个KSE相关联,这与内核级线程模型相似
但与内核级线程模型不同的是,进程中的线程并不与KSE一一对应,这些应用程序可以映射同一个已关联的KSE上
首先,实现了两级线程模型的线程库会通过操作系统内核创建多个内核级线程。然后,它会通过这些内核级线程对应用程序线程进行调度
这是这样的设计,内核资源的消耗才得以大大减少,同时也使线程管理操作的效能提高不少