osPV操作题目汇总

步骤:(前V后P)

1:明确题目中都有哪些进程,以及要做什么事情
2:找出其中的互斥关系,设置互斥信号量mutex(初值为1)
3:找出其中的同步关系,画出同步图,设置同步信号量并设初值
4:根据同步信号量写pv操作(别忘了设初值)

生产者消费者

一个生产者一个消费者,多个缓冲区
进程:生产者 消费者
互斥信号量:mutex(缓冲区)
同步信号量:full,empty,

在这里插入图片描述

  生产者                     消费者

 生产一个产品             P(full)
 P(empty)              P(mutex)
 P(mutex)             从缓冲区中取
 放入缓冲区              V(mutex)
 V(mutex)             V(empty)
 V(full)                消费        
 

多生产者多消费者

苹果橘子问题

实现“桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘子中放苹果(apple),妈妈专向盘子中N放橘子(orange),两个儿子专等吃盘子中的橘子,两个女儿专等吃盘子中的苹果。请用PV操作来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。”
进程:爸爸、妈妈、儿子、女儿
互斥:盘子
关系:
父亲放苹果 女儿才能取
母亲放橘子 儿子才能取
儿女把水果取走 父母才能放
在这里插入图片描述
在这里插入图片描述

吸烟者

进程:三个抽烟者 和一个提供的人
关系:
管理者放入1 1号吸烟者才可以取
管理者放入2 2号吸烟者才可以取
管理者放入3 3号吸烟者才可以取
吸烟者把东西取走 管理者才能放(类似于儿女取走 父母才能放)
假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、 第二个拥有纸、第三个拥有胶水。供应者进程无限地ᨀ供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)
在这里插入图片描述

哲学家进餐

在这里插入图片描述

读者写者问题

允许多个读者可以同时对文件执行读操作
写文件时不能有其他读者读,也不能有其他写者写

实现了读者和写者互斥 读者与读者不互斥(用if语句实现 可以多个读者一起读)
在这里插入图片描述
但是if语句在判断的时候如果两个读进程一起判断if=0 那就会执行两次pw操作从而两个一起阻塞,为了避免,在用一个pv操作对count值的判断进行加锁 在这里插入图片描述
如果此时一直有读进程进入的话,那么就会一直被读进程占有,对于写进程不公平在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

从缓冲区取奇偶数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

仓库中产品的存取存在限制

在这里插入图片描述在这里插入图片描述 mutex:每次只能放一个
只有B-A<N 才能继续向里边放A (sb初值设为N-1)
只有A-B<M才能继续向里边放B(B要少一点)(sa初值设为M-1)
在这里插入图片描述
在这里插入图片描述

面包师和推销人员

在这里插入图片描述
在这里插入图片描述

参观博物馆

在这里插入图片描述
在这里插入图片描述

工厂生产零件装配产品

在这里插入图片描述在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
对于装配车间刚开始有一个疑惑,为什么不是把full1 full2在前边直接减一,这样难道不会取完一个另一个没有了,这样阻塞问题怎么办呢?
回答:
如果全部在前边减一了,那么若F1为空,即使此时F2上有货物,但由于阻塞到F1 那里了,那么F2也没办法取
而如果分开减的话,若F1顺利取走,F2此时阻塞,那么进程F3就会阻塞,直到F2货架上有产品之后,F3顺利执行

老和尚和小和尚

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

三个进程同步的PV操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

银行顾客和营业员的PV操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NS汽车桥上通行问题(相当于两个读者)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自行车生产线加工自行车(生产消费+死锁;)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一个既是生产者也是消费者

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个问题对于既是消费者又是生产者的那个进程,不用考虑的太复杂,其实就是根据当前缓冲区的情况来决定到底是生产者还是消费者,加一个if语句就可以了

理发师和顾客问题

在这里插入图片描述
在这里插入图片描述

播放影片的PV操作

在这里插入图片描述
s是电影院变量,count分别读者共享
在这里插入图片描述

安全岛通行问题

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

公交车售票问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意s1,s2 不能都是1,如果都为1,两个p操作就都能进行了,失去同步关系,可以假定在开车状态,一个设1一个设0
也可以向答案中的那样,利用先v后p

信箱中取信问题

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值