Appearance
线程(内核级与用户级)
考情分析
线程是进程管理的重要概念,408 真题中常以选择题形式考查线程与进程的区别、ULT 与 KLT 的特性。属于 🔥🔥 中高频考点。
一个浏览器需要同时渲染页面、下载文件、响应用户点击。如果每个任务都开一个进程,进程间通信和切换的成本太高了——线程就是为了在同一个进程内实现更轻量的并发。
为什么引入线程
进程的创建、撤销和切换都涉及资源的分配与回收,开销很大。为了减小并发执行的开销,引入了线程(Thread)——一种更轻量的执行单元。
引入线程后的分工:
| 概念 | 职责 |
|---|---|
| 进程 | 资源分配的基本单位(内存、文件等) |
| 线程 | CPU 调度的基本单位 |
一个进程可以包含多个线程,这些线程共享进程的地址空间和资源,但各自有独立的栈、PC 和寄存器。
线程 vs 进程
| 比较维度 | 进程 | 线程 |
|---|---|---|
| 调度单位 | 传统OS中是调度单位 | 引入线程后,线程是调度单位 |
| 资源拥有 | 拥有独立的地址空间和资源 | 共享所属进程的资源 |
| 并发性 | 进程间可并发 | 同一进程内的线程也可并发 |
| 创建/切换开销 | 大(涉及资源分配) | 小(共享地址空间) |
| 通信 | 需要 IPC 机制 | 可直接读写共享变量 |
| 独立性 | 相互独立 | 同进程的线程共享资源,独立性弱 |
线程的属性
每个线程拥有的独立资源:
- 线程 ID
- 程序计数器 PC
- 寄存器集合
- 栈(每个线程有自己的栈空间)
线程共享所属进程的资源:
- 代码段
- 数据段
- 打开的文件
- 堆内存
- 全局变量
用户级线程 ULT
用户级线程(User-Level Thread)由用户空间的线程库管理,内核对线程的存在一无所知。就像公司内部的小组分工——HR 系统里只有一个"部门",部门内部谁干什么活,HR 不知道也不管。
| 优点 | 缺点 |
|---|---|
| 线程切换不需要进入内核态,速度快 | 一个线程阻塞 → 整个进程阻塞 |
| 可以在不支持线程的OS上实现 | 无法利用多核CPU(内核只调度进程) |
| 调度算法可由应用自定义 | — |
内核级线程 KLT
内核级线程(Kernel-Level Thread)由操作系统内核直接管理和调度。
| 优点 | 缺点 |
|---|---|
| 一个线程阻塞不会导致整个进程阻塞 | 线程切换需要进入内核态,开销较大 |
| 可以利用多核CPU并行执行 | 创建和管理线程开销大于 ULT |
内核级线程才是处理机调度的单位
只有内核级线程才能被操作系统调度到 CPU 上执行。用户级线程必须映射到内核级线程才能获得 CPU 时间。
多线程模型
| 模型 | 映射关系 | 特点 |
|---|---|---|
| 多对一 | 多个 ULT → 1 个 KLT | 线程管理在用户空间,效率高;但一个阻塞全部阻塞 |
| 一对一 | 1 个 ULT → 1 个 KLT | 并发性好,可利用多核;但创建线程开销大 |
| 多对多 | m 个 ULT → n 个 KLT(m≥n) | 兼顾两者优点,实现复杂 |
考研高频考点
- 🔥🔥🔥 线程是 CPU 调度的基本单位,进程是资源分配的基本单位
- 🔥🔥🔥 ULT vs KLT 的特性对比(尤其阻塞行为)
- 🔥🔥 三种多线程模型的区别
- 🔥🔥 线程共享哪些资源、独占哪些资源
- 🔥 ULT 中一个线程阻塞导致整个进程阻塞的原因
有了进程和线程的概念,接下来看操作系统是如何通过原语来实际控制进程的创建、撤销和状态转换的。