操作系统 PV同步问题 每日一题 合集

本文详细探讨了信号量在并发编程中的工作机制,包括PV操作、互斥锁、生产者消费者问题、读者写者问题以及哲学家问题的解决方案,强调了同步和资源管理在避免死锁中的关键作用。
摘要由CSDN通过智能技术生成

原作者链接

第0题-信号量的工作机制

在这里插入图片描述

考试时PV有两种
第一种,虽然也是资源,但这种PV用来上锁,A这个事情不想被其他进程打扰,那么就前面P一下后面V一下,也就是上锁mutex
互斥
在这里插入图片描述
第二种,在做B这件事情前必须有A这个资源
同步
在这里插入图片描述
其实还有一种计数问题,count

第1题-wait和signal的同步

在这里插入图片描述
(1)因为信号量S 是能够被多个进程共享的变量,多个进程都可以通过wait()和signal() 对S 进行读、写操作
(2)1不正确,在wait()中,当s<=0时,关中断后,其他进程无法修改s的值,while语句陷入死循环。方法2是正确的
(3)不能,因为开/关中断指令都是特权指令,不能在用户态下执行,只能在内核态下执行

第2题-生产者消费者问题1

在这里插入图片描述
这类问题的典型特征就是一个人要和另一个人相互配合,B需要A提供的,A也需要B提供的

缓冲区一般要互斥,这里有一个互斥关系

“缓冲区大小”、“产品数量上限”,“多少个东西“,一般见到这种数量,都需要声明两个变量,信号量empty、full

对于生产者来说,empty也是一种资源,它需要申请empty才能放
而消费者需要full这种资源

对于缓冲区这个临界资源的互斥关系,必须“夹最紧的地方”,能夹最少就夹最少。否则死锁

如果缓冲区大小为1,可以写更简略。empty为1时,empty只有1个因此当一个生产者P的时候其他生产者P不了,且empty为1的时候full肯定是0,因此临界区最多只会有一个人,所以不需要mutex了。full为1也同理。

在这里插入图片描述

第3题-生产消费2

在这里插入图片描述
看每个人需要什么和提供什么
需要什么就是P什么

这道题缓冲区大小也是1,所以不需要mutex了

在这里插入图片描述

第4题-复杂的生产消费者

在这里插入图片描述

(1)empty是信号量,也就是一种资源,因此可以是负的,所以最小不是0

(2)原先mutex不仅防止消费者也防止生产者,现在不需要防生产者了,所以用不同的变量即可

(3)限制条件是限制消费者而不是生产者
在这里插入图片描述

第5题-读者写者1

在这里插入图片描述
(2)
count表示里面有没有读者,如果没有则需要和写者竞争,如果有直接进去读就可以了。第一个人开门,最后一个人关门

if会导致两个人同时满足条件,所以要有一个锁把这个判断给锁上,这个锁只是用来防止其他读者的

但这样有一个问题,只要里面有读者,排在后面的读者可以直接插写者的队,因此这是读者优先的

在这里插入图片描述

第6题-读者写者2

在这里插入图片描述
要读写公平,只需要再创建一个公平队列,先排这个公平队列,出来后才可以排之前那个不公平的队列

写者的V(w)应该不止一处可以放
但注意读者还是要能同时读这一条件的,因此读者中V(w)在读文件前
在这里插入图片描述

第7题-写者优先

在这里插入图片描述
把那个公平的队列w改成写者可以插队的队列即可

在这里插入图片描述

第8题-双读者问题

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

第9题-流程问题

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

第10题-流程问题2

在这里插入图片描述

T1中
signal(E);然后紧接着wait(E);因此这两个直接抵消了
在这里插入图片描述

第11题-流程3

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

第12题-流程4

在这里插入图片描述
1给2的平衡木虽然足够多,但由于2需要拿到这个才能过河,因此平衡木也是一个信号量
独木桥也是信号量
而船不是信号量

还有一个可写可不写的信号量,就是1要等2过河,因此P(过河)

在这里插入图片描述

第13题-哲学家问题

在这里插入图片描述
死锁版:
在这里插入图片描述
改进1:
不让5个人同时拿,比如规定最多同时有四个人拿。
因此将“拿筷子”这件事情也看成一种资源

改进2:
锁桌子
就是自己拿的时候不允许其他人拿

在这里插入图片描述
改进3:改变拿筷子顺序,使12为竞争对手,34为竞争对手,还剩下一些筷子
在这里插入图片描述

第14题-408真题哲学家2

在这里插入图片描述
思考如果m大于等于n,谁都可以拿到;只有小于n的时候才有用

注意它这里说“为使尽可能多的哲学家同时就餐”,就是说上一题的那个锁桌子方法行不通

如果m小于n,应该要先拿碗。且这个时候拿到碗就相当于上一题中有吃饭的资格,因为碗的数量小于等于n-1了,就是限制了能拿筷子的人数
因此m大于等于n的时候,是n-1
在这里插入图片描述

第15题-读程序

在这里插入图片描述
在看两个程序是否同步异步时,就是要看它们的共享变量
这里只有x是共用的,因此看对x的操作

比如不同的顺序267和2167的结果是不一样的,因此不能并发执行

改正:因此只需要保护x不受并发影响即可

在这里插入图片描述

第16题-有点难的王道课后题

在这里插入图片描述
同步应该在互斥前面

涉及到产品数量,因此用两个count,
用到计数变量,就要对技术变量保护
这里既用到acount也用到bcount,就要对a、b全部隔绝
在这里插入图片描述
如果是上面这样的话,可能会满足mutex2却不满足mutex,然后死锁

其实这里只需要mutex2即可,有了mutex2就不需要mutex了,已经保证了只有自己霸占仓库
在这里插入图片描述

答案的写法:
设定一个信号量表示放a的机会(一种资源)和放b的机会有多少个

一开始A最多能放m-1个,B最多能放n-1个
放一个b就增加一个放a的机会
在这里插入图片描述

在这里插入图片描述
n<信<m
设置初值为n,此时放信的机会有m-n个,取信的机会0个
在这里插入图片描述

第17题-面包师

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

第18题-装配问题

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

第19题-和尚打水

在这里插入图片描述
注意老和尚喝水也要用水桶
在这里插入图片描述

第20题-输入输出问题

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

第21题-双标志

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值