操作系统生产者消费者算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经典进程同步问题
——生产者消费者问题
一、基本原理
进程同步是多道程序环境下一个十分重要的问题,而生产者消费者问题则是经典的进程同步问题之一。

它是相互合作进程关系的抽象,描述了一组生产者向一组消费者提供产品,共享一个有界缓冲池,生产者向其中投入产品,消费者从中取得产品。

程序假设缓冲池中的缓冲区是等效的,生产者和消费者依次投入和取出产品。

只要有空闲的缓冲区,生产者就可以投入产品,同样,只要缓冲池中还有产品,消费者就可以消费。

生产者和消费者在使用缓冲池的缓冲区时必须互斥,而两者的同步关系也将禁止向满缓冲池投入产品或从空缓冲池中取得产品。

二、设计目的
本程序简单描述了生产者消费者问题,只要有空闲的缓冲区,生产者就可以投入产品,同样,只要缓冲池中还有产品,消费者就可以消费。

生产者和消费者在使用缓冲池的缓冲区时必须互斥。

三、运行结果
键入a表示生产一个产品并送到有界缓冲区;键入d表示从有界缓冲区取走一个产品并消费掉;键入l表示注销进程;键入s表示生产/消费过程是否结束,键入y表示结束,键入n表示继续进行生产消费过程,运行结果如下:
缓冲区满和缓冲区空的情况:
三、源代码:
#include<iostream.h>
#define SIZE 10
int producer(0),consumer(0); //生产者、消费者信号灯
int n=SIZE; //缓冲区长度
int produce=0; //生产产品数
int consume=0; //消费产品数
char c,ts;
int c1();
int c2();
int c1()
{
if(consumer==0)
{
producer=1;
c2();
}
return 0;
}
int c2()
{
if(producer)
{
cout<<"请进行生产/消费操作!"<<endl;
while(1)
{
cin>>ts;
if((ts=='a')&&(n>0))
{
produce++,n--; //生产一个,空闲缓冲区-1
cout<<"生产了一个产品并已送到有界缓冲区."<<endl;
continue;
};
if((ts=='d')&&(n<SIZE)) //消费一个,空闲缓冲区+1 {
consume++,n++;
cout<<"从有界缓冲区取走了一个产品并已消费掉."<<endl; continue;
};
if(ts=='s')
{
break;
};
if(n<=0)
{
cout<<"有界缓冲区已满,不能再送来产品了!"<<endl;
continue;
};
if(n>=SIZE)
{
cout<<"有界缓冲区已空,请尽快送来产品!"<<endl;
continue;
};
}
cout<<"是否结束生产/消费操作(Y/N)"<<endl;
cin>>c;
if(c=='y')
{
cout<<"此次生产/消费操作结束."<<endl;
cout<<"产品生产数为:" <<produce<<endl;
cout<<"产品消费数为:" <<consume<<endl;
cout<<"有界缓冲区剩余产品数为:" <<produce-consume<<endl;
}
if(c=='n') //NO,新一轮生产消费
{
consumer=0;
c1();
}
return 0;
}
}
int main()
{
cout<<"键入a表示生产一个产品并送到有界缓冲区."<<endl;
cout<<"键入d表示从有界缓冲区取走一个产品并消费掉."<<endl; cout<<"键入l表示注销进程."<<endl;
cout<<"键入s表示生产/消费过程结束."<<endl<<endl<<endl;
c1();
return 0;
}。

相关文档
最新文档