1. 线程的概念和作用
- 线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
- 引入线程之后,进程内的各线程之内也可以并发,从而进一步提升了系统的并发度。
- 引入线程之后,进程只作为除CPU之外的系统资源的分配单元(内存地址、打印机都是分配给进程的)。
2. 线程带来的变化
-
资源分配、调度
- 进程是资源分配的基本单位,线程是调度的基本单位。
-
并发性
- 进程内的各线程可以并发,提高系统并发性。
-
系统开销
- 线程间并发,在同一进程内的线程切换,不需要切换进程环境,系统开销减少。
3. 线程的属性
- 线程是CPU的调度单位。
- 多CPU计算机中,各个线程可占用不同的CPU。
- 每个线程都有一个线程ID、线程控制块(TCB)。
- 线程也有就绪态、阻塞、运行三种基本状态。
- 线程几乎不拥有系统资源,系统资源(除CPU)都是分配给进程的。
- 同一进程的不同线程间共享进程的资源。
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预。
- 同一进程中的线程切换,不会引起进程切换。
- 不同进程中的线程切换,会引起进程切换。
- 切换同进程内的线程,系统开销小;切换不同进程的线程,系统开销大。
4. 线程的实现方式
-
用户级线程
-
应用程序内部实现线程的管理。
-
线程切换不需要切换CPU的状态。
-
操作系统不能意识到用户级线程的存在
-
优缺点
- 优点:用户级线程切换在用户态即可完成,不需要切换到内核态,线程管理的开销小,效率高。
- 缺点:当一个用户级线程阻塞后,整个进程都被阻塞,并发度不高。多个线程不能在多核CPU上并行运行。
-
-
内核级线程
-
操作系统实现线程的管理
-
线程切换需要切换CPU的状态
-
操作系统能意识到内核级线程的存在
-
优缺点
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多个线程可以在多核CPU上并行运行。
- 缺点:用户进程会占用多个内核,线程切换由操作系统内核完成,需要切换CPU的状态,导致线程管理的开销大,成本高。
-
5. 多线程模型
-
一对一模型
-
一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
-
优缺点
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多个线程可以在多核CPU上并行运行。
- 缺点:用户进程会占用多个内核,线程切换由操作系统内核完成,需要切换CPU的状态,导致线程管理的开销大,成本高。
-
-
多对一模型
-
多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
-
优缺点
- 优点:用户级线程切换在用户态即可完成,不需要切换到内核态,线程管理的开销小,效率高。
- 缺点:当一个用户级线程阻塞后,整个进程都被阻塞,并发度不高。多个线程不能在多核CPU上并行运行。
-
注意点
- 操作系统只看得见”内核级线程“,只有内核级线程才是CPU分配的单位。
-
-
多对多模型
-
n个用户级线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。
- 克服了多对一模型并发度不高的缺点。
- 克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
-
6. 用户级线程和内核级线程的区别
- 用户级线程是”代码逻辑“的载体。一个”代码逻辑“只有获得”运行机会“才能被CPU执行。
- 内核级线程是”运行机会“的载体,只有内核级线程才是CPU分配的单位。
7. 总结
- 重点:线程的概念,与进程的区别。线程是CPU调度的最小单位。
- 重点:用户级线程与内核级线程的区别,内核级线程才是CPU分配的单位。
- 重点:多线程不同模型的特点
- 上述重点都是面试常问点
- 请各位大佬发现错误,能指导菜鸟小弟
- 菜鸟也想努力进大厂,加油