ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【操作系统】王道考研 p22-26 生产者消费者问题、多生产者多消费者问题、吸烟者问题、读者写者问题、哲学家进餐问题

2021-12-06 20:31:15  阅读:166  来源: 互联网

标签:信号量 消费者 生产者 问题 互斥 mutex 缓冲区 进程 empty


生产者消费者问题
多生产者多消费者问题
吸烟者问题
读者写者问题
哲学家进餐问题

生产者消费者问题

有同步和互斥:
同步:缓冲区没满才能放产品,缓冲区不空才能取产品。
互斥:各进程互斥访问。

关于PV:P是消耗,V是释放(或理解为P是进,V是出
生产者P一个空闲缓冲区,V一个产品。
消费者P一个产品,V一个空闲缓冲区。

在这里插入图片描述
mutex是一个互斥信号量,实现对缓冲区的互斥访问。 ==
比如:对producer,它在
把产品放入缓冲区前要P(mutex),表示“我要使用缓冲区”,(因为是互斥的,P了之后如果不V就不会有进程再来访问缓冲区),放完后再V(mutex),表示“我用完了。”这里就实现了互斥==。

empty和full是同步信号量,empty表示空闲缓冲区数量,full表示产品数量。
对于producer,生产一个产品要P(empty),表示用了一个空闲缓冲区,生产完即V(full),产生了一个产品。
对于consumer,消耗一个产品P(full)后就释放了一个缓冲区V(empty)。

在这里插入图片描述
思考:能否改变相邻PV操作的顺序?
显然不能,可能会死锁,会造成进程之间的并发度降低。

对于producer:
P(mutex)就像是上锁,如果没有V(mutex),就没有进程可以访问缓冲区。但如果先P(mutex),上锁了,然后发现无法执行P(empty),即没有空闲缓冲区了,那就停在这里了。
consumer也同理。
在这里插入图片描述
总结
互斥的是缓冲区,同步的是空闲缓冲区资源和产品。
易错:
对于producer:先P(empty),再P(mutex),再V(mutex),再V(full).
对于consumer:先P(full),再P(mutex),再V(mutex),再V(empty).

可以这样理解:mutex是相当于对缓冲区(临界资源)的上锁,锁完后要马上释放,所以mutex的PV操作一定在最里层
在这里插入图片描述

多生产者多消费者问题

在这里插入图片描述
这里:不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。
原因是:本题的缓冲区大小只有1,在任何时刻,apple,orange,plate三个同步信号量中最多只有一个是1(有一个苹果,有一个橘子,或空位是1)。因此任何时候,最多只有一个进程的P操作不会被阻塞,并顺利进入临界区。
简而言之,当一个进程可以运行时,其他进程不满足运行的条件,所以不会出现多个进程同时访问盘子的情况,就不需要互斥变量了。

但是,如果缓冲区大小为2,那么父亲和母亲进程都满足条件,如果没有mutex,就会两个进程同时访问缓冲区。所以,需要互斥信号量mutex。

在这里插入图片描述
总结
如果缓冲区大小为1,有可能不用互斥信号量。
所以还是都用互斥信号量稳一点。
在这里插入图片描述
事件前后关系。
如这道题:放水果前的情况是盘子为空,放水果后是盘子为满。则就是一个同步信号量。
在这里插入图片描述

吸烟者问题

在这里插入图片描述
供应者供应任意一个组合(V),然后相应的吸烟者把它拿了(P)。
所以先V后P。
在这里插入图片描述
对于供应者来说:
轮流提供三种组合,提供就是V(offer),提供完其实就是P(finish),表示桌子上已经放了东西。
对于吸烟者来说,拿东西P(offer),然后就V(finish),因为拿完东西桌子就已经空了。
在这里插入图片描述
总结
在这里插入图片描述

读者写者问题

写进程和读进程(或写进程)同时运行会产生错误。
因此要求:可以同时读、只能一个写、写完前不能有其他进程访问。
在这里插入图片描述
处理问题的方法在最后一段:
在这里插入图片描述
writer的P(rw)和V(rw)相当于写文件前后的上锁和解锁。
reader中的mutex是因为要互斥地访问count。
reader中的P(rw)和V(rw)相当于读文件的上锁和解锁:只有还有文件要读就不解锁。
因此写进程可能饥饿。
在这里插入图片描述
这种算法也被称为==读写公平法。==不会让写进程饥饿。

看这里知道为什么不会让写进程饥饿
此图来自上面的链接:
增加的P(w)和V(w)有交替唤醒的感觉。
在这里插入图片描述

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

哲学家进餐问题

视频里提出了三种方法,但是代码只有一种。
这里看完整的代码
在这里插入图片描述
当所有哲学家都拿起左边的筷子,那么无法都拿起右边的筷子,会死锁。
在这里插入图片描述
三种解决方法:
在这里插入图片描述
3.仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子。

互斥地拿筷子
这种方法对应上面链接中的解决方法2.
在这里插入图片描述
总结
在这里插入图片描述

标签:信号量,消费者,生产者,问题,互斥,mutex,缓冲区,进程,empty
来源: https://blog.csdn.net/karshey/article/details/121749609

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有