1.问题描述
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。
为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中; 消费者进程可从一个缓冲区中取走产品去消费。
2.存储结构
缓冲池中有很多缓冲区,数据存放在缓冲区
缓冲区:
3.执行方法:
4.变量分析:
(1)指针
由于这里的缓冲池是组织成循环缓冲的,故应把输入指针加1表示成 in∶=(in+1)mod n;输出指针加1表示成out∶=(out+1) mod n。
指针in和out初始化为1。
(2)产品数:
还引入了一个整型变量counter, 其初始值为0。每当生产者进程向缓冲池中投放一个产品后,使counter加1;反之,每当消费者进程从中取走一个产品时, 使counter减1。
(3)空指令
no-op是一条空操作指令,while condition do no-op语句表示重复的测试条件(condication),重复测试应进行到该条件变为false(假),即到该条件不成立时为止
(4)局部变量:
在生产者进程中使用一局部变量nextp,用于暂时存放每次刚生产出来的产品;而在消费者进程中,则使用一个局部变量nextc,用于存放每次要消费的产品。
5.过程分析:
(1)基本过程:
代码描述:
(2)生产者+生产者:
即:如果有两个生产者进程P1,P2.需要互斥地访问,否则会丢数据(因为共享in指针)
(3)消费者+消费者:
即:如果有两个消费者进程P3,P4.需要互斥的访问,否则会读到空数据(因为共享out指针)
(4)生产者+消费者:
即:如果有一个生产者进程,一个消费者进程P2,P3,需要互斥的访问,否则count出错,(count指针)
6.结论:
如果有两个生产者进程P1,P2.需要互斥地访问,否则会丢数据(因为共享in指针)
如果有两个消费者进程P3,P4.需要互斥的访问,否则会读到空数据(因为共享out指针)
如果有一个生产者进程,一个消费者进程P2,P3,需要互斥的访问,否则count出错,(count指针)
说明了缓冲池是一个临界资源,无论什么样的资源都需要互斥地访问——信号量X=1
就可以有如下进程:
7.问题分析:
因为:
消费者不能访问空缓冲池;
生产者不能访问满缓冲池。
所以做如下规范:
定义两个信号量:
(前提:建设初始缓冲区是空的)
E(无数据的单元)=n(初值);//剩余缓冲区的个数
F(有数据的单元)=0(初值);//已占用缓冲区的个数
说明了消费者和生产者既互斥又同步
就有如下进程:
8.可以转换为AND型: