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

进程同步机制-信号量机制-记录型信号量机制中的的wait和signal操作

waitsignal是记录型信号量机制中用于实现进程同步与互斥的两个重要操作,

wait 操作

wait(semaphores *S) {S->value --;if (S->value<0) block(S->list)
}
  • 请求资源S->value --; 这一步表示进程请求一个单位的资源,将信号量 S 的 value 值减 1 。比如信号量原本表示有 3 个空闲资源(value 为 3 ) ,执行这一步后,就表示剩余 2 个空闲资源 。
  • 判断与阻塞if (S->value<0) block(S->list) ,在资源数量减少后,判断 value 值是否小于 0 。如果 value 小于 0 ,说明当前没有足够的空闲资源供进程使用 。此时,block(S->list) 操作会将该进程阻塞,并把进程放入信号量 S 的等待队列 list 中 。例如,value 初始为 1 ,有两个进程先后执行 wait 操作,第一个进程执行后 value 变为 0 ,还能获取资源;第二个进程执行后 value 变为 -1 ,就会被阻塞放入等待队列 。
  • block方法:作用是将调用它的进程挂起,使其从运行态进入阻塞态 。在 wait 操作中,当信号量 S->value 小于 0 ,意味着没有足够资源,此时调用 block(S->list) ,把该进程添加到信号量 S 的等待队列 list 里 ,让其等待资源可用 。比如餐厅没座位了,顾客就得在候座区排队等待 。

signal 操作

signal(semaphores *S) {S->value++;if (S->value<=0) wakeup(S->list);
}
  • 释放资源S->value++; 表示进程释放一个单位的资源,将信号量 S 的 value 值加 1 。假设信号量 value 原本为 -2 (表示有 2 个进程在等待资源 ) ,执行这一步后,value 变为 -1 ,代表还有 1 个进程在等待,但资源数量增加了 。
  • 唤醒进程if (S->value<=0) wakeup(S->list); ,在资源数量增加后,判断 value 值是否小于等于 0 。如果 value 小于等于 0 ,说明等待队列中还有进程在等待资源 ,wakeup(S->list) 操作会从等待队列 list 中唤醒一个进程 ,让其有机会重新获取资源并继续执行 。比如 value 为 -1 时,执行此操作就会唤醒一个等待的进程 。
  • wakeup方法:功能是唤醒处于阻塞态的进程 。在 signal 操作里,当信号量 S->value 加 1 后小于等于 0 ,表明等待队列有进程在等资源,执行 wakeup(S->list) ,从等待队列中唤醒一个进程 ,让其从阻塞态变为就绪态 ,获得再次竞争 CPU 执行的机会 。就像餐厅有座位空出来,服务员从候座区叫一位顾客去就餐 。

总体而言,waitsignal操作通过对信号量 value 值的增减以及对等待队列中进程的阻塞和唤醒,实现了对资源的合理分配与管理,保障了进程间的同步与互斥 。

http://www.lryc.cn/news/2396226.html

相关文章:

  • gitlib 常见命令
  • Azure DevOps 管道部署系列之二IIS
  • Vue.js教学第十七章:Vue 与后端交互(一),Axios 基础
  • 人工智能浪潮下,制造企业如何借力DeepSeek实现数字化转型?
  • NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
  • 从线性代数到线性回归——机器学习视角
  • 计算机网络相关发展以及常见性能指标
  • 通义灵码:基于MCP的火车票小助手系统全流程设计与技术总结
  • 为什么建立 TCP 连接时,初始序列号不固定?
  • VBA数据库解决方案二十:Select表达式From区域Where条件Order by
  • NX753NX756美光科技闪存NX784NX785
  • 使用 pytesseract 构建一个简单 OCR demo
  • Cesium快速入门到精通系列教程三:添加物体与3D建筑物
  • git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)
  • 【CF】Day72——Codeforces Round 890 (Div. 2) CDE1 (二分答案 | 交互 + 分治 | ⭐树上背包)
  • 单片机寄存器的四种主要类型!
  • 智能嗅探AJAX触发:机器学习在动态渲染中的创新应用
  • 【计算机网络】Linux下简单的UDP服务器(超详细)
  • Java并发编程实战 Day 3:volatile关键字与内存可见性
  • 华为OD机试真题——报文回路(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • K8s工作流程与YAML实用指南
  • 功能丰富的PDF处理免费软件推荐
  • Java补充(Java8新特性)(和IO都很重要)
  • pycharm debug的时候无法debug到指定的位置就停住不动了
  • 分布式流处理与消息传递——Kafka ISR(In-Sync Replicas)算法深度解析
  • 极大似然估计例题——正态分布的极大似然估计
  • Pull Request Integration 拉取请求集成
  • OS10.【Linux】yum命令
  • 头歌数据库课程实验(角色管理)
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 1】【扫描关键函数 btif_dm_search_devices_evt 分析】