PV操作大题强化

image.png

1.生产者消费者问题——进程间关系为“生产资源-消费资源”

解题步骤

  1. 分析有几类进程——每类进程对应一个函数
  2. 在每一个函数内部可以用中文描述动作(如果动作只做一次,就不用加while循环,如果动作要重复,就要加while循环)
  3. 分析每一个动作在做之前,需不需要P操作**(很多动作要先获取某种资源)(注意隐含的互斥,比如缓冲区的访问,要加P(mutex))**比如去食堂吃饭要先打饭,只要有P操作,必有V操作
  4. 所有PV写完以后,再去定义信号量,定义完信号量后再去思考每一个信号量的初值为多少
  5. 检查多个P连续出现的地方,是否可能产生死锁**(可以尝试调整P操作顺序)。如果某一个信号量PV操作总是连续出现,中间没有夹杂其他P操作,则不可能因为此信号量而产生死锁(破坏了请求和保持条件)**
  6. 读题检查,是否符合题意
//不夹杂其余P操作
P(mutex);
动作;
V(mutex);//夹杂其余P操作
P(mutex);
P(full);
动作;
V(empty);
V(mutex;
Semaphore rice=0;//米饭
Semaphore one=100;//碗	    然后把草稿中,米饭改为rice,碗改为one
同学(){		P(米饭);吃饭;V();}大师傅(){  while(1){P();打饭;V(米饭);
}}

例题1 生产零件,组装产品问题

image.png


生产者消费者问题
有三个进程
互斥:如果生产工人把产品要访问货架F1,那么装配工人就不能访问货架F1了
互斥:如果货架放满了,就不能再放了 
Semaphore empty1=10;//F1还可以放多少A零件;
Semaphore full1=0;//F1已经放了多少A零件;
Semaphore empty2=10;//F2还可以放多少B零件
Semaphore full2=0;//F2已经放了多少B零件
Semaphore mutex1=1;//对货架F1互斥访问
Semaphore mutex2=1;//对货架F2互斥访问
A(){while(1){生产A零件;//如果要把A零件放到货架上,则要看F1是否还有空位,并且要互斥访问F1,因为装配工人每一次只能把一个零件放到一个货架上// F1和F2要互斥访问P(empty1);p(mutex1);把A零件放到货架F1;V(full1);V(mutex1);
}
}B(){while(1){生产B零件;//如果要把B零件放到货架上,则要看F2是否还有空位,而且要互斥访问F2,因为装配工人每一次只能把一个零件放到一个货架上// F1和F2要互斥访问P(empty2);p(mutex2);把B零件放到货架F2;V(full2);V(mutex2);}
}装配车间(){while(1){//要申请A,要互斥访问F1P(full1);P(mutex1);从货架F1取出一个A零件;V(mutex1);V(empty1);//申请B零件,互斥访问F2P(full2);P(mutex2);从货架F2取出一个B零件;V(empty2);V(mutex2);把A零件和B零件组合成一个产品;}
}

标准答案
image.png

例题2 和尚取水问题

image.png

互斥访问:,井
而且去缸里面取水的时候,要看缸里面还有没有水
小和尚相当于生产者   老和尚相当于消费者
老和尚也要去缸里面拿桶取水,然后饮水Semaphore gang=1;//互斥访问缸;
Semaphore jing=1;//互斥访问井;
Semaphore empty=10;//缸中还能提多少水
Semaphore full=0;//已经提了多少水
Semaphore tong=3;//桶
小和尚(){while(1){//从井中提水首先要有桶 P(empty);//是否还能继续提水 P(tong);    //提水前要申请桶资源 P(); P(jing);从井中提水;V(jing);//互斥访问缸  //如果缸中水满了,就不能继续提水P(gang); 	//提水入缸提水入缸;V(gang);  V(tong);V(full);}
}老和尚(){
while(1){//要有桶才能喝水//缸中要有水才能喝水//要互斥访问缸P(full);P(tong);//申请桶P(gang);拿着桶到缸里面取水V(gang);V(empty);饮水;V(tong);}}

标准答案
image.png

2.理发师问题——进程间关系为“服务-被服务”

image.png
可以看成同步问题 服务业
你 理发师
生产者 消费者
image.png
image.png
image.png
image.png
通常要用一个变量来记录等待的顾客有多少个


理发师(){是否有顾客?无——>睡觉有——>提供服务while(1){if(num>0){//说明有顾客提供服务}else{睡觉;}}
}顾客(){理发师在忙?忙——>检查座位够不够,如果座位够,就坐下来等。如果不够,就离开不忙——>叫醒理发师}

3.读者写者问题——同类进程不互斥、异类进程互斥

:::info

  • 读者写者问题主要是解决互斥,他的访问关系分为两种题型,一种是可以同时访问(读和读),另外一种是必须互斥访问(写和读,写和写),因为多种关系,所以引入计数器count
  • 互斥:mutex。写过程是不容其他过程的,所以直接P(mutex),而读过程P(mutex)受计数器count影响。第一个读进程才需要P操作,最好一个读进程退出时负责V操作
  • rw:读写之间的互斥,对文件互斥访问。
    :::

例题1:车辆在桥上行驶问题

image.png

Semaphore bridge=1;
从南向北的车(){
//车要在桥上行驶,要占用桥资源,互斥访问桥P(bridge);在桥上行驶;车从桥上驶离;V(bridge);}
从北向南的车(){
//车要在桥上行驶,要占用桥资源,互斥访问桥P(bridge);在桥上行驶;车从桥上驶离;V(bridge);}
读者写者问题
允许一个方向有多辆车行驶
不允许两车交会
要占用桥资源
同类进程共享资源,不同类进程互斥使用资源Semaphore bridge=1;//互斥访问桥
int sn=0;//从南向北的车的数量
int ns=0;//从北向南的车的数量
Semaphore mutex_sn=1;//互斥访问sn
Semaphore mutex_ns=1;;/互斥访问ns
从南向北的车(){//使用sn要申请P(mutex_sn);//如果车的数量为0,则要申请桥资源,否则直接在桥上行驶if(sn==0){P(bridge);}//车数量+1sn++;V(mutex_sn);车在桥上行驶;//如果最后一辆车行驶过去,则释放桥P(mutex_sn);sn--;if(sn==0){v(bridge);}V(mutex_sn);V(sn);}从北向南的车(){//使用ns要申请P(mutex_ns);//如果车的数量为0,则要申请桥资源,否则直接在桥上行驶if(ns==0){P(bridge);}//车数量+1ns++;V(mutex_ns);车在桥上行驶;//如果最后一辆车行驶过去,则释放桥P(mutex_ns);ns--;if(ns==0){v(bridge);}V(mutex_ns);V(ns);}

image.png

例题2:猴子穿越峡谷

image.png


同一个方向可以有多只狒狒通过
同一时间不允许两个方向都有狒狒通过
读者写者问题Semaphore rope=1;//互斥访问绳索
Semaphore mutex_es=1;//用于保护es
Semaphore mutex_se=1;//保护se
int es=0;//从东到西穿越的狒狒个数
int se=0;//从西到东穿越的个数从东到西的狒狒(){//如果是第一只要穿越,要占用绳索P(mutex_es);if(es==0){P(rope);}es++;V(mutex_es);攀住绳子穿越峡谷;//如果最后一只穿越过去,则释放绳索P(mutex_es);es--;if(es==0){V(rope);}V(mutex_es);V(rope);}从西到东的狒狒(){//如果是第一只要穿越,要占用绳索P(mutex_se);if(se==0){P(rope);}se++;V(mutex_se);攀住绳子穿越峡谷;//如果最后一只穿越过去,则释放绳索P(mutex_se);se--;if(se==0){V(rope);}V(mutex_se);V(rope);}

例题3:录像厅问题

image.png
观看不同录像片的观众互斥使用录像厅
image.png

4.哲学家进餐问题——只有一类进程,每个进程需要同时拥有多种资源才能运行

思路

image.png
以后,如果在考试中,遇到一个进程需要一口气取走所有资源的题目,可以利用互斥变量mutex,
P(mutex);
申请各种资源;
V(mutex);
第三个思路最通用:
①将每种资源通过int类型的变量定义(使用变量将资源数量具象化)
②在进程开始运行时,先使用P(MUTEX)操作实现对各种资源进行互斥的访问,目的是逐一判断当前进程所需的各种资源是否满足运行的需要
③如果资源都满足,则拿走这些资源(一口气拿走),然后V(MUTEX),再执行动作
循环条件下:如果只要有一个资源不满足,则V(MUTEX),然后结束此次循环,进行下一次循环(continue);
只进行一次:如果只要有一个资源不满足,则使用goto语句返回函数的第一句重新进行判断(手动实现循环)
其中②实现同一时间只可能有一个进程在进行判断/拿走临界资源
最后完成动作归还资源时也要进行上锁,保证归还动作一气呵成的完成

第一步:定义锁  semaphore mutex = 1;    //互斥信号量,同时仅允许一个进程判断并拿走临界资源
第二步:定义资源数目 int a = n;    //用int类型表示各种资源int b = m;
代码模板Philosopher () {    //进行多次,while第三步:一口气拿走所有资源   while (1) {P(mutex);if (所有资源都足够) {    //资源够用,将所需资源分配给该进程,并解锁所有资源的int值减少;取xxx资源//一口气拿完所有资源V(mutex);//拿完资源以后解锁break;//跳出循环}  如果资源不够,就解锁,再循环尝试一次V(mutex);}//while循环结束
第四步:做进程该做的事,比如吃饭 
第五步:一口气归还所有资源P(mutex);    //完成动作后,归还资源归还所有资源,所有资源的int值增加V(mutex);}

干饭问题

俗话说,“干饭人,干饭魂,干饭人吃饭得用盆"。一荤、一素、一汤、一米饭,是每个干饭人的标配。饭点到了,很多干饭人奔向食堂。每个干饭人进入食堂后,需要做这些事:拿一个盆打荤菜,再拿一个盆打素菜,再拿一个盆打汤,再拿一个盆打饭,然后找一个座位坐下干饭,干完饭把盆还给食堂,然后跑路。现在,食堂里共有N个盆,M个座位。请使用P、V操作描述上述过程的互斥与同步,并说明所用信号量及初值的含义。

下面我们模仿哲学家进餐问题的第二种解决思路。在哲学家问题中,共有5个哲学家,如果我们限制“最多允许4个哲学家同时进餐",那么至少会有一个哲学家可以同时获得左右两只筷子,并顺利进餐,从而预防了死锁。

    同样的思路可以迁移到干饭人问题中。每个干饭人需要同时持有4个盆才能干饭,那么最糟糕的情况是每个干饭人都持有3个盆,同时在等待第四个盆。此时,但凡再多一个盆,就至少能有一个干饭人可以顺利干饭,就不会死锁。因此我们可以限制同时抢盆的人数为x,那么只要满足3x+1≤N,则一定不会发生死锁,可得x≤(N-1)/3。参考代码如下:


上面这种做法,限制了人数上限,且先拿盆,再占座,一定不会发生死锁。当然,如果先占座、后拿盆,也不会死锁。事实上,如果座位的数量满足seat ≤ (N-1)/3,那么甚至可以不设置专门的信号量x,完全可以先占座,后拿盆,也一定不会死锁。因为座位的数量就可以限制同时抢盆的人数。

    下面我们再模仿哲学家问题的第三种解决思路一—仅当一个哲学家左右两边的筷子都可用时才允许哲学家拿筷子。其实就是破坏了请求和保持条件,采用"静态分配"的思想,让进程一口气获得所有资源,再开始运行。代码如下:

2019年真题

image.png
image.png


Semaphore mutex=1;//互斥
int wan=m;//碗
int chop[n]={1,1,1...,1};//筷子
哲学家(){//一个哲学家把所有资源都获得以后,其他哲学家才能取资源while(1){P(mutex); //要先申请碗,先判断资源足不足够,如果资源不够就要释放锁if(wan<=0) {V(mutex);continue;}//判断筷子资源够不够if(!(chop[i]==1&&chop[i+1]==1)){V(mutex);continue;}//说明资源足够chop[i]=0;//取走左边筷子chop[i+1]=0;//取走右边筷子wan--;V(mutex);进餐还筷子chop[i]=1;chop[i+1]=1;思考;}}

5.单纯的同步问题——前驱后继图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【超详细】跑通YOLOv8之深度学习环境配置1

环境配置1下载安装内容如下&#xff1a; Anaconda&#xff1a;https://www.anaconda.com/download/success VScode&#xff1a;https://code.visualstudio.com/Download Pycharm&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows Visual Studio2019&a…

Linux 信号保存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 阻塞信号 1. 信号其他相关常见…

LLM-KERec

1、LLM-KERec整体框架 LLM-KERec系统包括传统推荐模块和基于LLM的互补知识增强模块。传统推荐模块负责召回候选商品、粗排过滤、精排和重排。LLM互补知识增强模块则包括实体提取器、互补图构造、E-E-I权重决策模型等&#xff0c;以整合互补知识&#xff0c;增强推荐效果。 2、…

周末可以做什么副业?

周末可以做很多种副业&#xff0c;具体可以根据个人兴趣和技能来选择。以下是一些常见的周末副业推荐 1. 线上销售 可以开设自己的网店&#xff0c;销售自己制作的产品、代理热门商品或者利用二手交易平台售卖闲置物品。 2. 做任务 空闲时间可以选择做的是百度的黑鲨阁&…

Pyecharts的编程环境准备

一&#xff0c;准备Python编程环境&#xff1a; Python版本&#xff1a;3.10以上&#xff0c;最高版本3.12 https://www.python.org/ 进入官网&#xff0c;点击downloads—>windows进入下载页面&#xff0c;搜索”3.10.6”找到指定版本&#xff0c;下载并安装64位Installer…

力扣HOT100 - 4. 寻找两个正序数组的中位数

解题思路&#xff1a; 两个数组合并&#xff0c;然后根据奇偶返回中位数。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int m nums1.length;int n nums2.length;int[] nums new int[m n];if (m 0) {if (n % 2 0) return (nums2…

C语言实现猜数字小游戏

1.随机数生成 要想实现猜数字小游戏&#xff0c;依赖于随机数的生成 1.1 rand()函数 这个函数是用来生成随机数的&#xff0c;返回值是正整数&#xff0c;他的值的范围是0到rand_max之间的&#xff0c;rand_max的值在大多数编译器上面是32767&#xff0c;rand()函数的使用必…

【5分钟学会一个知识点】01.Elasticsearch基本操作-增删改查

目录 【5分钟学会一个知识点-探索现代搜索与分析引擎的魅力】01.Elasticsearch基本操作-增删改查1.基本操作1.1索引操作1.2文档操作1.3查询1.4修改数据1.5查询1.5.1条件查询1.5.1.1遍历所有的索引1.5.1.2查询某个索引1.5.1.3条件查询1&#xff1a;使用GET url传参数1.5.1.4条件…

MySQL数据库基础(数据库操作,常用数据类型,表的操作)

MySQL数据库基础&#xff08;数据库操作&#xff0c;常用数据类型&#xff0c;表的操作&#xff09; 前言 数据库的操作1.显示当前数据库2.创建数据库3.使用数据库4.删除数据库 常用数据类型1.数值类型2.字符串类型3.日期类型 表的操作1.查看表结构2.创建表3.删除表 总结 前言 …

深入解析MySQL中的事务(下)

MySQL事务管理 3. 隔离性&#xff08;Isolation&#xff09;查看和设置隔离级别隔离级别作用域区别与解析 四种隔离级别解析小结 4. 一致性&#xff08;Consistency&#xff09;如何保持一致性 5.“保持原子性、隔离性、持久性就能保证一致性”的理解&#xff1a; 四、如何理解…

【高阶数据结构】并查集

并查集 并查集1、概念2、根据人找编号 / 根据编号找人&#xff08;简单介绍一下并查集&#xff09;&#xff08;1&#xff09;代码展示&#xff08;2&#xff09;调试结果&#xff08;3&#xff09;优化1&#xff1a;小的往大的合并&#xff08;4&#xff09;优化2&#xff1a;…

Linux下安装gmp6.2.1的详细操作(深度学习)

方式一&#xff1a;编译gmp GMP官方地址https://gmplib.org/ 1. 官网下载gmp安装包 2. 解压下载好的安装包 tar -zxvf gmp-6.2.1.tar.bz2 3. 进入解压后的文件夹 cd gmp-6.2.1 4. 指定安装路径进行安装 # /usr/local换成自己的安装路径 ./configure --prefix/usr/local 5. 编…

鸿蒙ArkUI-X跨平台开发电商应用

一、ArkUI-X 简介 ArkUI-X 是由 OpenHarmony TSC - 跨平台应用开发框架 TSG 所孵化的开源项目,使用ArkUI-X可以让开发者基于一套主代码, 就可以构建支持多平台的精美、高性能应用。目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。 ArKUI跨平台…

volatile 和 synchronzied 的区别

文章目录 概述volatilesynchornizedvolatile vs synchornized总结 概述 提起并发编程&#xff0c;我们不得不说起 volatile 和 synchronized 这两个关键字&#xff0c;这两个关键字也是面试中常常被问到的&#xff0c;下面我们分别介绍一下这两个关键字以及二者的异同。首先需要…

Java构造方法详解

在Java方法内部定义一个局部变量时&#xff0c;必须要初始化&#xff0c;否则就会编译失败&#xff0c;如下&#xff1a; 要让上述代码通过编译&#xff0c;只需在使用a之前给a赋一个初始值即可 如果是对象&#xff1a;下面用一个日期类演示 我们没有给年月日赋值&#xff0c;…

[通用人工智能] 论文分享:ElasticViT:基于冲突感知超网的快速视觉Transformer

引言: 近年来&#xff0c;视觉Transformer&#xff08;Vision Transformer&#xff0c;简称ViT&#xff09;在计算机视觉任务中的应用日益广泛&#xff0c;从图像分类到对象识别等&#xff0c;均显示出优越的性能。然而&#xff0c;ViT模型也面临一些挑战&#xff0c;特别是在模…

ASME美国机械工程师学会文献如何查询下载经验分享

一、ASME美国机械工程师学会数据库简介&#xff1a; ASME是世界上最大的技术出版机构之一&#xff0c;制定众多的工业和制造业行业标准。现在ASME拥有工业和制造行业的600项标准和规范&#xff0c;这些标准在全球90多个国家被采用。 ASME数据库包含25种专业期刊&#xff0c;其…

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词&#xff0c;近些年被玩坏了&#xff0c;共享单车,共享充电宝,共享办公室&#xff0c;共享雨伞… 甚至还有共享女朋友&#xff0c;真是人有多大胆&#xff0c;共享有多大产。但凡事太尽就容易恶心到人&#xff0c;自己也一度被 共享内存 恶心到了&am…

OpenHarmony 实战开发——轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 &#xff0c;进行轻量带屏开发板的标准移植&#xff0c;开发了智能开关面板样例&#xff0c;同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内…

论文AI率:检测原理是什么?该如何降低论文AI率?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 上一篇介绍了10个检测AI率的在线工具。本篇来说说AI率到底是如何检测出来的&#xff1f;该如何有效降低论文的AI率&#xff1f; 和AI大模型一样&#xff0c;AI检测的核心也是…