用户线程
管理线程的线程表TCB放在用户空间维护,操作系统是不直接参与的,⽽是由一组用户级别的线程库函数来完成线程的管理,包括线程的创建、终⽌、同步和调度等
优点:
- 可⽤于不⽀持线程技术的操作系统
- 不需要陷入内核,不需要上下文切换
- 允许每个进程有自己的定制调度算法
缺点:
- 由于操作系统不参与线程的调度,如果一个线程发起系统调用而阻塞,那进程所包含的用户线程就都 不能执行
- 如果一个线程开始运行,那么该进程中的其他线程就不能运行,因为系统的调度单位是进程
- 由于时间片的分配给进程,故与其他进程比,在多线程执行时,每个线程得到的时间片比较少,执行会比较慢
内核线程
管理线程的线程表TCB放在内核空间维护,线程的管理由操作系统负责
优点:
- 在一个进程中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行
- 分配给线程,多线程可以获得更多的CPU运行时间
缺点:
线程的创建、终止和切换都是通过系统调用来完成,系统开销大
轻量级进程(LightWeight Process)
由内核来支用户线程,一个进程可有一个或多个轻量级进程,每个量级进程由一个单独的内核线程来支持。 (Salaris/Linux)
1 : 1 模式
⼀个线程对应到⼀个 LWP 再对应到⼀个内核线程
优点:实现并⾏,当⼀个 LWP 阻塞,不会影响其他 LWP;
缺点:每⼀个⽤户线程,就产⽣⼀个内核线程,创建线程的开销较⼤
N : 1 模式
多个⽤户线程对应⼀个 LWP 再对应⼀个内核线程
优点:⽤户线程要开⼏个都没问题,且上下⽂切换发⽣在⽤户空间,切换的效率较⾼
缺点:⼀个⽤户线程如果阻塞了,则整个进程都将会阻塞,另外在多核 CPU 中,没办法充分利⽤ CPU
M : N 模式
多个⽤户线程对应到多 个 LWP,LWP 再⼀⼀对应到内核线程
综合了前两种优点,⼤部分的线程上下⽂发⽣在⽤户空间,且多个线程⼜可以充分利⽤多核CPU 的资源。
Linux的实现相对简单,采用1:1模式,Salaris采用M:N模式,实现相对复杂(待核实),有知道的可以下面评论