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 实现继承的语言&#…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...