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

实现临界区互斥的基本方法

一、软件实现方法

        通过设置标志变量(如turnflag)协调进程进入临界区,核心是在进入区检查/设置标志,在退出区重置标志。

算法

核心思想

优点

缺点

违背准则

1. 单标志法

设置turn变量(0/1),仅允许turn=i的进程P_i进入临界区,退出时置turn=j

实现简单,严格互斥。

需交替进入,若P_i不进入,P_j无法进入。

空闲让进(临界区空闲时不允许合法进程进入)。

2. 双标志先检查法

设置flag[i]true表示P_i想进入),先检查对方flag[j],若false则置自己flag[i]=true进入。

可连续进入,无需交替。

检查和设置非原子操作:两进程可能同时通过检查,进入临界区。

忙则等待(多个进程同时进入临界区)。

3. 双标志后检查法

先置自己flag[i]=true,再检查对方flag[j],若true则等待。

避免同时进入(先占坑再检查)。

可能双方都置flag=true,导致互相等待,饥饿

空闲让进+有限等待(临界区空闲但进程无法进入)。

4. Peterson算法

结合flag(意愿)和turn(谦让):P_iflag[i]=trueturn=j(优先让对方),若flag[j]且turn=j则等待。

严格互斥,无饥饿,支持连续进入。

未实现“让权等待”(等待时CPU忙等)。

让权等待(可选准则,非必须)。


 

二、硬件实现方法

利用原子指令(不可中断的硬件操作)实现“检查+设置”的原子性,避免软件方法的逻辑漏洞。

1. 关中断
  • 机制:进程进入临界区前关中断(禁止CPU响应中断,避免进程切换),退出时开中断。
  • 优点:简单,绝对互斥。
  • 缺点
  • 关中断期间CPU无法切换,系统吞吐量下降(效率低)。
  • 仅适用于单CPU系统(多CPU无法通过关中断实现互斥)。
2. TestAndSet指令(TS指令)
  • 原子操作:读取lock值并置为true(一步完成,不可中断)。
bool TestAndSet(bool *lock) {
bool old = *lock;// 读取原值
*lock = true;// 设置为占用
return old;// 返回原值
}

互斥逻辑

  • lock初值false(空闲)。进程进入前调用TS(&lock)
  • 若返回false(之前空闲),则进入临界区;
  • 若返回true(已占用),则循环等待(忙等)。
  • 优点:适用于多CPU系统,实现简单。
  • 缺点:忙等(未实现“让权等待”),可能饥饿。
3. Swap指令
  • 原子操作:交换两个变量的值(如共享lock和局部key)。
void Swap(bool *a, bool *b) {
bool temp = *a;
*a = *b;
*b = temp;
}
  • 互斥逻辑
  • lock初值false,进程P_i设局部key=true,循环执行Swap(&lock, &key)
  • key变为false(交换前lockfalse),则进入临界区;
  • key仍为true(交换前locktrue),则继续循环。
  • 特点:与TS指令逻辑等价,优缺点相同(忙等,无让权等待)。

三、软件/硬件方法的共同缺陷

  1. 未实现“让权等待”:等待进程循环检查标志(忙等),浪费CPU资源。
  2. 可能饥饿:硬件方法中等待进程随机竞争,低优先级进程可能长期等待。

 

核心考点 📌

  1. Peterson算法的优势:唯一遵循“空闲让进、忙则等待、有限等待”三大准则的软件方法,是软件互斥的最优解(但仍忙等)。
  2. 原子操作的重要性:硬件方法通过原子指令(TS/Swap)将“检查+设置”合并为不可中断的操作,解决软件方法的逻辑漏洞。
  3. 让权等待的实现:软件/硬件方法均未实现(需后续信号量机制通过阻塞/唤醒实现)。

 

总结:✨

       软件方法通过标志变量(单/双标志法、Peterson算法)协调进程进入临界区,其中Peterson算法满足互斥、空闲让进和有限等待三大准则,但仍存在忙等问题。硬件方法(关中断、TS/Swap指令)利用原子操作确保互斥,适用于多CPU系统,但同样无法避免忙等和潜在饥饿。两类方法均未实现"让权等待",为后续信号量机制奠定基础。关键区别在于硬件方法通过原子指令解决了软件方案的逻辑漏洞,但都需结合更高级同步机制来优化资源利用率。

一句话总结:软件方法(如Peterson)通过标志协调互斥但存在忙等,硬件方法(TS/Swap)利用原子指令保证互斥但仍忙等,二者为信号量等高级同步机制奠定基础! ✨

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

相关文章:

  • MyBatis 进阶:连接池、动态 SQL 与多表关联查询
  • 不可告人的秘密- 1.0版 (字符串加密解密工具)
  • c++26新功能—copyable_function
  • windows内核研究(系统调用 二)
  • vue使用printJS实现批量打印及单个打印 避免空白页
  • Kubernetes 高级调度
  • SSM与SpringBoot面试题
  • Gin 中常见参数解析方法
  • 解锁48V USB-C供电潜力,慧能泰重磅推出PD3.2 DRP芯片HUSB253
  • 使用 SSH 连接 GitHub
  • UC浏览器PC版自2016年后未再更新不支持vue3
  • Grok-4 发布会图文总结
  • 【常见分布及其特征(1)】引言
  • 异步复习(线程)
  • CS144 lab2 tcp_receiver
  • Linux入门篇学习——Linux 编写第一个自己的命令,make 工具和 makefile 文件
  • C语言实现Linux命令行工具:VI和CAT
  • 飞算JavaAI进阶:重塑Java开发范式的AI革命
  • LGA核心板贴装指南:关键细节决定产品成败
  • MD2Doc转换器(基于Python)
  • Java 中的锁分类
  • 网页嵌入与接入功能说明
  • LeetCode经典题解:128、最长连续序列
  • Vue3 postcss-px-to-viewport-8-plugin
  • 力扣-21.合并两个有序链表
  • 【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南
  • (7)机器学习小白入门 YOLOv:机器学习模型训练详解
  • 「GRPO训练参数详解:理解Batch构成与生成数量的关系」
  • 如何使用数字化动态水印对教育视频进行加密?
  • 学习日记-spring-day46-7.11