目录
进程同步:令各并发进程按要求有序的推进(让本来异步并发的进程互相配合,有序推进)
问题描述:系统中有一组生产者进程和消费者进程,生产者进程每次生产一个产品(某种数据)放入缓冲区,消费者进程每次从缓冲区中取出一个产品(某种数据)并使用
问题分析:
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操作
????????若此时缓冲区内已放满产品(empty=0,full=n,mutex=1),则生产者进程执行①使mutex--为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞(忙等)。由于生产者阻塞,因此切换回消费者进程(时间片转换)消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞(忙等)
????????这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁“,而V操作不会导致进程阻塞,因此两个V操作顺序可以交换但是会引起效率的降低不建议
?对于PV操作的代码内容遗忘的可以查看:http://t.csdnimg.cn/1juXR?
实现互斥的P操作一定要实现同步的P操作之后
生产者消费者问题是一个互斥、同步的综合问题
~over~