当前位置: 首页 > news >正文

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

用软件方法实现临界区互斥 —— 从基本概念到 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 变量 实现互斥控制,不论执行顺序如何交错,都能保证:

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

http://www.dtcms.com/a/332513.html

相关文章:

  • Java 正则表达式的使用方法
  • 力扣326:3的幂
  • NLP数据增强方法及实现-A
  • 【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)
  • 深入解析Java代理模式:灵活控制对象访问的核心技术
  • 配置国内加速源后仍然无法拉取镜像
  • 第五天~提取Arxml中CAN波特率属性New_CanCluster--Standard
  • C++面试——内存
  • 【LeetCode 热题 100】45. 跳跃游戏 II
  • 【swift】SwiftUI动画卡顿全解:GeometryReader滥用检测与Canvas绘制替代方案
  • 如何使用亚马逊云科技EC2服务部署语音转写系统
  • 自动驾驶系统“测试”的“要求”与“规范体系”
  • L4 级别自动驾驶 软件架构设计
  • Flask错误处理与会话技术详解
  • 什么是可信空间的全域节点、区域节点、业务节点?
  • python学习 调用硅基流动 对话模型接口 实现 流式输出
  • 剧本杀小程序系统开发:重构推理娱乐生态
  • Spring WebFlux 性能优化实践指南
  • DAY 46 通道注意力(SE注意力)
  • 穿越数学时空:微积分的前世今生与无限未来
  • [论文阅读] 人工智能 | 当Hugging Face遇上GitHub:预训练语言模型的跨平台同步难题与解决方案
  • python30-正则表达式
  • 【模型评估中的BLEU、ROUGE、Bertscore、BERT分别什么意思?】
  • 把 AI 装进“冰箱贴”——基于超低功耗语音合成的小屏电子价签
  • 双面盲文刻印机市场报告:需求增长与技术升级驱动行业发展​
  • 计组-单周期cpu与多周期cpu对比
  • 杭州网站建设,外贸独立站搭建攻略分享
  • System V通信机制
  • 博弈论06——PPAD复杂度问题
  • 47.分布式事务理论