您的位置:首页 > 其它

【操作系统】学习笔记(二)之生产者消费者问题

2016-09-27 12:23 225 查看
【问题描述】一群生产者进程在生产产品,一群消费者进程在消费产品。为了生产者消

费者进程之间能够并发执行,在两者之间设置了一个具有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。死锁。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息