【用软件方法实现临界区互斥】
用软件方法实现临界区互斥 —— 从基本概念到 Peterson 算法
在多进程(或多线程)环境中,多个进程可能需要访问同一资源。如果处理不当,资源会被“同时使用”,导致数据出错或系统行为异常。为了避免这种问题,我们需要互斥机制。本文将系统介绍相关概念、经典的软件互斥算法,并结合 Peterson 算法的执行顺序分析,帮助你建立完整的理解。
一、基本概念
1. 同步(Synchronization)
同步指的是多个进程在执行过程中需要协调先后顺序。
- 例子:生产者必须先放数据到缓冲区,消费者才能取数据;否则会“取空”。
- 解决目标:正确的执行顺序。
2. 互斥(Mutual Exclusion)
互斥是同步的一种特殊情况:同一时间只允许一个进程使用共享资源。
- 例子:两个人不能同时打印同一张文件,否则内容会乱。
- 解决目标:同一时刻只有一个进程进入关键区域(临界区)。
3. 临界资源(Critical Resource)
只能被一个进程独占访问的资源,称为临界资源。
- 例子:打印机、共享变量、文件写操作。
4. 临界区(Critical Section)
进程中访问临界资源的那段代码称为临界区。
- 目标:保证同一时刻最多只有一个进程在临界区内运行。
二、使用软件实现互斥的思路
不依赖硬件指令,仅用普通变量和循环语句,也可以实现临界区互斥。经典方法主要有:
- 单标志法
- 双标志法(先检查、后检查)
- Peterson 算法
三、经典软件互斥算法
1. 单标志法(Single Flag)
- 方法:用一个变量
turn
表示当前允许哪个进程进入临界区。 - 问题:进程只能“轮流”进入临界区,即使一个进程不想进,也必须“交班”,降低效率。
2. 双标志法(Two Flags)
使用数组 flag[2]
表示两个进程是否想进入临界区。
先检查法(Check First)
while(flag[j]); // 等对方退出
flag[i] = true; // 再宣布自己要进
问题:可能两个人同时检查到对方没进临界区,然后同时设置 flag → 互斥失效。
后检查法(Set First)
flag[i] = true; // 宣布自己要进
while(flag[j]); // 如果对方也想进 → 忙等
问题:可以保证互斥,但可能出现死锁:双方都设置 flag=true
后都在忙等,谁也进不去。
3. Peterson 算法(改进的双标志法)
在双标志基础上加了一个 turn
变量,表示“最后一次让对方优先”。
flag[i] = true;
turn = j; // 礼貌让对方
while(flag[j] && turn==j); // 忙等
/* critical section */
flag[i] = false;
- 优势:能保证互斥且避免死锁。
- 缺点:依旧是忙等(没有“让权等待”)。
四、Peterson 算法执行顺序分析
为了直观理解 Peterson 算法,我们考虑两个进程 P0 和 P1,分析几种交错执行顺序:
flag[i]=true
→ 进程 i 想进临界区(“举手”)turn=j
→ 如果双方同时举手,最后一次改 turn 的进程必须“等一下”while(flag[j] && turn==j)
→ 等对方用完
情况 1:1 → 2 → 3 → 6 → 7 → 8
- P0 先举手并让路 → 检查到对方还没举手 → 直接进入临界区
- P1 后举手并等待
结果:P0先进入,P1等待
情况 2:1 → 6 → 2 → 3 ...
- P0、P1先后举手
- P0最后说“让P1先”(turn=1) → P0等待
- P1再改“让P0先”(turn=0) → P1等待
- 最终 turn=0 → P0先进入
结果:P0先进入,P1随后进入(可能短暂忙等)
情况 3:1 → 3 → 6 → 7 → 8
- P0举手并检查 → 对方还没举手 → 直接进入临界区
- P1举手后等待
结果:P0先进入,P1等待
情况 4:1 → 6 → 2 → 7 → 8
- P0举手 → P1举手 → P0说 “让P1先” → P1说“让P0先”
- 最终 turn=0 → P1等待,P0进入
结果:P0先进入,P1等待
五、总结
-
同步:协调先后顺序
-
互斥:同一时间只允许一个进程访问临界资源
-
临界资源:只能被独占使用的资源
-
临界区:访问临界资源的那段代码
-
软件互斥方法:
- 单标志法(效率低)
- 双标志先/后检查法(先检查失效,后检查死锁)
- Peterson 算法(互斥+无死锁,但忙等)
Peterson 算法通过 双标志 + turn 变量 实现互斥控制,不论执行顺序如何交错,都能保证:
- 同一时刻只有一个进程进入临界区(互斥性)
- 不会出现死锁(可达性)
- 仍存在忙等问题(不满足让权等待)