生产者消费者问题-第三十天
2024-01-02 21:48:07
目录
生产者消费者问题?
进程同步:令各并发进程按要求有序的推进(让本来异步并发的进程互相配合,有序推进)
问题描述:系统中有一组生产者进程和消费者进程,生产者进程每次生产一个产品(某种数据)放入缓冲区,消费者进程每次从缓冲区中取出一个产品(某种数据)并使用
问题分析:
- 生产者、消费者共享一个初始为空、大小为n的缓冲区
- 只有缓冲区未满时,生产者才产品放入缓冲区,否则必须等待(同步关系)
- 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待(同步关系)
- 缓冲区是临界资源,各进程必须互斥地访问(互斥关系)
PV操作题目分析步骤
1、关系分析:找出题目中描述的各个进程,分析它们之间的同步、互斥关系
2、整理思路:根据各进程的操作流程确定P、V操作的大致顺序
3、设置信号量:根据题目条件确定信号量初值(互斥信号量mutex初值一般为1,同步信号量的初值要看对应资源的初始值是多少)?
semaphore mutex = 1; //互斥信号量,实现对缓冲区的互斥访问 semaphore empty = n; //同步信号量,表示空闲缓冲区的数量 semaphore full = 0; //同步信号量,表示产品的数量,也即非空缓冲区的数量
4、实现代码
//生产者 procucer() { while(1) { 生产一个产品的代码段; P(empty); //消耗一个空闲缓冲区 P(mutex); //实现互斥操作 把产品放入缓冲区的代码段; V(mutex); /实现互斥操作 V(full); //增加一个产品 } } //消费者 consumer() { while(1) { P(full); //消耗一个产品(非空缓冲区) P(mutex); //实现互斥操作 把产品放入缓冲区的代码段; V(mutex); /实现互斥操作 V(full); //增加一个空闲缓冲区 } }
实现互斥是在同一进程中进行一对PV操作,实现两进程同步是在两进程中分别执行PV操作
能否改变相邻P、V操作的顺序?
????????若此时缓冲区内已放满产品(empty=0,full=n,mutex=1),则生产者进程执行①使mutex--为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞(忙等)。由于生产者阻塞,因此切换回消费者进程(时间片转换)消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞(忙等)
????????这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁“,而V操作不会导致进程阻塞,因此两个V操作顺序可以交换但是会引起效率的降低不建议
?对于PV操作的代码内容遗忘的可以查看:http://t.csdnimg.cn/1juXR?
结论
实现互斥的P操作一定要实现同步的P操作之后
生产者消费者问题是一个互斥、同步的综合问题
~over~
文章来源:https://blog.csdn.net/m0_73975164/article/details/135338251
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!