经典进程同步与互斥问题
1 生产者-消费者问题
1.1 问题描述
- 生产者-消费者问题是指有两组进程共享一个环形的缓冲池。一组进程被称为生产者,另一组进程被称为消费者。
- 缓冲池是由若干个大小相等的缓冲区组成的,每个缓冲区可以容纳一个产品。
- 生产者进程不断地将生产的产品放入缓冲池,消费者进程不断地将产品从缓冲池中取出。
在生产者-消费者问题中
- 存在着进程同步问题:当缓冲区满时,表示供大于求,生产者必须停止生产,进入等待状态,同时唤醒消费者;当所有的缓冲区都空时,表示供不应求,消费者必须停止消费,唤醒生产者。
- 存在着临界区的互斥问题:缓冲池是一个临界资源,必须要等缓冲池里满了,消费者才能取,缓冲池空了,生产者才能生产。所以对于缓冲池的操作是互斥的。
1.2 利用信号量与P,V操作解决生产者-消费者问题。
必须保证先装满再取,取空再装的原则
semaphore mutex =1;
semaphore empty = n; //缓冲池还剩的空闲位,初始值为n
semaphore full = 0; //缓冲池的资源数目,因此empty+full=n
int i,j;
ITEM buffer[n];
ITEM data_p, data_c;
voidproducer() //生产者进程
{
while(true)
{
produce an item in data_p;
P(empty); //p,v操作实现进程的互斥,必须是成对出现的
P(mutex);
buffer[i] = data_p;
i = (i + 1) % n;
V(mutex);
V(full);}
}
voidconsumer() //消费者进程
{
while(true