进程同步互斥经典题之消费者与生产者问题
2015-10-29 21:00
357 查看
问题背景:有两个进程分别为消费者进程和生产者进程,对同一个临界资源进行访问,生产者不断地将生产的产品加入缓存区,而消费者不断地消费缓存区中的资源,利用信号量实现两个进程的同步和互斥。
问题分析:在生产者往缓存区中加入产品的时候,需要两个信号量,一个是互斥信号量,使得在生产者往缓存里放产品的时候其他进程不能对临界资源进行操作,另一个信号量是指示缓存区是否已满的信号量,从而判断生产者能否往缓存区加入产品;而消费者从缓存区中消费资源的时候,也需要两个信号量,一个信号量是互斥信号量,使得消费者在从缓存区中取产品的时候其他进程不能对临界资源进行操作,另外一个信号量是指示缓存区是否空,从而判断消费者能否对缓存区进行操作。
由以上分析,可知在该问题中共需要三个信号量,一个是用于互斥的信号量mutux=1;一个是用于指示缓存区空位置数目的empty=N;另外一个是指示缓存区填满位置的信号量full=0;
从而,可以该问题可以有以下解决办法:
那么,从上面可以看出,用于同步的信号量一定是位于不同进程中,用于互斥的信号量一定是位于同一个进程中。
下面我们来分析一个例题,如下:
在这个例题中,水桶只有三个,井和缸只能容纳一个桶进出,并且缸只能容纳十桶水:
所以 1.对井的操作需要加互斥关系
2.对缸的操作需要加互斥关系
3.记录桶数目的信号量
4.指示缸满和缸空的信号量
因此,我们设定以下信号量:mutux1=1; mutux2=0; empty=10; full=0; count=3;
那么,这个问题可以通过以下算法解决:
问题分析:在生产者往缓存区中加入产品的时候,需要两个信号量,一个是互斥信号量,使得在生产者往缓存里放产品的时候其他进程不能对临界资源进行操作,另一个信号量是指示缓存区是否已满的信号量,从而判断生产者能否往缓存区加入产品;而消费者从缓存区中消费资源的时候,也需要两个信号量,一个信号量是互斥信号量,使得消费者在从缓存区中取产品的时候其他进程不能对临界资源进行操作,另外一个信号量是指示缓存区是否空,从而判断消费者能否对缓存区进行操作。
由以上分析,可知在该问题中共需要三个信号量,一个是用于互斥的信号量mutux=1;一个是用于指示缓存区空位置数目的empty=N;另外一个是指示缓存区填满位置的信号量full=0;
从而,可以该问题可以有以下解决办法:
那么,从上面可以看出,用于同步的信号量一定是位于不同进程中,用于互斥的信号量一定是位于同一个进程中。
下面我们来分析一个例题,如下:
在这个例题中,水桶只有三个,井和缸只能容纳一个桶进出,并且缸只能容纳十桶水:
所以 1.对井的操作需要加互斥关系
2.对缸的操作需要加互斥关系
3.记录桶数目的信号量
4.指示缸满和缸空的信号量
因此,我们设定以下信号量:mutux1=1; mutux2=0; empty=10; full=0; count=3;
那么,这个问题可以通过以下算法解决:
相关文章推荐
- Web层的搭建
- 安装linux系统之RHEL7或CENTOS7系统(完整版)
- BZOJ 3123 [Sdoi2013]森林 主席树+启发式合并
- 解决java compiler level does not match the version of the installed java project facet
- hdu4883
- CUDA学习2015.10.29
- java基础之static关键字(1)
- 解决java compiler level does not match the version of the installed java project facet
- UItableBarController
- mysql乱码解决
- JavaMelody应用监控使用指南
- 字符串对比
- 3-8译码器-20151028
- Linux HA (一)
- c语言中认识指针
- 第七周 项目6 停车场模拟
- 记录利用ettercap进行简单的arp欺骗和mitm攻击过程
- AddressBookUI
- 数位DP-HDU-3555-Bomb
- hdu--3790