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

进程同步机制-信号量机制-AND型信号量

用生活化的例子来解释AND 型信号量(也叫同时 wait 操作

1. 基本思想:“要么全给,要么都不给”

AND 型信号量解决的问题是:当一个进程需要多个资源时,必须一次性获得所有资源才能继续执行,否则就等待

生活类比
假设你要举办一场生日派对,需要同时准备:

  • 蛋糕(资源 A)
  • 气球(资源 B)
  • 蜡烛(资源 C)

如果只拿到蛋糕和气球,没有蜡烛,派对就没法开始。

AND 型信号量的规则是:只有当所有资源(蛋糕、气球、蜡烛)都准备好时,才会一起分配给你;否则你就得等着

2. Swait 操作:一次性请求所有资源

Swait(蛋糕, 气球, 蜡烛) {while (true) {if (蛋糕够 && 气球够 && 蜡烛够) {拿走一块蛋糕;拿走一束气球;拿走一盒蜡烛;开始派对;break;} else {// 只要有一个资源不足,就进入等待去"缺蛋糕"的队伍排队(如果蛋糕不够);或者去"缺气球"的队伍排队(如果气球不够);或者去"缺蜡烛"的队伍排队(如果蜡烛不够);// 等下次有资源可用时,重新检查所有资源}}
}

对应着

Swait(S1, S2, ..., Sn) {while (TRUE) {if (Si>=1 && ... && Sn>=1) { for (i = 1;i<=n;i++) Si--;  break;}else {place the process in the waiting queue associated with the first Si found with Si<1, and set the program count of this process to the beginning of Swait operation }}
}

Swait(S1, S2, ..., Sn) 中,if (Si>=1 && ... && Sn>=1) 语句判断所有信号量(代表不同资源 )是否都满足进程需求,只有全满足才分配资源,体现 “要么全给,要么都不给” 

是进程请求多种资源的操作。先检查所有信号量,都满足条件(Si>=1 )时,原子性地将所有信号量减 1 ,进程获取资源并继续;有任一信号量不满足,就把进程放入首个资源不足的信号量等待队列,后续重新检查分配。

关键逻辑

  • 原子性检查:只有所有资源都满足需求时,才会分配资源(Si--)。
  • 等待策略:如果某个资源不足,进程会被放入对应资源的等待队列,且必须等待所有资源都可用时才能继续

3. Ssignal 操作:一次性释放所有资源

Ssignal(蛋糕, 气球, 蜡烛) {归还一块蛋糕;归还一束气球;归还一盒蜡烛;// 检查等待队列:如果"缺蛋糕"的队伍有人,就唤醒他们;如果"缺气球"的队伍有人,就唤醒他们;如果"缺蜡烛"的队伍有人,就唤醒他们;
}

对应着

Ssignal(S1, S2, ..., Sn) {while (TRUE) {for (i = 1 ; i<=n;i++) {Si++;  Remove all the process waiting in the queue associated with Si into the ready queue. }}
}

 进程释放多种资源的操作。将所有信号量加 1 ,表示释放资源,然后检查各信号量等待队列,唤醒等待进程,被唤醒进程需重新执行Swait检查资源。

Si++; 释放资源;Remove all the process... 唤醒等待队列进程。

关键逻辑

  • 一次性释放:进程释放所有资源后,系统会检查每个资源的等待队列。
  • 唤醒策略:被唤醒的进程需要重新执行Swait,再次检查所有资源是否同时满足需求。

4. 为什么需要 AND 型信号量?

传统的信号量(如 PV 操作)允许进程一次只请求一个资源,这可能导致死锁。例如:

  • 进程 P1持有资源 A,请求资源 B;
  • 进程 P2持有资源 B,请求资源 A。

两者都在等待对方释放资源,导致死锁。

AND 型信号量通过一次性分配所有资源,避免了这种循环等待的情况:

  • 如果 P1 需要 A 和 B,它必须同时获得两者才能执行,否则就不占用任何资源。

5. 生活中的例子:会议室预约

假设公司有两种会议室:

  • 大会议室(需要预约,资源 A)
  • 投影仪(需要预约,资源 B)

员工必须同时预约到大会议室和投影仪才能开会。AND 型信号量的规则是:

  • 预约时:如果大会议室和投影仪都可用,同时分配给员工;否则都不分配。
  • 结束时:员工同时归还大会议室和投影仪,系统会检查等待队列中是否有员工可以同时获得这两个资源。

总结

AND 型信号量的核心是:要么一次性获得所有需要的资源,要么不获得任何资源。这种机制通过原子性的资源分配,避免了死锁和资源碎片化,确保进程在执行前拥有所有必要的资源。

http://www.xdnf.cn/news/9890.html

相关文章:

  • 特别篇-产品经理(三)
  • 数学概念解释数据集(200条)收集分享,为AI智能体应用助力~
  • 【Dv3Admin】工具CRUD混合器文件解析
  • 【SQL Server Management Studio 连接时遇到的一个错误】
  • 纵览网丨病毒学领域的 AI 变局:机遇、隐忧与监管之路
  • 5.28 孔老师 nlp讲座
  • 罗德里格斯公式动图演示
  • [ Qt ] | QPushButton常见用法
  • Allegro 版本查看和降版本
  • DeepSeek:不同模式(v3、R1)如何选择?
  • 三层架构 vs SOA vs 微服务:该选谁?
  • 华为云Flexus+DeepSeek征文 | 初探华为云ModelArts Studio:部署DeepSeek-V3/R1商用服务的详细步骤
  • 大型工业控制系统中私有云计算模式的弊端剖析与反思
  • 数据结构 - 数相关计算题
  • ZigBee 协议:开启物联网低功耗通信新时代
  • 【conda报错】InvalidArchiveError
  • 基于Session与基于Redis与Token验证码登录校验
  • 并查集 c++函数的值传递和引用传递 晴神问
  • <el-date-picker>配置禁用指定日期之前的时间选择(Vue2+Vue3)
  • 尚硅谷redis7 86 redis集群分片之3主3从集群搭建
  • 自动化测试实例:Web登录功能性测试(无验证码)
  • 《深度关系-从建立关系到彼此信任》
  • 自动脚本精灵 解锁会员版 v25.05.25 智能安卓自动点击脚本助手APP
  • 深入理解 SQL 的 JOIN 查询:从基础到高级的第一步
  • 【达梦数据库】会话sp_close关闭不掉
  • LLM:decoder-only 思考
  • 【从零开始学习QT】快捷键、帮助文档、Qt窗口坐标体系
  • 我用Qt+Python实现了个监控QQ消息自动下载文件处理的办公外挂程序
  • HTML 计算网页的PPI
  • nlp中的频率就是权重吗