操作系统实验报告生产者消费者问题.docx
- 文档编号:7680425
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:11
- 大小:391.48KB
操作系统实验报告生产者消费者问题.docx
《操作系统实验报告生产者消费者问题.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告生产者消费者问题.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统实验报告生产者消费者问题
课程设计说明书
设计题目:
生产者消费者问题
山东科技大学
2014年1月1日
课程设计任务书
一、课程设计题目:
生产者消费者问题
二、课程设计主要参考资料
(1)[美]AbrahamSilberschatzPeterBaerGalvinGregGagne著.OPERATINGSYSTEMCONCEPTS[SeventhEdition].高等教育出版社,2007,01
(2)蔡启先.C语言程序设计教程(第二版).重庆大学出版社,2003,07
(3)张尧学等.计算机操作系统教程(第2版)[M].北京:
清华大学出版社,2000.
三、课程设计应解决的主要问题:
(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(&the_main);
intproid=(int)s;
inti;
for(i=1;i<=MAX;i++)
{
pthread_mutex_lock(&the_mutex);
while(counter==BUFFER_SIZE)
{
printf("%d号生产者wait...\n",proid);
pthread_cond_wait(&condp,&the_mutex);
printf("%d号生产者唤醒...\n",proid);
}
buffer[in]=1;
printf("%d号生产者生产1放入%d中\n",proid,in);
in=(in+1)%BUFFER_SIZE;
counter++;
pthread_cond_signal(&condc);
pthread_mutex_unlock(&the_mutex);
}
pthread_mutex_lock(&the_p);
p++;
printf("%d号生产者线程结束\n",proid);
pthread_mutex_unlock(&the_p);
return0;
}
/*消费者线程*/
void*consumer1(void*s)
{
pthread_mutex_lock(&the_main);
pthread_mutex_unlock(&the_main);
intconid=(int)s;
intj=1;
intk=0;
while
(1)
{
pthread_mutex_lock(&the_mutex);
if(p==30&&counter==0)
{
pthread_mutex_unlock(&the_mutex);
break;
}
while(counter==0)
{
if(p==30&&counter==0)
{
pthread_mutex_unlock(&the_mutex);
break;
}
printf("%d号消费者wait...\n",conid);
pthread_cond_wait(&condc,&the_mutex);
printf("%d号消费者唤醒...\n",conid);
}
if(buffer[out]==4)
{
printf("%d号消费者在%d处消费%dcounter=%dp=%d\n",conid,out,buffer[out],counter-1,p);
buffer[out]=0;
out=(out+1)%BUFFER_SIZE;
counter--;
pthread_cond_signal(&condp);
}
if(buffer[out]==1&&flg[conid]==0)
{
flg[conid]=1;
printf("%d号消费者在%d处消费%dcounter=%dp=%d\n",conid,out,buffer[out],counter-1,p);
for(j=1;j<=29;j=j+2)
if(flg[j]==1)
k++;
if(k==15)
{
k=0;
for(j=1;j<=29;j++)
flg[j]=0;
buffer[out]=0;
out=(out+1)%BUFFER_SIZE;
counter--;
pthread_cond_signal(&condp);
}
else
k=0;
}
else
{
pthread_cond_signal(&condc);
}
pthread_mutex_unlock(&the_mutex);
}
printf("%d消费者线程结束\n",conid);
pthread_exit(0);
}
/*如果生产者线程只有1,3,5,7,9依然存在,结束所有偶消费者线程*/
for(j=1;j<=10;j=j+2)
{
pthread_create(&pro[j],0,producer1,(void*)j);
pthread_create(&con[j],0,consumer1,(void*)j);
}
/*如果生产者线程只有2,4,6,8,10依然存在,结束所有奇数消费者线程*/
for(j=2;j<=10;j=j+2)
{
pthread_create(&con[j],0,consumer2,(void*)j);
pthread_create(&pro[j],0,producer2,(void*)j);
}
/*如果生产者线程只在11-20之间依然存在,结束不在该范围内的其它编号的消费者线程*/
for(j=11;j<=20;j=j+1)
{
pthread_create(&pro[j],0,producer3,(void*)j);
}
for(j=11;j<=20;j=j+2)
{
pthread_create(&con[j],0,consumer3,(void*)j);
}
for(j=12;j<=20;j=j+2)
{
pthread_create(&con[j],0,consumer4,(void*)j);
}
/*其他编号生产者线程生产的产品可由任意的消费者线程消费*/
for(j=12;j<=20;j=j+2)
{
pthread_create(&con[j],0,consumer4,(void*)j);
}
for(j=21;j<=30;j=j+1)
{
pthread_create(&pro[j],0,producer4,(void*)j);
}
for(j=21;j<=30;j=j+2)
{
pthread_create(&con[j],0,consumer5,(void*)j);
}
for(j=22;j<=30;j=j+2)
{
pthread_create(&con[j],0,consumer6,(void*)j);
}
四、运行结果及分析
五、总结
1、本次实验是关于生产者与消费者之间互斥和同步的问题。
问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
2、实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。
加深了对于本部分内容的理解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统实验报告 生产者消费者问题 操作系统 实验 报告 生产者 消费者 问题