计算机四级嵌入式之操作系统原理(四)并发与同步
(全国计算机等级考试 四级嵌入式系统开发工程师 考点精讲,2026最新视角)
NCRE 四级嵌入式系统开发工程师考试中,操作系统原理部分占分较大(通常 30-40 分左右),而并发与同步是重中之重,几乎每年必考大题(选择 + 填空 + 简答 + PV 操作分析)。
本节对应大纲:进程同步机制、死锁概念及解决方案(2025版大纲明确要求“深入理解”)。
1. 核心概念速记表(先背这些)
| 概念 | 定义 / 含义 | 关键特性 / 目的 | 典型考点 / 易错点 |
|---|---|---|---|
| 并发 | 宏观上多个程序“同时”运行(交替执行) | 提高资源利用率 | 并发 ≠ 并行;并发导致共享资源竞争 |
| 互斥 | 进程对临界资源一次只允许一个进程访问 | 避免数据不一致 | 临界区互斥原则:空闲让进、有限等待等 |
| 同步 | 进程间有依赖关系,必须按特定顺序执行 | 协作完成任务 | 生产者-消费者、读者-写者问题 |
| 临界区 | 进程中访问共享资源的代码段 | 必须互斥进入 | 临界区四原则(互斥、进步、有限等待、让权) |
| 临界资源 | 一次只允许一个进程使用的共享资源 | 打印机、共享变量、文件等 | — |
| 信号量 | 整型变量 + PV 原语(原子操作) | 实现互斥 & 同步 | 互斥:初值1;同步:初值0或资源数 |
| 管程 | 高级同步原语(封装 + 条件变量) | 比信号量更安全、更易用 | 条件变量 wait/signal |
| 死锁 | 一组进程互相等待对方释放资源,形成循环等待 | 四个必要条件同时满足 | 鸵鸟、预防、避免、检测+恢复 |
2. 进程同步与互斥的实现方式对比(选择题常考)
| 方式 | 实现难度 | 适用性 | 优点 | 缺点 / 问题 | 考点示例 |
|---|---|---|---|---|---|
| 软件方法 | 高 | 仅双进程 | 无需硬件支持 | 复杂、忙等待、可能死锁 | Dekker、Peterson 算法 |
| 硬件方法 | 中 | 多进程 | 简单、原子性 | 忙等待(自旋锁) | TSL(Test and Set Lock)、Swap |
| 信号量 | 中 | 多进程 | 灵活(互斥+同步) | 易出错(顺序错、初值错 → 死锁) | PV 操作、经典问题分析 |
| 管程 | 低 | 多进程 | 自动互斥、条件变量更安全 | 语言级支持(Java synchronized) | 条件变量、wait/signal |
四原则(互斥进入临界区必须满足):
- 互斥:同一时刻只有一个进程在临界区
- 进步:有进程想进且临界区空闲 → 一定能进
- 有限等待:等待时间有限(防饥饿)
- 让权等待(可选):进程不能进入时应让出 CPU
3. 信号量 & PV 操作(重磅!大题必考)
信号量 S:整数变量
- S ≥ 0:表示可用资源数
- S < 0:|S| 表示等待该资源的进程数
PV 原语(原子操作,不可中断):
- P 操作(wait / down):申请资源
S = S – 1
若 S ≥ 0,继续执行;
若 S < 0,进程阻塞,进入等待队列 - V 操作(signal / up):释放资源
S = S + 1
若 S ≤ 0,唤醒等待队列中一个进程
初值设置口诀(面试/大题必背):
- 互斥:信号量初值 = 1(一把锁)
- 同步(前驱后继):
- 后继进程等前驱完成:初值 = 0(V 在前驱,P 在后继)
- 生产者-消费者:缓冲区满信号量初值 = 0,空信号量初值 = 缓冲大小
经典问题 PV 操作模板(默写这些):
- 生产者-消费者(单缓冲 / 多缓冲)
mutex = 1 // 互斥访问缓冲区
empty = n // 空缓冲区数
full = 0 // 满缓冲区数
生产者:
P(empty)
P(mutex)
生产...
V(mutex)
V(full)
消费者:
P(full)
P(mutex)
消费...
V(mutex)
V(empty)
- 读者-写者(读者优先 / 写者优先) 读者优先(读读并发,写写/读写互斥):
- readcount = 0
- rmutex = 1(保护 readcount)
- wmutex = 1(写互斥) 读者:P(rmutex) → readcount++ → if(readcount==1) P(wmutex) → V(rmutex) … 读完 → P(rmutex) readcount– → if(readcount==0) V(wmutex) V(rmutex)
- 哲学家就餐(死锁典型案例)
4. 死锁(必考!)
死锁四个必要条件(缺一不可):
- 互斥条件:资源独占
- 请求与保持(Hold and Wait):占有资源同时请求其他
- 不可抢占:资源只能自愿释放
- 循环等待:形成环路
处理策略(选择 + 简答常考):
- 鸵鸟策略:忽略(Windows 很多资源死锁就这样)
- 预防:破坏四个条件之一(最彻底,但效率低)
- 资源静态分配(破坏请求保持)
- 按序申请(破坏循环等待)
- 避免:银行家算法(安全序列检测)
- 安全状态:存在一个进程序列,所有进程都能完成
- 每次分配前模拟检查是否进入不安全状态
- 检测 + 恢复:资源分配图 + 死锁检测算法 → 剥夺资源 / 终止进程
银行家算法考点:
- 最大需求矩阵 Max
- 已分配 Allocation
- 需求 Need = Max – Allocation
- 可用 Available
- 找安全序列:每次找一个 Need ≤ Available 的进程,假装它完成,释放资源,继续找…
5. 速成自测题(模拟真题)
- 信号量初值为 1,用于实现( )
A. 互斥 B. 同步 C. 两者都可 D. 两者都不可 - 生产者-消费者问题中,缓冲区大小为 10,则 empty 初值应为( )
A. 0 B. 1 C. 10 D. 11 - 死锁预防中,破坏“请求与保持”条件的方法是( )
A. 资源静态分配 B. 按序申请资源 C. 允许抢占 D. 银行家算法 - 下列哪个不是死锁必要条件?( )
A. 互斥 B. 有限等待 C. 请求与保持 D. 循环等待
答案:1.A 2.C 3.A 4.B
掌握这些,并发与同步 这章基本能拿 80%+ 分。下一节通常是内存管理(分区、分页、段页、虚拟内存),想继续要不要我直接出第五节笔记?或者有具体 PV 操作题 / 银行家算法想手撕 / 模拟题想刷,直接贴上来我帮你分析!