技术开发站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批量转换
RabbitMQ解决消息丢失以及重复消费问题
JavaScript中这些事件(event)类型你都知道吗?
数据库课程设计-图书管理系统数据库设计
第一章 FPGA开发环境安装
前端学习笔记 6:Pinia
工程送样!手把手教你用好广和通RedCap模组FG131&FG132系列
Linux常用命令
再谈信息收集-子域名收集
Windows下cmd和PowerShell的区别
分辨率 时钟频率 lane速率计算