操作系统实验报告生产者消费者问题Word文档下载推荐.docx
《操作系统实验报告生产者消费者问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告生产者消费者问题Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
三、课程设计应解决的主要问题:
(1)了解信号量的使用
(2)理解生产者消费者问题模型
(3)掌握真确使用同步机制的方法
(4)实现生产者消费者进程的互斥与同步
四、课程设计相关附件(如:
图纸、软件等):
程序源代码
五、任务发出日期:
2013-12-1课程设计完成日期:
2014-1-1
指导教师签字:
指导教师对课程设计的评语
成绩:
指导教师签字:
年月日
一、设计目的
1、了解信号量的使用
2、加深对信号量机制的理解
二、设计要求
1、理解生产者与消费者问题模型,掌握解决问题的算法思想
2、掌握正确使用同步机制的方法
三、设计说明(含系统框图和(或)主要算法的流程图)
生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。
生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。
模拟程序的程序流程图如下所示:
1.主程序流程图:
2.生产者进程流程图
3.消费者进程流程图
四、重要代码注释:
/*生产者线程*/
void*producer1(void*s)
{
pthread_mutex_lock(&
the_main);
pthread_mutex_unlock(&
intproid=(int)s;
inti;
for(i=1;
i<
=MAX;
i++)
{
the_mutex);
while(counter==BUFFER_SIZE)
printf("
%d号生产者wait...\n"
proid);
pthread_cond_wait(&
condp,&
%d号生产者唤醒...\n"
}
buffer[in]=1;
%d号生产者生产1放入%d中\n"
proid,in);
in=(in+1)%BUFFER_SIZE;
counter++;
pthread_cond_signal(&
condc);
the_p);
p++;
%d号生产者线程结束\n"
return0;
}
/*消费者线程*/
void*consumer1(void*s)
intconid=(int)s;
intj=1;
intk=0;
while
(1)
if(p==30&
&
counter==0)
break;
while(counter==0)
%d号消费者wait...\n"
conid);
condc,&
%d号消费者唤醒...\n"
if(buffer[out]==4)
%d号消费者在%d处消费%dcounter=%dp=%d\n"
conid,out,buffer[out],counter-1,p);
buffer[out]=0;
out=(out+1)%BUFFER_SIZE;
counter--;
condp);
if(buffer[out]==1&
flg[conid]==0)
flg[conid]=1;
for(j=1;
j<
=29;
j=j+2)
if(flg[j]==1)
k++;
if(k==15)
k=0;
j++)
flg[j]=0;
else
%d消费者线程结束\n"
pthread_exit(0);
/*如果生产者线程只有1,3,5,7,9依然存在,结束所有偶消费者线程*/
for(j=1;
=10;
pthread_create(&
pro[j],0,producer1,(void*)j);
con[j],0,consumer1,(void*)j);
/*如果生产者线程只有2,4,6,8,10依然存在,结束所有奇数消费者线程*/
for(j=2;
con[j],0,consumer2,(void*)j);
pro[j],0,producer2,(void*)j);
/*如果生产者线程只在11-20之间依然存在,结束不在该范围内的其它编号的消费者线程*/
for(j=11;
=20;
j=j+1)
pro[j],0,producer3,(void*)j);
for(j=11;
con[j],0,consumer3,(void*)j);
for(j=12;
con[j],0,consumer4,(void*)j);
/*其他编号生产者线程生产的产品可由任意的消费者线程消费*/
for(j=21;
=30;
pro[j],0,producer4,(void*)j);
con[j],0,consumer5,(void*)j);
for(j=22;
con[j],0,consumer6,(void*)j);
四、运行结果及分析
五、总结
1、本次实验是关于生产者与消费者之间互斥和同步的问题。
问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
2、实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。
加深了对于本部分内容的理解