生产者消费者问题
来源:互联网 发布:c盘数据恢复软件 编辑:程序博客网 时间:2024/06/05 12:07
【问题描述】一群生产者进程在生产产品,一群消费者进程在消费产品。为了生产者消
费者进程之间能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,每次生
产的进程都会被放入到缓冲池中,消费者每次从缓冲池中取走产品。
【分析】
这个过程中既有互斥关系,又有同步关系。
互斥关系:每一时刻只有一个进程在访问 缓冲区(或放数据或取数据)。
同步关系:当Buf为空,生产者放产品之后消费之才能取产品;
生产者(V)-------->(P)消费者
当buf为满,消费者取走产品之后生产者才能够放产品。
消费者(V)-------->(P)生产者
【设信号量赋初值】
互斥关系:mutex初 = 1(开始时缓冲区没有被访问)
同步关系:当Buf为空,full初 = 0(当buf为空,消费者不可取数据)
当Buf为满,empty初 = n(当buf为满,只有消费者取出数据之后,生产者才能放数据,并且可以取n次)
下边图解:
死锁问题:
举例:有r1,r2资源各一个,p1,p2进程各一个。
p1:p(r1)-->i/o--->p(r2) -->执行p1--->释放r2-->释放r1
p2:p(r2)-->i/o--->p(r1) -->执行p2--->释放r1-->释放r2
解析:当p1开始执行,申请到r1,遇到i/o流,就去执行i/o,让出cpu,此时p2开始执行
申请到r2,当p1执行完i/o,开始申请r2,此时r2已经被p2占用,p1开始等r2;
当p2执行完自己的i/o之后,申请r1,r1已经被p1占用,所以,p2开始等r1.
陷入了互等(环路等待)中.....这就是所谓的死锁。
交换两个p操作之后,有可能发生死锁。交换V操作之后不会产生任何影响。
中间态:交换两个p操作不会发生死锁。
当Buf为空,full = 0,empty = 10.交换消费者的两个p操作,假如先来消费者进程,或得
mutex,等待V(full),生产者进程获取到empty块,阻于mutex。死锁。
当Buf为满,full = 10,empty = 0,交换生产者的两个p操作,假设先来的是生产者进程
,占用mutex,阻于empty,再来消费者,阻于mutex。死锁。
- 生产者-消费者问题
- 生产者-消费者问题
- 生产者-消费者问题
- 操作系统:生产者-消费者问题
- 生产者与消费者问题
- 生产者-消费者问题
- 关于生产者-消费者问题
- java生产者 消费者问题
- 消费者和生产者问题
- 生产者消费者问题
- 生产者消费者问题--多线程
- 生产者-消费者同步问题
- 生产者消费者问题
- 生产者与消费者问题
- 生产者 消费者问题!
- 生产者与消费者问题
- 生产者消费者问题
- 关于生产者-消费者问题
- 洛谷 2244
- IO多路复用之select函数详解
- 结构体成员对齐等问题
- 匿名对象
- NOIP题库区间合并
- 生产者消费者问题
- 工具推荐 10款用过都说好的移动界面原型设计工具
- 【32.26%】【codeforces 620C】Pearls in a Row
- Struts2面试常见问题
- Java三大器之拦截器(Interceptor)的实现原理及代码示例
- Hibernate面试
- 网易163邮箱和网易126邮箱有什么区别?
- 生姜红糖水
- 语音识别