整体框架
1、什么是线程,为什么要引入线程?
还没有引入进程之前,各个程序只能串行执行
进程是程序的一次执行过程,但这些功能显然不可能是由一个程序顺序处理就能实现的
有的进程可能需要 “同时” 做很多事,而传统的进程只能串行地执行一系列程序。
为此,引入了 “线程”,来增加并发度。
引入线程后,线程成为了程序执行流的最小单位
可以把线程理解为 “轻量级进程” 。
线程 \color{red}线程 线程是一个 基本的 CPU 执行单元 \color{red}基本的\texttt{CPU}执行单元 基本的CPU执行单元,
- 也是 程序执行流的最小单位 \color{red}程序执行流的最小单位 程序执行流的最小单位。
引入线程之后,不仅是进程之间可以并发,
-
进程内的 各线程之间 \color{red}各线程之间 各线程之间也可以 并发 \color{red}并发 并发,
从而进一步 提升了系统的并发度 \color{red}提升了系统的并发度 提升了系统的并发度,
使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
引入线程后, 进程 \color{red}进程 进程只作为 除 CPU 之外的系统资源的分配单元 \color{red}除\texttt{CPU}之外的系统资源的分配单元 除CPU之外的系统资源的分配单元
- (如打印机、内存地址空间等都是分配给进程的)。
即:进程只作为分配资源的基本单位,而将线程作为调度的基本单位
2、引入线程带来的变化
3、线程的属性
例如:从 QQ 聊天窗口跳到 b 站视频就是不同进程之间线程的切换
4、线程的实现方式
4.1、用户级线程(User-Level Thread,ULT)
用户级线程由应用程序通过线程库实现。
所有的 线程管理工作 \color{red}线程管理工作 线程管理工作都由 应用程序负责 \color{red}应用程序负责 应用程序负责(包括线程切换)
用户级线程中,
-
线程切换 \color{red}线程切换 线程切换可以在 用户态下即可完成 \color{red}用户态下即可完成 用户态下即可完成,
无需操作系统干预。
在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。
- (用户级线程对用户不透明,对操作系统透明)
可以这样理解,“ 用户级线程 \color{red}用户级线程 用户级线程” 就是 “ 从用户视角看能看到的线程 \color{red}从用户视角看能看到的线程 从用户视角看能看到的线程”
4.2、内核级线程(Kernel-Level Thread, KLT)
又称 “内核支持的线程”
内核级 线程的管理工作 \color{red}线程的管理工作 线程的管理工作由 操作系统内核 \color{red}操作系统内核 操作系统内核完成。
线程调度、切换等工作都由内核负责,
- 因此 内核级线程的切换 \color{red}内核级线程的切换 内核级线程的切换必然需要在 核心态 \color{red}核心态 核心态下才能完成。
可以这样理解,“ 内核级线程 \color{red}内核级线程 内核级线程”就是 “ 从操作系统内核视角看能看到的线程 \color{red}从操作系统内核视角看能看到的线程 从操作系统内核视角看能看到的线程”
4.3、二者组合
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:
将 n
个用户级线程映射到 m
个内核级线程上( n >= m
)
重点重点重点 \color{red}重点重点重点 重点重点重点:
操作系统只 “看得见” 内核级线程,
- 因此只有 内核级线程才是处理机分配的单位 \color{red}内核级线程才是处理机分配的单位 内核级线程才是处理机分配的单位。
例如:
上述这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。
- 但即使该进程在一个 4 核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。
5、多线程模型
在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了 “多线程模型” 问题。
5.1、多对一模型
多对一 \color{red}多对一 多对一模型:
- 多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:
- 用户级线程的切换在用户空间即可完成,不需要切换到核心态,
- 线程管理的系统开销小,效率高
缺点:
- 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。
- 多个线程不可在多核处理机上并行运行
因为线程是处理机调度的基本单位,而不是资源分配的基本单位。多个用户级映射在一个内核级线程,内核认为仅有一个线程,当一个用户级线程被阻塞,内核认为所映射的内核级线程也被阻塞,故所有映射到该内核级的用户级线程都被阻塞
5.2、一对一模型
一对一 \color{red}一对一 一对一模型:
- 一个用户及线程映射到一个内核级线程。
- 每个用户进程有与用户级线程同数量的内核级线程。
优点:
- 当一个线程被阻塞后,别的线程还可以继续执行,并发能力强
- 多线程可在多核处理机上并行执行。
缺点:
- 一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,
- 因此线程管理的成本高,开销大。
5.3、多对多模型
多对多模型:n
用户及线程映射到 m
个内核级线程(n >= m
)。
- 每个用户进程对应
m
个内核级线程。
克服了多对一模型并发度不高的缺点,
- 又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。