2.2 操作系统:进程与并发
本篇定位:计算机系统基础篇的操作系统上篇。操作系统 9 年题量 1–7 题(波动大,2025 仅 2 题、2019 达 7 题),低位必考模块。本章(进程与并发)聚焦:进程/线程、并发与共享、死锁、处理机调度、信号量与 PV、进程通信——是操作系统的"灵魂"(并发是核心特征)。2024 年信号量/进程调度/页面置换"重点回归",2027 预测 2–3 题。 数据依据:
01-真题/考点汇总/9 份计算机考点汇总;答案以专业判断为准。 阅读提示:内存管理(页式/段式/虚拟存储)、文件系统、I/O 管理归 2.3 操作系统下篇;嵌入式 OS 归本章(进程模型简单、专用)。
一、考点定位(本章真题统计)
| 考点 | 真题锚点 | 频次 | 考法 |
|---|---|---|---|
| 进程管理 | 2019 单22、2020 单22、2024 单23 | 3 年 | 进程调度(就绪→运行)、PCB、进程唤醒(→就绪) |
| 死锁 | 2018 单34、2019 单23 | 2 年 | 死锁成因(资源分配不当/竞争独占资源) |
| 进程与线程 | 2018 单72、2019 单37 | 2 年 | 线程特性、线程共享(栈指针不共享) |
| 并发与共享 | 2018 单33 | 1 | 操作系统最基本特征=并发和共享 |
| 处理机调度 | 2019 多82、单60/61 | 1 年 3 题 | 三级调度组成(作业/中级/进程)、FCFS 偏向、分时时间片与响应时间 |
| 信号量与 PV | 2024 单22 | 1 | 信号量值语义(可用数/等待数) |
| 微内核 / 嵌入式 OS | 2021 单28、2026 单74 | 2 年 | 微内核特性、嵌入式系统特征 |
| 操作系统分类 | 2019 多81 | 1 | OS vs 应用软件 |
命题规律:进程与并发是操作系统最高频考点(几乎年年有)。考法:①概念辨析(进程状态、线程共享、死锁条件);②信号量数值(初值/当前值→可用数/等待数);③调度算法特性(FCFS 偏向 CPU 繁忙型作业)。2027 预测:进程状态转换、死锁四条件、PV 操作、调度算法(先来先服务/短作业优先/时间片轮转)。
二、知识框架(先搭骨架)
操作系统:进程与并发
├── 操作系统概述
│ ├── 定义:管理计算机资源、控制程序执行、为用户提供接口
│ ├── 基本特征:并发(宏观并行微观交替)和共享(互斥/同时)
│ ├── 分类:批处理/分时/实时;UNIX/Linux/Windows 是 OS
│ └── 体系结构:微内核(小而可靠,服务外置)vs 宏内核
├── 进程与线程
│ ├── 进程:程序的一次执行(动态);PCB=进程存在的唯一标志
│ ├── 状态:就绪→运行→阻塞(等待);唤醒→就绪
│ ├── 线程:进程内执行单元;共享代码/文件/全局变量,不共享栈
│ └── 引入线程目的:提高并发程度、提高系统效率
├── 处理机调度
│ ├── 三级调度:作业调度(高级,谁进内存)→ 中级调度(对换,谁留内存)→ 进程调度(低级,谁上 CPU)
│ ├── 频率:进程调度最高 / 中级居中 / 作业调度最低;作业调度控制多道程序度
│ ├── FCFS:利于 CPU 繁忙型作业、不利 I/O 繁忙型作业
│ ├── 时间片轮转:用户数越多 → 响应时间越长(越慢)
│ └── 短作业优先/优先级/多级反馈队列
├── 并发控制
│ ├── 临界资源(一次仅一个进程使用);互斥/同步
│ ├── 信号量:正=可用数、负=等待数;P 减不够则阻塞、V 加有人则唤醒
│ └── PV 语义:值>0 表示可用资源数;值<0 表示等待进程数
└── 死锁
├── 定义:进程互相等待对方占有的资源而无法推进
├── 四个必要条件:互斥/占有并等待/不可剥夺/循环等待
├── 产生原因:竞争独占资源(根本)+推进顺序不当(直接)
└── 处理:预防(破坏条件)/避免(银行家算法)/检测与解除
一句话记忆:OS 特征(并发共享)→ 进程线程(PCB/状态/线程共享)→ 调度(FCFS/时间片)→ 并发控制(信号量 PV)→ 死锁(四条件/资源竞争)。
三、考点详解
3.1 操作系统概述
精确定义:操作系统=管理计算机硬件与软件资源、控制程序执行、为用户和应用程序提供接口的系统软件。
基本特征(2018 单33):操作系统最本质的两个特征是并发和共享。并发=多个程序在同一时间间隔内交替执行(宏观并行、微观交替);共享=资源被多个进程共同使用(互斥共享/同时共享)。坑:虚拟、异步是特征但不是"最本质"的两个;"并发和不确定"不是。
操作系统分类(2019 多81):UNIX、Linux、MS DOS 是操作系统;MS Office 是应用软件。按工作方式分:批处理、分时(时间片轮转)、实时(硬实时/软实时)。
微内核(2021 单28):微内核只保留最基本功能(进程通信、基本调度、内存管理核心),其余服务(文件、设备驱动)外置为用户态进程——增强灵活性、可扩展性、可靠性、可移植性,适合分布式系统。坑:微内核不是"功能越全越好",恰恰相反是"内核最小化"。
容器 vs 虚拟机(2020 单37,六维必背):
| 维度 | 虚拟机(VM) | 容器(Docker 等) |
|---|---|---|
| 虚拟化对象 | 硬件(Hypervisor 虚拟出完整机器) | 操作系统层(共享宿主内核) |
| 是否含 Guest OS | 含完整 Guest OS | 不含 Guest OS,只有应用+依赖 |
| 隔离强度 | 硬件级,强 | 进程级(namespace+cgroup),弱于 VM |
| 体积 / 启动 | GB 级 / 分钟级 | MB 级 / 秒级 |
| 部署密度 | 低(每 VM 一套 OS) | 高(一台宿主跑很多容器) |
| 迁移与一致性 | 镜像大、迁移慢 | 镜像轻、环境一致性好 |
判断点(2020 单37):容器镜像不含 Guest OS(基础镜像的"OS"只是文件系统层,运行靠共享宿主内核);容器不是"轻量虚拟机"——它不模拟硬件。与 8.2 云计算的 IaaS(VM)/PaaS(容器平台)对应。
操作系统安全配置基线(2023 多91):最小化安装(只装必要组件)、关闭无用端口与服务、及时打补丁、开启审计与日志、遵循最小权限(日常用普通账号、不用管理员账号)、系统分区与数据分区分离(2025 单64 的"只用一个分区"=不安全)。
3.2 进程与线程
精确定义:
- 进程=程序的一次执行过程(动态性:有创建→就绪→运行→阻塞→终止的生命周期);PCB(进程控制块)是进程存在的唯一标志(2020 单22),存放进程标识、状态、寄存器现场、资源清单。
- 线程=进程内的一个执行单元(轻量级进程);一个进程可有多个线程。
进程状态转换(2024 单23):进程被唤醒 = 由阻塞(等待)状态变为就绪状态(等待的事件发生);就绪→运行靠调度;运行→阻塞靠等待事件(如 I/O)。
进程调度(2019 单22):进程调度负责从就绪队列中挑选一个进程分配 CPU(就绪→运行)。
线程的特性(2018 单72、2019 单37):
- 引入线程可提高程序并发执行程度、进一步提高系统效率(线程切换开销小于进程)。
- 线程不能脱离进程独立存在;一个进程可包含多个线程;线程不增大时空开销。
- 进程内各线程共享:代码段、打开的文件、全局变量(堆、数据区)——不共享各自的栈指针/栈(2019 单37 的坑:某线程的栈指针不共享)。
3.3 处理机调度(2019 多82、单60/61)
三级调度(2019 多82):CPU 资源的分配分三个层次——作业调度(高级调度)、中级调度(内存对换)、进程调度(低级调度)。判断层次就问三句:谁进门(作业进内存)、谁留内存(换入换出)、谁上 CPU(就绪→运行)。
| 对比项 | 作业调度(高级调度) | 中级调度 | 进程调度(低级调度) |
|---|---|---|---|
| 调度对象 | 作业(外存后备队列中的完整任务) | 进程(内存↔外存) | 进程(就绪队列) |
| 主要功能 | 挑选作业、分配内存等资源、创建进程进就绪队列 | 将暂不运行的进程换出内存(挂起)、空闲时换入 | 从就绪队列挑一个进程分配 CPU(2019 单22:就绪→运行) |
| 触发频率 | 低(涉及内存分配、动作重) | 中(内存紧张时换出、空闲时换入) | 最高(OS 最频繁的调度) |
| 所处位置 | 外存 → 内存 | 内存 ↔ 外存 | 就绪队列 → CPU |
| 核心作用 | 控制多道程序度(决定谁能"进门") | 调节内存压力、提高内存利用率(决定谁"留在楼里") | 决定 CPU 归属(决定谁"上会议室") |
| 常用算法 | FCFS、短作业优先(SJF)、高响应比优先(HRRN) | 对换策略 | 时间片轮转、优先级、多级反馈队列 |
记忆比喻:作业调度 = 大门保安(谁能进大楼 = 内存);中级调度 = 电梯管理员(楼里太挤,把人请到地下车库 = 外存挂起,有空再请回);进程调度 = 会议室调度员(谁进唯一的会议室 = CPU 发言)。 挂起态(衔接 3.2 状态模型):被中级调度换出的进程进入挂起状态(就绪挂起/阻塞挂起)——引入挂起态后,五状态模型扩展为七状态模型。 进程调度触发时机(衔接状态转换):时间片用完、进程主动放弃 CPU(请求 I/O)、更高优先级进程就绪、进程运行结束。 ⚠️ 干扰项辨析:三级调度只有这三层——没有"页面调度""线程调度"这类说法(2019 多82 错误选项套路)。
FCFS(先来先服务)(2019 单61):有利于 CPU 繁忙型作业,不利于 I/O 繁忙型作业。
- 两个名词先定死:CPU 繁忙型作业=绝大部分时间在做计算、极少请求 I/O(如科学计算);I/O 繁忙型作业=每次只用一小段 CPU、大量时间在等 I/O(如交互式作业、频繁读写磁盘)。差别只在"要 CPU 的方式",不在作业大小;进程调度语境下同一说法叫 CPU 繁忙型进程 / I/O 繁忙型进程。
- 为什么:FCFS 非抢占(CPU 一到手就跑到它自己让出)+严格 FIFO(做完 I/O 回来排到队尾)⇒ CPU 繁忙型作业可一次算完、不被打断;而 I/O 繁忙型作业每次从 I/O 回来都要重新排队等 CPU(有 k 次 I/O 就是多排 k+1 次队),且它卡在 CPU 队列里时 I/O 设备空转、CPU 与 I/O 无法重叠(护航效应 convoy effect)。
时间片轮转(2019 单60):时间片固定时,用户数越多,响应时间越长(每个用户分到的时间片间隔变长)。
五个常用算法对照(补强 · 术语补全,2027 高概率)
| 算法 | 抢占 | 机制(一句话) | 优点 | 缺点 / 风险 |
|---|---|---|---|---|
| FCFS 先来先服务 | 非抢占 | 按到达顺序发 CPU,跑完或主动让出才换 | 最简单、不会饥饿、开销小 | 护航效应;对短作业与 I/O 繁忙型作业最不利;平均等待时间不是最短 |
| SJF 短作业优先 | 非抢占 | 挑要求服务时间最短的先跑 | 平均等待时间最短(理论最优) | 长作业饥饿;须预知运行时间 |
| HRRN 高响应比优先 | 非抢占 | 挑响应比最高的(长作业等久了比值上升) | 长短兼顾,长作业不饥饿 | 每次要算响应比,开销略大 |
| 时间片轮转 RR | 抢占 | 每个进程只给一个固定时间片,用完排到队尾 | 响应快,适合分时/交互 | 片小→切换开销大;片大到能跑完就退化成 FCFS |
| 多级反馈队列 | 抢占 | 设多级就绪队列,用完本片时间片就降级,新进程进最高级,高级队列空了才服务低级 | 兼顾响应与吞吐,公认较优;I/O 繁忙型作业留在高优先级、轮转快 | 队列数/时间片等参数难调 |
四个必须说清的术语(原文只有名字,不许再糊着过)
- 响应比 = 1 +(等待时间 ÷ 要求服务时间):刚到达时为 1;响应比随等待时间变长而变大 ⇒ 长作业等着等着"变短"了,这就是 HRRN 不饥饿的原因。
- 饥饿(starvation):某作业/进程因优先级低或属于"长作业"而被无上限地推迟,始终轮不到 CPU——不是"永远排不上",而是"没有尽头地等"。
- 长作业 / 短作业:按**要求服务时间(运行时间)**划分,与 CPU 繁忙型/I/O 繁忙型是两把尺子——一个长作业完全可能 I/O 很多(例:大批量数据处理)。
- 带权周转时间 = 周转时间 ÷ 运行时间:衡量"等了几倍于自己运行时间的代价",比平均周转时间更公平(不受作业大小失真影响)。
⚠️ SJF 的抢占版=SRTN(最短剩余时间优先):新到进程的剩余时间比当前进程的剩余时间还短,就立即切换——常考"SJF 能否抢占"。 口诀:FCFS 保长饿短、SJF 保短饿长、HRRN 长短兼顾、RR 保响应、多级反馈全兼顾。
3.4 并发控制:信号量与 PV(2024 单22;2027 高概率回归)
精确定义:
- 临界资源:一次仅允许一个进程使用的资源(打印机、共享变量)——需互斥访问。
- 信号量(Dijkstra 提出):进程同步与互斥的工具——本质是整型变量 S(表示可用资源数或同步条件)+ 一个等待队列。
按取值分两类:
| 类型 | 取值 | 典型用途 |
|---|---|---|
| 一般(计数)信号量 | 0..n(可 >1) | 管理多个同类资源(初值 = 资源数) |
| 二元/互斥信号量 | 初值 1,只管理 1 个资源;无等待时取 0/1,有排队时转负(−1=1 个在等) | 实现互斥(初值 1)——"锁是特殊的二元信号量"是正确说法(2022 单53 选项,交叉呼应 4.5 数据库锁) |
二元(互斥)信号量的 0 / 1 究竟是什么状态(高频记反点):S =当前可用许可数,不是开关极性。
- 1 = 临界资源空闲可用(这就是初值取 1 的原因)→ P 成功即 0 = 已被占用、且无人等待 → 再有人 P 就 −1、−2…(绝对值=等待进程数)。
- ⚠️ 别记反:不是“0=空闲、1=占用”。初值若误设 0,则所有进程一 P 就阻塞、没人能进临界区(开局即死锁)。
- ⚠️ “二元”≠“只能取 0 或 1”:它只管理 1 个资源(初值 1),有排队时照样转负——与本节“负值绝对值=等待进程数”同一口径。
- 时间轴(初值 1,A/B/C 抢同一台打印机):
1→A:P0(A 进临界区)→B:P−1(B 等)→C:P−2(C 等)→A:V−2→−1唤醒 B →B:V−1→0唤醒 C →C:V0→1复原。- 与“锁”的对应:加锁=P(S) 成功(1→0)、解锁=V(S)(0→1,有等待者则唤醒一个) ⇒ “锁是特殊的二元信号量”成立(2022 单53)。
P 操作(wait,申请资源):
P(S):S = S − 1;if S < 0 → 当前进程阻塞,进入该信号量的等待队列
减 1 后 S < 0 = 资源不够 → 阻塞(这正是"负值绝对值 = 等待进程数"的来源);S ≥ 0 = 申请成功,继续执行。
V 操作(signal,释放资源):
V(S):S = S + 1;if S ≤ 0 → 唤醒一个等待进程(转入就绪队列)
加 1 后 S ≤ 0 = 说明加之前有进程在等 → 唤醒一个;S > 0 = 无人等待,只是资源计数 +1。
两条铁律:①P/V 是原子操作(执行中不可中断,否则并发出错);②PV 必须成对(有 P 无 V → 资源泄漏/死锁,有 V 无 P → 时序错乱)。
信号量数值语义(2024 单22,核心):当前值 >0 → 还剩 S 个可用资源;=0 → 资源刚好用完、无人等待;<0 → |S| = 正在等待的进程数。例:初值 5、当前值 2 → 可用 2、等待 0(选 B);当前值 −3 → 可用 0、等待 3。
记忆口诀:P 减一、不够就等;V 加一、有人就醒;正 = 可用、负 = 等待数。
3.5 死锁
精确定义:死锁=两个以上进程互相等待对方占有的资源而无限期阻塞的状态。
产生原因(2018 单34、2019 单23):
- 根本原因:多个进程竞争独占资源(2019 单23 选"多个进程竞争独占资源")。
- 直接原因:资源分配不当/推进顺序不当(2018 单34 选"资源分配不当")。
- 坑:P、V 操作过多不是死锁原因;没有 SPOOLing 不是死锁原因。
四个必要条件(2027 高概率,横向重点):①互斥(资源一次仅一进程用);②占有并等待(持有一个资源还等另一个);③不可剥夺(资源不能强占);④循环等待(形成等待环)。破坏任一条件即可预防死锁。
处理:预防(破坏四条件之一)、避免(银行家算法)、检测与解除(资源剥夺/撤销进程)。
四、易错坑汇总(命题人惯用陷阱)
- 操作系统最基本特征 = 并发和共享,不是"虚拟和不确定"(2018 单33)。
- 进程唤醒 = 阻塞→就绪(不是→运行,运行要等调度)(2024 单23)。
- PCB 是进程唯一标志;进程具有动态性(2019 单22、2020 单22)。
- 线程共享代码/文件/全局变量,不共享栈指针(2019 单37 的坑)。
- 信号量值语义:正=可用数、0=刚好用完且无人等待、负=等待数绝对值;互斥信号量初值 1(1=空闲、0=占用),别记反(2024 单22)。
- 死锁原因:竞争独占资源(根本)+资源分配不当(直接)——"P、V 操作过多""无 SPOOLing"不是(2018 单34、2019 单23)。
- FCFS 利于 CPU 繁忙型作业、不利于 I/O 繁忙型作业(2019 单61);时间片固定时用户越多响应越慢(2019 单60)。
- 微内核 = 内核最小化(服务外置),不是"功能越多越好"(2021 单28)。
- 三级调度:作业/中级/进程——别漏"中级"(2019 多82)。
- OS vs 应用软件:MS Office 是应用软件不是 OS(2019 多81)。
五、横向扩展(防漏网:本章边界内、真题尚未考但可能补考的点)
说明:横向扩展覆盖"大纲范围内但 9 年真题未考过"的知识,标注【新增概率】供取舍。
- 死锁四必要条件【高】:互斥/占有并等待/不可剥夺/循环等待——2018/2019 只考了成因,四条件判定是 2027 高概率(多选常考"哪个不是必要条件")。
- 银行家算法【中】:避免死锁的经典算法——安全序列判断(可能出简单计算/判定题)。
- 进程状态完整转换图【高】:创建→就绪→运行→阻塞→终止;就绪/运行/阻塞三态转换的条件(调度/时间片到/等待事件/唤醒)——2024 单23 已考唤醒,可考完整转换。
- 进程间通信(IPC)【中】:共享内存、消息传递、管道、信号——"哪种最快"(共享内存)类题。
- 临界区与互斥实现【中】:关中断、TS 指令(Test-and-Set)、PV 操作——互斥机制。
- 生产者-消费者问题【中】:经典 PV 应用题(两个信号量)——2024 信号量回归后可能考应用变体。
- 调度算法对比【高】:已在 §3.3 补五行对照表 + 四个术语定义(响应比公式/饥饿/长·短作业的划分/带权周转)+ SRTN 抢占版;要点=SJF 平均等待最短但长作业饥饿、RR 适合分时、优先级有饥饿问题、多级反馈队列公认较优——2019 考了 FCFS,2027 可能考 SJF/时间片对比。
- 进程与程序的区别【低】:动态 vs 静态、并发 vs 顺序、PCB 存在性——概念题。
- 实时操作系统(RTOS)【中】:硬实时(导弹制导,必须在期限内响应)vs 软实时(多媒体);嵌入式 OS(RTOS)2026 已考(扫地机器人),可考 RTOS 特征延伸。
- 系统调用【中】:用户态→内核态的接口(read/write/fork 等);用户态与内核态切换——与信息安全(权限管理)衔接。
六、真题演练(代表性真题 + 解析)
例 1(2024 单22) 某信号量初值为 5,当前值为 2,则表示(口径已核)。 A. 可用资源数为 5、等待进程数为 2 B. 可用资源数为 2、等待进程数为 0 C. 可用资源数为 3、等待进程数为 0 D. 可用资源数为 2、等待进程数为 3
答案:B。信号量当前值为正 → 表示剩余可用资源数 = 2、等待进程数 = 0。口诀:值为正=可用数、值为负=等待数(取绝对值)。
例 2(2019 单37) 关于线程,下列说法错误的是(口径已核)。 A. 同一进程内的线程共享代码段 B. 线程共享打开的文件 C. 线程共享全局变量 D. 线程共享各自的栈指针
答案:D。进程内线程共享代码段、打开的文件、全局变量(A/B/C 对);栈指针是每个线程私有的(不共享)——选 D(错误项)。口诀:栈私有、其余共享。
例 3(2018 单33) 操作系统最基本的两个特征是(口径已核)。 A. 并发和不确定 B. 并发和共享 C. 共享和虚拟 D. 虚拟和不确定
答案:B。操作系统最本质特征 = 并发和共享。口诀:OS 两本质——并发、共享。
例 4(2024 单23) 进程被唤醒意味着(口径已核)。 A. 进程变为运行状态 B. 进程变为阻塞状态 C. 进程变为就绪状态 D. 进程被终止
答案:C。唤醒 = 阻塞→就绪(等待的事件已发生);就绪→运行还需要进程调度(A 错)。口诀:唤醒进就绪、调度进运行。
例 5(2019 单23) 下列最易导致死锁的是(口径已核)。 A. 多个进程竞争 CPU B. 多个进程竞争独占资源 C. 进程间通信频繁 D. 作业调度不合理
答案:B。死锁根本原因 = 多个进程竞争独占(临界)资源;A 竞争 CPU 不会死锁(CPU 可剥夺);C/D 不是死锁直接原因。口诀:死锁看独占资源。
例 6(2019 单61) 先来先服务(FCFS)调度算法(口径已核)。 A. 有利于 I/O 繁忙型作业 B. 有利于 CPU 繁忙型作业 C. 对长作业不利 D. 平均等待时间最短
答案:B。FCFS 有利于 CPU 繁忙型作业(长 CPU 段一次做完)、不利于 I/O 繁忙型作业(频繁排队等待);C 说反(长作业先来先服务反而占优)、D 是 SJF 的特性。口诀:FCFS 照顾 CPU 忙的作业、SJF 等待时间短。
例 7(2019 单22) 进程调度主要负责(口径已核)。 A. 把作业调入内存 B. 从就绪队列中选一个进程分配 CPU C. 处理进程间的通信 D. 分配内存空间
答案:B。进程调度(低级调度)=从就绪队列选进程分配 CPU(就绪→运行);A 是作业调度(高级)、D 是内存管理。口诀:就绪队列→CPU 是进程调度的活。
例 8(2026 单74) 扫地机器人使用的操作系统最可能是(口径已核)。 A. 分时操作系统 B. 批处理操作系统 C. 通用操作系统 D. 嵌入式操作系统
答案:D。扫地机器人资源少、功耗低、功能专用 → 嵌入式操作系统(RTOS,实时性要求)。场景题:先看"资源/功耗/专用"三个关键词。
七、本章小结
- 一条主线:OS 特征(并发共享)→ 进程线程(PCB/状态/线程共享)→ 调度(FCFS/时间片)→ 并发控制(信号量 PV)→ 死锁(四条件/资源竞争)。
- 必背口诀:唤醒进就绪、调度进运行;三级调度=谁进门(作业)/谁留内存(中级)/谁上 CPU(进程);信号量正=可用负=等待;FCFS 照顾 CPU 忙的作业;死锁看独占资源。
- 必背区分:进程(动态/PCB)vs 线程(轻量/共享栈私有);微内核(小而可靠)vs 宏内核。
- 衔接预告:死锁与并发控制延续到 2.3 内存管理(页面置换 LRU);嵌入式 OS 与第 8 篇物联网衔接;进程权限与 7.3 身份认证衔接。