生产者与消费者问题是进程管理中的问题
1、信号量与PV操作
信号量:解决多个进程来竞争的资源的同步与互斥的问题,
每个信号量需要有特定的意义,需要有初值。
PV操作:它是两条原语
信号量的初值只能通过PV操作来改变
PV操作
P操作 | V操作 |
s=s-1 若s>=0表示进程要继续 s<0 资源受限,进程阻塞,并将其插入信号量等待队列中 | s=s+1 若s>0进程继续执行 若s<=0信号量需要从等待的队列中唤醒第一个进程,使其变为就绪状态,然后再返回原进程继续执行。 |
信号量
互斥模型 | 同步模型 | ||
进程P1 P(s)s=s-1 s>=0 CS1 进入临界资源区 V(s) | 进程P2 P(s) CS2 V(s) | 进程P1 L1:P(s) | 进程P2 L2:V(s) |
P1进程中S=0,则执行P2,此时s=s-1=-1<0则进程P2被阻塞 一直等待P1进程被释放,P2此时才可以进入临界区 | |||
2、生产者与消费者问题
生产者p1、p2、p3….pm
消费者:C1、C2、C3、Cm
缓冲区为n
只要缓冲区未满,生产者便可放入
只要缓冲区有产品,消费者便可取
需要设置两个同步信号量
Empty=n
Full=0
刚开始空的单元为n,满的单元为0
生产者每放一个产品,empty=empty+1,full=full-1
消费者每取一个产品,empty=empty-1,full=full+!;
生产者与消费者不可同时进入缓冲区,则需要一个互斥信号量
Mutex=1;
代码如下所示:
int full=0;
int empty=n;
int mutex=1;
produceri ();
consumerj ();
生产者(producerI) | 消费者(consumerJ) |
While(生产未完成){ 生产一个产品; P(empty); P(mutex); 送产品到缓冲区中; V(mutex); V(full); } | While(还要继续消费){ P(full); P(mutex); 从缓冲区中取一个产品; V(mutex); V(empty); 消费一个产品; } |
总结此次学习的精髓:
互斥模型:是在同一个进程中实现PV操作的
同步模型:是在不同的进程中实现PV操作的
如上述问题中对于mutex的pV操作是在一个进程中同时存在的;而对于同步信号量empty、full是在不同的进程中完成的PV操作
本文出自 “不积跬步,无以至千里” 博客,请务必保留此出处http://jinhuiqin.blog.51cto.com/8596463/1379945
原文:http://jinhuiqin.blog.51cto.com/8596463/1379945