pv操作练习题
信号量解决五个哲学家吃通心面问题
题型一
有五个哲学家围坐在一圆桌旁,桌中央有盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子。

Semaphore fork[5]={1,1,1,1,1};
Semaphore footman=4;
//最多允许4个哲学家进程同时进行
cobegin
process philosopher_i(){/*i=0,1,2,3,4 */while(true){P(footman); Think(); P(fork[i]); P(fork[(i+1)%5]);Eat(); V(fork[i]); V(fork[(i+1)%5]); V(footman); }}
coend
题型二
哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论;在讨论的间隙四位哲学家进餐,每人进餐时都需使用刀、叉各一把,餐桌上的布置如下图所示。用信号量机制说明四位哲学家的同步互斥过程。

分析
标准的哲学家进餐问题,只是哲学家人数和餐具及分布与经典哲学家进餐问题略有不同
数据结构
semaphore fork1,fork2,knife1,knife2;
frok表示叉,knife表示刀,初值均为1
pa //哲学家甲
do{P(knife1);P(fork1);进餐;V(knife1);V(fork1);讨论问题;
}while(1);
pb //哲学家乙
do{P(knife2);P(fork1);进餐;V(knife2);V(fork1);讨论问题;
}while(1);
pa //哲学家丙
do{P(knife2);P(fork2);进餐;V(knife2);V(fork2);讨论问题;
}while(1);
pb //哲学家丁
do{P(knife1);P(fork2);进餐;V(knife1);V(fork2);讨论问题;
}while(1);
理发师问题
理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子
如果没有顾客,理发师便在理发椅上睡觉
一个顾客到来时,它必须叫醒理发师
如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开
int waiting=0;//等候理发顾客数
int CHAIRS=N; //为顾客准备的椅子数
semaphore customers,barbers,mutex;
customers=0;barbers=0;mutex=1;cobegin
process barber( ) {while(true) {P(customers); //有顾客吗?若无顾客,理发师睡眠P(mutex); //若有顾客时,进入临界区waiting--; //等候顾客数少一个V(barbers); //理发师准备为顾客理发V(mutex); //退出临界区cut_hair(); //理发师正在理发(非临界区)}
}process customer_i( ) {P(mutex); //进入临界区if(waiting<CHAIRS) { //有空椅子吗waiting++; //等候顾客数加1V(customers); //唤醒理发师V(mutex); //退出临界区P(barbers); //理发师忙,顾客坐下等待get_haircut(); //否则顾客坐下理发}else V(mutex); //人满了,走吧!
}
coend
运行过程:
- customer : p(mutex)
- customer : waiting
- customer : v(customers)
- barber : p(customers) → p(mutex) & waiting
- customer : v(mutex)
- barber : p(mutex)
- barber : wating - -
- barber : v(barbers)
- barber : v(mutex)
- customer : p(barbers)
- barber : cut_hair( )
- customer : get_haircut( )
生产者消费者问题
①一个生产者、一个消费者共享一个缓冲区 ②一个生产者、一个消费者共享多个缓冲区 ③多个生产者、多个消费者共享多个缓冲区
一个生产者、一个消费者共享一个缓冲区
int B;
semaphore empty; //可以使用的空缓冲区数
semaphore full; //缓冲区内可以使用的产品数
empty=1; //缓冲区内允许放入一件产品
full=0; //缓冲区内没有产品
****cobegin
process producer(){ while(true){ produce( ); P(empty); append( ) to B; V(full); }
}
coend****
****cobegin
process consumer(){while(true) { P(full);take( ) from B;V(empty);consume( );}
}
coend****
多个生产者/消费者、共享多个缓冲区的解
桌子上有一个盘子,可以存放一个水果。父亲总是放苹果到盘子中,而母亲总是放香蕉到盘子中;儿子专等吃盘中的香蕉,而女儿专等吃盘中的苹果。
item B[k];
semaphore empty;
empty=k;
semaphore full;
full=0;
semaphore mutex=1; //互斥信号量
int in=0; //放入缓冲区指针
int out=0; //取出缓冲区指针
cobegin
cobegin
process producer_i ( ){while(true) {produce( );P(empty);P(mutex);append to B[in]; in=(in+1)%k; V(mutex); V(full); }
}
coend
cobegin
process consumer_j ( ){ while(true) {P(full);P(mutex);take( ) from B[out];out=(out+1)%k;V(mutex);V(empty);consume( );}
}
coend
读者写者问题

有两组并发进程:读者和写者,共享一个文件F
允许多个读者同时执行读操作
任一写者在完成写操作之前不允许其它读者或写者工作
写者执行写操作前,应让已有的写者和读者全部退出
int readcount=0;//读进程计数
semaphore writeblock = 1;
semaphore mutex= 1;
cobegin
process reader_i( ){ P(mutex);readcount++; if(readcount==1)P(writeblock); V(mutex);{读文件};P(mutex);readcount--;if(readcount==0)V(writeblock);V(mutex);
}
coend
cobegin
process writer_j( ){P(writeblock);{写文件};V(writeblock);
}
coend
某小型超级市场有一个出入口,出入口处有80个篮子,每个购物者拿到一只篮子后可入内购物,购物结束后在出入口处结账,并归还篮子。出入口处禁止多人同时通行,试用信号量和P、V操作写出购物物者进程的同步算法
semaphore count=80,mutex = 1;
shopping( )//购物者进程{P(count) P(mutex) 进入超市购物 V(mutex)P(mutex)结账离开 V(mutex)V(count) }
某车站售票厅有一个售票窗口,窗口不允许同时有多个人买票,任何时刻最多可容纳20名购票者进入售票厅排队,当售票厅内已有20名购票者时,其余购票者需在外面等待。若把一个购票者看作一个进程,请回答下列问题:
(1)用PV操作管理这些并发进程时,写出信号量的定义及初值;
(2)根据所定义的信号量,在下面程序段中合适的位置加上PV操作,以保证进程能正确地并发执行。
semaphore mutex = 1 ;//用于购票窗口互斥
semaphore count = 20 ;//用于表示可容纳20人购票进程同步
cobegin
PROCESSPI(I=1,2,……)//购票者进程1,2.......{P(count) 进入售票厅;P(mutex) 购票;V(mutex); 退出;V(count);
}
coend
设公共汽车上,司机和售票员的活动分别如下:司机的活动:启动车辆:正常行车:到站停车。售票员的活动:关车门:售票:开车门。在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现它们的同步。
semaphore door = 0 , stop = 0 ;
process driver()
{P(door)启动车辆,正常行车车辆到站停车V(stop)
}
process saler()
{关车门V(door) 售票P(stop)开车门
}
另一个经典同步问题:吸烟者问题(patil , 1971 )。三个吸烟者在一个房间内,还有一个香烟供应者。为了制造并抽掉香烟,每个吸烟者需要三样东西:烟草、纸和火柴,供应者有丰富货物提供。三个吸烟者中,第一个有自己的烟草,第二个有自己的纸和第三个有自己的火柴。供应者随机地将两样东西放在桌子上,允许一个吸烟者进行对健康不利的吸烟。当吸烟者完成吸烟后唤醒供应者,供应者再把两样东西放在桌子上,唤醒另-一个吸烟者。试采用:(1 )信号量和P、V操作编写他们同步工作的程序。
Semaphore a=b=c=0,s=1;
Cobegin
Process P1(){while(1){P(a)卷烟,抽烟V(s)
}}Process p2(){while(1){P(b)卷烟,抽烟V(s)
}}Process p3(){while(1){P(c)卷烟,抽烟V(s)
}}Process supply(){
while(1){P(s)if(放烟草和纸) V(c)else if(放烟草和胶水) V(b)else V(a)
}}
Coend
相关文章:
pv操作练习题
信号量解决五个哲学家吃通心面问题 题型一 有五个哲学家围坐在一圆桌旁,桌中央有盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,…...
【小菜鸡刷题记】--字符串篇
【小菜鸡刷题记】:字符串 剑指 Offer 05. 替换空格剑指 Offer 58 - II.左旋转字符串剑指 Offer 20.表示数值的字符串剑指 Offer 67. 把字符串转换成整数 特此声明:题目均来自于力扣 剑指 Offer 05. 替换空格 题目链接 请实现一个函数,把字符…...
Sonar加入jenkins流水线
前提:已搭建sonarqube 1、配置sonarqube server jenkins 中manage jenkins-configure System配置sonarqube server 2、准备sonar环境 在jenkins项目的构建环境步骤中,勾选prepare SonarQube environment token需要提前在凭据里添加一个token 3、执行s…...
FSW26现金回收RS FSW43 信号和频谱分析仪
Rohde & Schwarz FSW26信号和频谱分析仪,2 Hz - 26.5 GHz 高性能 Rohde & Schwarz (R&S) FSW26 信号和频谱分析仪专为方便、准确和快速而设计。其独特的触摸屏、直观的多视图结果显示和优化的用户指南使 R&S FSW26 分析仪的操作高效方便。凭借其无…...
GraphPad Prism 9.5.1 for Mac 操作简便功能强大且实用的医学绘图分析工具
GraphPad Prism简介 GraphPad Prism是一款非常实用的统计软件,其功能非常强大,能够帮助用户进行各类科研数据的处理和分析,快速绘制出各种专业的图像和数据报告。 GraphPad Prism软件的用户界面非常友好,易于学习和操作…...
六. Activity启动模式
Task任务栈(ActivityTask) Activity属于App进程,但是Task属于操作系统,Task里面的Activity可以是属于不同的App的,所以App之间是可以相互调用的.比如:App里面可以使用打电话、地图等. 当我们查看手机后台运行的程序,他们其实就是一个个任务栈Task,我们平时可能会把他认为是一个…...
本机连接aws的ec2时报错:所选用户的用户密钥未在远程主机上注册
引言 由于工作的需要,所以需要去学习下AWS相关的知识,所以自己注册了一个AWS的账号去进行学习。 问题发现 按照启动ec2实例的步骤:选择镜像->选择系统配置->配置密钥对->配置安全组->设置存储卷大小->启动实例 在上述操作…...
谁看见我的猫照片了
今天分享一个可自由拖得动的图片效果样式。 先看效果: 谁看见我猫的照片了? 再上源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><st…...
数据结构与算法之深度优先算法详解
深度优先算法(Depth First Search,DFS)是一种常见的图形算法,它是一种用于遍历或搜索树或图的算法。在深度优先搜索中,我们首先探索一个子树的深度,然后再回溯到父节点,接着探索另一个子树的深度…...
C# 给winfrom窗体添加皮肤控件
如何快速给C# winform添加好看的皮肤C# Winform中窗体的美化 SkinEngine的应用 皮肤控件换肤素材包,IrisSkin2.dll皮肤素材资源下载 压缩包内一共有22种皮肤素材,使用说明:把控件拖到你的form上,只需一行代码,即可实…...
数据分析真的很火吗?真的有很多企业需要这样的岗位吗?求大佬指点。
“我是去年毕业的,因为疫情影响,整个就业环境都很不好,很多企业都裁员了。加上疫情三年基本都是玩过去,也没啥一技之长,就业就更难了。听说现在做数据分析的人很多,我身边的朋友都在转行做数据分析。 其实…...
100 个 Go 错误以及如何避免:9~12
协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【OpenDocCN 饱和式翻译计划】,采用译后编辑(MTPE)流程来尽可能提升效率。 真相一旦入眼,你就再也无法视而不见。——《黑客帝国》 九、并发实践 本章涵盖 防止 …...
用户/用户组管理
用户管理 * useradd 命令添加用户,会在/etc/passwd生成用户信息,信息分为7列,被6个冒号隔开 第一列 username (login name) 第二列 密码,但是该列已经被移除,用x表示,密码信息已经存放在了/etc/shadow文…...
如何进行TCP抓包调试?
网络调试工具——Wireshark Wireshark 是世界上应用最广泛的网络协议分析器,它让我们在微观层面上看到整个网络正在发生的事情。 Wireshark 本身是一个开源项目,所以也得到了很多志愿者的支持。同时,Wireshark 具有丰富的功能集,…...
分享一个国内可用的ChatGPT网站,免费无限制,支持AI绘画 - AI 百晓生
背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾🌋。 作为一个AI爱好者,翻遍了各大基于ChatGPT的网站,终于找到一个免费!免登陆!手机电脑通用!国内可直接对话的C…...
API安全性的要素与开发人员必修课测试
一、API安全性的要素主要包括以下几点: 1.身份验证和访问控制:API应该通过身份验证来验证请求的源,确保只有授权的用户或应用程序才能访问API。这可以通过使用API密钥、访问令牌、OAuth令牌或其他身份验证机制实现。 2.数据加密:A…...
leetcode 651. 4键键盘
651. 4键键盘 中等 102 company 微软 Microsoft company 谷歌 Google company 亚马逊 假设你有一个特殊的键盘包含下面的按键: A:在屏幕上打印一个 ‘A’。Ctrl-A:选中整个屏幕。Ctrl-C:复制选中区域到缓冲区。Ctrl-V:…...
Python垃圾回收机制
Python 运行过程中会不停的创建各种变量,而这些变量是需要存储在内存中的,随着程序的不断运行,变量数量越来越多,所占用的空间势必越来越大,如果对变量所占用的内存空间管理不当的话,那么肯定会出现 out of…...
Grafana插件安装并接入zabbix数据源(03)
一、在线安装插件 如果不指定插件安装位置,则默认安装位置为/var/lib/grafana/plugins;插件安装后需要重启grafana-server 安装zabbix插件alexanderzobnin-zabbix-app # grafana-cli plugins install alexanderzobnin-zabbix-app 使用--pluginsDir指定安装路径 # grafana…...
简述 JavaScript 中 prototype
简述 JavaScript 中 prototype 这篇笔记主要捋一下这么几个概念: JS 的继承构造函数new 的作用及简易实现__proto__ & prototype同样的方法,class 和 prototype 中分别是怎么实现的 基础概念 JS 是通过 prototype chaining 实现继承的语言&#…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
