技术开发站45793.com
操作系统 day16(生产者-消费者问题、多生产者-消费者问题)
发布时间:
2023年12月23日
生产者-消费者问题
分析
“前V后P”,这里的P可以看作-1,这里的V可以看作+1 。
由于full初值为0,每放进一个临界资源就+1,所以在消费者消费之前,要先看看缓冲区里有没有临界资源,full能不能-1,即先P(full)。在消费者消费之后,就对empty+1,即V(empty)
由于empty的初值为n,每放进一个临界资源就-1,所以在生产者生产之前,要先看看缓冲区里有没有空位,empty能不能-1,即先P(empty) 。在生产者生产之后,就对full+1,即V(full)
互斥信号量的初值一般为1,同步信号量的初值要看对应资源的初值是多少
代码实现
实现互斥是在同一进程中进行一对PV操作。实现同步是在一个进程中执行P,另一个进程中执行V。
能否改变相邻的P、V操作顺序
实现互斥P操作一定要在实现同步的P操作之后,即P(mutex)一定要在另一个P的后面。这是由于P操作会导致阻塞,所以对顺序有要求
V操作不会导致阻塞,只会唤醒,所以两个V操作的顺序可以交换
由于临界区的代码要尽可能短,否则会对系统的效能有一定的影响,所以红框中的代码就不放到PV操作之间了
多生产者-消费者问题
分析
代码实现
注意点:
即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。
原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利进入到临界区
如果缓冲区的大小为2,就会出现数据覆盖的情况,如下:
重点:不能从单个进程行为的角度来区分同步关系,这样会生成多个重复的信号量,应该要从“事件”的角度来考虑。
即女儿吃完苹果会导致父亲放入苹果,女儿吃完苹果会导致母亲放入橘子,儿子吃完橘子会导致父亲放入苹果,儿子吃完橘子会导致母亲放入橘子,这样会有四对同步关系,但如果我们这样看:吃完水果导致放入水果,那么就只有一对同步关系,只用设置一个同步信号量,如下:
文章来源:https://blog.csdn.net/u011453680/article/details/135168588
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!
最新文章
Python教程
深入理解 MySQL 中的 HAVING 关键字和聚合函数
Qt之QChar编码(1)
MyBatis入门基础篇
用Python脚本实现FFmpeg批量转换
js常用改变原数组的方法
从C++容器中获取存储数据的类型
【JavaEE进阶】 获取Cookie和Session
抖音利用人工智能操控用户行为?商家、达人该乐了
【MySQL 流浪之旅】 第四讲 MySQL 逻辑备份
Linux 配置jdk环境变量
Java快速转Go入门案例
【驱动】TI AM437x(内核调试-05):创建设备节点到/proc进程文件系统中
【起草】【第十章】免费代写论文!让ChatGPT协助你写毕业论文
Java进销存ERP管理系统源码