2.2.2 线程的概念
本课核心知识点整理
本节导学
线程是进程概念向“更细执行单位”的推进。进程负责资源边界,线程负责执行流。一个进程可以包含多个线程,这些线程共享进程提供的地址空间、代码、打开文件等资源,但每个线程必须保留自己的执行现场,否则操作系统就无法在线程之间切换。
字幕里对线程的考试重点很明确:多线程操作系统中,问“哪些资源能被线程共享,哪些不能共享”。能共享的一般是进程级资源;不能共享的一般是每条执行流独立推进所必须的现场,例如栈、寄存器、程序计数器。
进程与线程的边界
| 概念 | 要点 |
|---|---|
| 进程 | 资源分配的基本单位 |
| 线程 | 进程内部的执行流 |
| 多线程 | 一个进程中包含多个线程 |
| 线程共享 | 同一进程内线程共享地址空间、全局数据、打开文件等 |
| 线程私有 | 每个线程有自己的程序计数器、寄存器和栈 |
进程像一个资源容器,里面有代码、数据、地址空间、文件句柄等;线程像容器里的执行路径,真正按指令流往前跑。一个进程内多个线程共享同一套资源,因此线程创建和切换通常比进程轻量,线程间通信也更方便。
为什么线程需要私有现场
同一进程内的线程可以共享代码和全局变量,但不能共享“执行到哪里”和“当前调用栈是什么”。如果两个线程共用同一个程序计数器,就无法表示它们分别执行到不同位置;如果共用同一个栈,就会把彼此的函数调用、局部变量和返回地址冲乱。
因此,线程私有内容通常包括:
- 程序计数器 PC:记录该线程下一条要执行的指令位置。
- 寄存器现场:记录该线程被切换出去时 CPU 寄存器内容。
- 栈:保存函数调用、返回地址、局部变量等执行上下文。
线程共享内容通常包括:
- 代码段和程序文件。
- 进程地址空间。
- 全局变量和堆中的共享数据。
- 打开的文件、部分进程级资源。
优势、代价与为什么需要同步
线程让一个进程内部可以并发处理多个任务,例如界面响应、后台计算、网络收发可以分别由不同线程执行。它比多个进程更轻量,因为不需要复制完整资源环境。
但共享也带来风险。多个线程同时修改全局变量或共享数据时,结果可能受执行时序影响,产生竞态条件。后面的 PV 操作、信号量、互斥与同步,本质上就是为了解决“共享资源如何安全使用”的问题。
高频判断表
| 题干关键词 | 优先判断 |
|---|---|
| 资源分配、独立地址空间 | 进程 |
| 调度、执行流、轻量级 | 线程 |
| 地址空间、全局数据、打开文件 | 同一进程内线程共享 |
| 程序计数器、寄存器、栈 | 线程私有 |
做题路线
- 看到“资源分配基本单位”,选进程。
- 看到“CPU 调度和执行的更小单位”,选线程。
- 问线程共享什么,优先选代码、全局变量、地址空间、打开文件。
- 问线程不能共享什么,优先选程序计数器、寄存器、栈。
- 看到共享数据被多个线程访问,要联想到互斥和同步问题。
例题
单选
CPU 调度时更细的执行单位通常是:
单选
关于同一进程内线程的说法,正确的是:
单选
资源分配的基本单位通常是:
自查要点
- 为什么线程比进程轻量?
- 线程共享哪些资源,又保留哪些自己的现场?
- “调度单位”和“资源分配单位”分别是谁?