Appearance
题目
下列关于进程和线程的叙述中,正确的是( )。
错因
B
把进程和线程的角色反着记了。引入线程后角色分工是:进程是资源分配单位(地址空间、文件描述符表等以进程为单位)、线程是调度单位(CPU 调度看线程)。把两者位置颠倒是这道题最常见的错。
C
把系统级和用户级线程混为一谈。用户级线程的切换全在用户态线程库里完成(保存栈 / 改 PC / 恢复另一线程的栈),不需要内核——OS 看到的是整个进程,不知道里面有几个 ULT;系统级线程才需要内核切换。误以为两者都靠内核是抹平了 ULT 和 KLT 的关键差异。
D
线程是为了共享地址空间才引入的——同一进程内的线程共享代码段、全局变量、堆,只有栈和寄存器各自一份。如果各线程地址空间独立,那就是进程而不是线程了。
总解析
进程 vs 线程 的核心分工:
| 维度 | 进程 | 线程 |
|---|---|---|
| 资源分配单位 | 是(地址空间、FD 表、信号处理表) | 否 |
| 调度单位 | 没有线程时是 | 支持线程后是 |
| 地址空间 | 独立 | 同进程内共享 |
| 切换开销 | 大(要切地址空间) | 小(不切地址空间) |
关键澄清"是否支持线程"对进程的影响:
- 不支持线程的 OS:进程既是资源分配单位也是调度单位(早期 Unix)
- 支持线程的 OS:进程仍是资源分配单位,调度单位变成线程
→ 不管 OS 支不支持线程,进程始终是资源分配的基本单位。
逐项核对:
| 选项 | 描述 | 判定 |
|---|---|---|
| A | 不管是否支持线程,进程都是资源分配单位 | ✓ —— 进程的资源分配角色是不变的 |
| B | 线程是资源分配单位、进程是调度单位 | ✗ 反——角色颠倒 |
| C | 系统级和用户级线程切换都需内核 | ✗ ULT 切换不进内核 |
| D | 同进程内线程地址空间不同 | ✗ 反——线程定义就是共享地址空间 |
速记:"进程是资源的家、线程是 CPU 的脚"——家始终是进程一家人共享的(包括没有线程时进程一个人住),脚是看哪个线程在跑(调度)。
最终答案是 A。