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

26-OS-PV大题

生产消费者

六步骤:

一、明确进程分类

确定有几类进程,每类进程对应一个函数 ,清晰区分不同角色(如生产者、消费者,或案例里的 “同学、大师傅” )。

二、描述进程动作

在进程函数内部,用中文描述核心行为:

  • 若动作 “只做一次”,不加while(1)循环;
  • 若动作 “不断重复”,用while(1)包裹逻辑。

三、分析 PV 操作

梳理进程动作前是否需P操作(申请资源 / 锁):

  • 只要用P(申请),必须配对V(释放),保证资源 / 信号量正确回收;
  • 注意 “隐含互斥”,比如操作临界资源(共享变量、设备),需加P(mutex)等互斥信号量。

四、定义信号量

所有P/V逻辑写完后,再定义信号量(如Semaphore类型),并确定初始值

  • 需结合资源初始状态(如 “rice=0 、 one=100” ,根据生产 / 消费逻辑设置 )。

五、检查死锁风险

重点看连续P操作

  • 若多个P连续出现,尝试调整顺序,避免循环等待;
  • 若某信号量P/V“连续且无其他P插入”,因不破坏 “请求和保持”,一般不会死锁。

六、验证题目要求

最后读题复盘:确认进程逻辑、PV 配对、资源交互是否贴合题目场景(如生产消费流程、资源数量约束等 ),保证模型满足需求。

核心逻辑:通过 “分类→动作→PV→信号量→死锁→验证” 六步,逐步搭建进程同步模型,用 PV 操作解决 “生产 - 消费” 的资源协调问题,同时规避死锁风险 。

同步问题和生产消费同时完成:

定义五类:

// 进程A:独立执行,完成后释放信号量通知后续进程
A() {操作A;                  // 进程A的核心任务(无前置依赖)V(A完成);              // A执行完毕,释放" A完成 "信号量(值+1)
}// 进程B:独立执行,完成后释放信号量通知后续进程
B() {操作B;                  // 进程B的核心任务(无前置依赖)V(B完成);              // B执行完毕,释放" B完成 "信号量(值+1)
}// 进程C:依赖A和B完成后才能执行
C() {P(A完成);              // 等待A执行完毕(若A未完成则阻塞)P(B完成);              // 等待B执行完毕(若B未完成则阻塞)操作C;                  // 只有A和B都完成后,才能执行C的任务V(C完成);              // C执行完毕,释放" C完成 "信号量(值+1)
}// 进程D:独立执行,完成后释放信号量通知后续进程
D() {操作D;                  // 进程D的核心任务(无前置依赖)V(D完成);              // D执行完毕,释放" D完成 "信号量(值+1)
}// 进程E:依赖C和D完成后才能执行
E() {P(C完成);              // 等待C执行完毕(若C未完成则阻塞)P(D完成);              // 等待D执行完毕(若D未完成则阻塞)操作E;                  // 只有C和D都完成后,才能执行E的任务
}

哲学家进餐(只有一种资源才能运行)

操作模板:使用int变量表示资源

// 定义互斥大锁(用于资源操作的同步)
semaphore Lock = 1; // 定义各类资源的剩余数量
int a = 9;  // 资源a剩余数量
int b = 8;  // 资源b剩余数量
int c = 5;  // 资源c剩余数量Process() {while(1) {P(Lock);  // 申请锁,进入临界区// 检查所需资源是否充足if(所有资源都满足需求) {// 按需求减少对应资源的剩余数量各类资源int--;  // 具体减少数量根据题目要求确定// 一次性获取所有所需资源取对应资源;V(Lock);  // 释放锁,退出临界区break;    // 成功获取资源,跳出循环}V(Lock);  // 资源不足,释放锁,等待下次尝试}// 执行进程的核心任务(例如:哲学家进餐)做进程该做的事;P(Lock);  // 申请锁,进入临界区// 一次性归还所有资源,恢复资源剩余数量各类资源int++;  // 归还数量与之前获取的数量一致V(Lock);  // 释放锁,退出临界区
}

 

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

相关文章:

  • 重生之我在暑假学习微服务第十一天《配置篇》+网关篇错误订正
  • 启动VScode调试时报错:go命令的版本是1.23.0,而工具链的版本是1.23.6
  • IDEA 2025下载安装教程【超详细】保姆级图文教程(附安装包)
  • 华硕携多款明星电竞显示器亮相 ChinaJoy2025,联袂 TCL 华星打造沉浸体验
  • [Oracle] SIGN()函数
  • 微信小程序最大层级跳转问题
  • 使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更
  • Kubernetes(k8s)之容忍与污点
  • Java学习第一百零九部分——Jenkins(一)
  • k8s +cilium+metallb 集群流量走向
  • 嵌入式学习的第四十四天-ARM
  • Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水线
  • Packets Frames 数据包和帧
  • docker-compose快速部署启动file beat+ELK
  • 企业级Linux服务器安全:防火墙规则配置与Web/SSH服务优化指南
  • 机器学习④【算法详解:从决策树到随机森林】
  • 【Graphiti MCP Server 配置与使用教程 (优化版)】
  • 了解SELinux
  • CGAL中函数squared_distance使用细则
  • 数据安全框架规划图
  • 【LeetCode 热题 100】347. 前 K 个高频元素——(解法三)桶排序
  • 使用R将nc文件转换为asc文件或者tif文件
  • C语言控制语句练习题2
  • KVazaar:开源H.265/HEVC编码器技术深度解析
  • vcpkg: 一款免费开源的C++包管理器
  • 【开源分享】can-utils:深入解析 Linux CAN 工具集
  • UE编辑器相机窗口运行时相机fov 大小不一致
  • 毕业设计选题推荐之基于Spark的在线教育投融数据可视化分析系统 |爬虫|大数据|大屏|预测|深度学习|数据分析|数据挖掘
  • css margin属性auto原理
  • 海康威视相机,MVS连接成功,但无图像怎么办?