【操作系统】基于信号量与PV操作解决东西向汽车过独木桥问题

embedded/2024/12/24 7:46:52/

【操作系统】基于信号量与PV操作解决东西向汽车过独木桥问题

问题

东西向汽车过独木桥,为了保证安全,只要桥上无车,则允许一方的汽车过桥,待一方的汽车全部过完后,另一方的汽车才允许过桥。某一时刻,桥上可以有同方向的多辆车。试用信号量写出同步算法。

思路

定义信号量

  • bridge:表示桥的状态,初始值为1。
  • east:用于保护东向车辆计数的信号量,初始值为1。
  • west:用于保护西向车辆计数的信号量,初始值为1。
  • east_count:表示东向等待过桥的车辆数,初始值为0。
  • west_count:表示西向等待过桥的车辆数,初始值为0。

东向车辆过桥的过程

  1. 进入临界区:等待 east 信号量
  2. 增加东向车辆计数
  3. 如果是第一个东向车辆,等待 bridge 信号量
  4. 离开临界区:释放 east 信号量
  5. 过桥
  6. 进入临界区:等待 east 信号量
  7. 减少东向车辆计数
  8. 如果是最后一个东向车辆,释放 bridge 信号量
  9. 离开临界区:释放 east 信号量

西向车辆过桥的过程

  1. 进入临界区:等待 west 信号量
  2. 增加西向车辆计数
  3. 如果是第一个西向车辆,等待 bridge 信号量
  4. 离开临界区:释放 west 信号量
  5. 过桥
  6. 进入临界区:等待 west 信号量
  7. 减少西向车辆计数
  8. 如果是最后一个西向车辆,释放 bridge 信号量
  9. 离开临界区:释放 west 信号量

伪代码

semaphore bridge = 1;    // 桥的状态
semaphore east = 1;      // 保护东向车辆计数的信号量
semaphore west = 1;      // 保护西向车辆计数的信号量
int east_count = 0;      // 东向等待过桥的车辆数
int west_count = 0;      // 西向等待过桥的车辆数cobegin
process east_car() {while(true) {P(east);east_count++;if(east_count == 1) {P(bridge);  // 第一个东向车辆请求桥}V(east);cross_bridge();P(east);east_count--;if(east_count == 0) {V(bridge);  // 最后一个东向车辆离开桥}V(east);}
}
coendcobegin
process west_car() {while(true) {P(west);west_count++;if(west_count == 1) {P(bridge);  // 第一个西向车辆请求桥}V(west);cross_bridge();P(west);west_count--;if(west_count == 0) {V(bridge);  // 最后一个西向车辆离开桥}V(west);}
}
coend

http://www.ppmy.cn/embedded/148277.html

相关文章

Android Bootable Recovery 中的 `bspatch.cpp` 文件详解

Android Bootable Recovery 中的 bspatch.cpp 文件详解 引言 在 Android 系统中,Recovery 模式是一个非常重要的组件,它允许用户在设备启动时执行一系列的维护操作,例如系统更新、数据擦除、备份和恢复等。Android Bootable Recovery 的核心功能之一是处理增量更新(Delta…

开源软件兼容性可信量化分析

开源软件兼容性可信量化分析 课程:软件质量分析 作业 开源软件兼容性问题严重程度分成哪4级?分别表示什么风险?版本间兼容性可信度量公式什么?等级划分表是什么?阐述软件间兼容性测试框架以及面向Java和C的工具平台框…

Redis梳理

1、Redis是什么? Redis是开源的(BSD许可开源),内存数据结构存储,被用作数据库,缓存,消息队列。 它支持的数据结构像Strings,hashes,lists,sets,sorted set等范围查询数据结构,以及bi…

利用Java爬虫获取苏宁易购商品详情

在数字化时代,电商平台的商品信息对于市场分析、价格监控和消费者决策至关重要。苏宁易购作为中国领先的电商平台之一,提供了丰富的商品信息。本文将介绍如何使用Java语言开发爬虫,获取苏宁易购商品的详细信息。 Java爬虫技术简介 Java作为一…

Scala——身份证号码查询籍贯

object Test_身份证查询籍贯 { def main(args: Array[String]): Unit { val code "42005200210030051".substring(0,2) println(code) //判断42是哪个省的 //湖北 // if(code "42"){ // println("42对应省份为:湖北") // }else…

探索 AnythingLLM:借助开源 AI 打造私有化智能知识库

探索如何使用开源项目 AnythingLLM 构建私有化智能知识库。通过 RAG 技术,将文档转化为可检索向量,结合大语言模型实现高效问答,适用于企业与个人开发者。 阅读原文请转到:https://jimmysong.io/blog/building-private-ai-knowled…

VBA之正则表达式(48)-- 快速拆分中文语句

实例需求:对于任意一段文字,按照中文标点符号拆分为数组,并在立即窗口输出。 例如对于如下内容: 本文为博主原创文章,未经博主允许不得转载。访问本人博客123,测试完成VBE【立即窗口】中输出为&#xff1…

使用 OpenCV 训练自己的模型库并通过cv2引用实现摄像头跟踪

一、训练自己的模型库 数据收集 采集图像:收集包含要检测对象的大量图像,例如人脸、车辆、物体等。对于人脸检测,可从不同角度、光照条件、表情和背景下拍摄人脸照片,以增加数据的多样性和鲁棒性。标注图像:对收集到的…