【用软件方法实现临界区互斥】

用软件方法实现临界区互斥 —— 从基本概念到 Peterson 算法

在多进程(或多线程)环境中,多个进程可能需要访问同一资源。如果处理不当,资源会被“同时使用”,导致数据出错或系统行为异常。为了避免这种问题,我们需要互斥机制。本文将系统介绍相关概念、经典的软件互斥算法,并结合 Peterson 算法的执行顺序分析,帮助你建立完整的理解。


一、基本概念

1. 同步(Synchronization)

同步指的是多个进程在执行过程中需要协调先后顺序。

  • 例子:生产者必须先放数据到缓冲区,消费者才能取数据;否则会“取空”。
  • 解决目标:正确的执行顺序

2. 互斥(Mutual Exclusion)

互斥是同步的一种特殊情况:同一时间只允许一个进程使用共享资源。

  • 例子:两个人不能同时打印同一张文件,否则内容会乱。
  • 解决目标:同一时刻只有一个进程进入关键区域(临界区)

3. 临界资源(Critical Resource)

只能被一个进程独占访问的资源,称为临界资源

  • 例子:打印机、共享变量、文件写操作。

4. 临界区(Critical Section)

进程中访问临界资源的那段代码称为临界区

  • 目标:保证同一时刻最多只有一个进程在临界区内运行

二、使用软件实现互斥的思路

不依赖硬件指令,仅用普通变量和循环语句,也可以实现临界区互斥。经典方法主要有:

  1. 单标志法
  2. 双标志法(先检查、后检查)
  3. 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等待

五、总结

  1. 同步:协调先后顺序

  2. 互斥:同一时间只允许一个进程访问临界资源

  3. 临界资源:只能被独占使用的资源

  4. 临界区:访问临界资源的那段代码

  5. 软件互斥方法

    • 单标志法(效率低)
    • 双标志先/后检查法(先检查失效,后检查死锁)
    • Peterson 算法(互斥+无死锁,但忙等)

Peterson 算法通过 双标志 + turn 变量 实现互斥控制,不论执行顺序如何交错,都能保证:

  • 同一时刻只有一个进程进入临界区(互斥性)
  • 不会出现死锁(可达性)
  • 仍存在忙等问题(不满足让权等待)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yhame.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值