实验二 生产者消费者问题_第1页
实验二 生产者消费者问题_第2页
实验二 生产者消费者问题_第3页
实验二 生产者消费者问题_第4页
实验二 生产者消费者问题_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子科技大学信息与软件学院实验报告(实验)课程名称计算机操作系统学生姓名康彪学生学号电子科技大学教务处制表7、实验及结果分析:能够正确模拟生产者和消费者模型,对缓冲区进行读写操作。生产者消费者问题 1生产者2消费者4缓冲区--byMoreldindows(http:)--生产者在缓冲池第。个缓冲区中投放数据1生产者在缓冲池第1个缓冲区中投放数据2生产者在缓冲池第2个缓冲区中投放数据3编号为420的消费者从缓冲池中第0个缓冲区取出数据1生产者在缓冲池第3个缓冲区中投放数据4编号为3520的消费者从缓冲池中第1个缓冲区取出数据2编号为3520的酒费者从度冲池中第2个度冲区取出数据3生产者在缓冲池第0个缓冲区中投放数据5编号为420的消费者从缓冲池中第3个缓冲区取出数据"生产者在缓冲池第1个缓冲区中投放数据6编号为352。的消费者从缓冲池中第。个缓冲区取出数据5生产者在缓冲池第2个缓冲区中投放数据7编号为42。的消费者从缓冲池中第1个缓冲区取出数据6生产者在缓冲池第3个缓冲区中投放数据8生产者完成任务,线程结束运行编号为3520的消费者从缓冲池中第2个缓冲区取出数据7编号为420的消费者从缓冲池中第3个缓冲区取出数据8编号为420的消费者收到通知,线程结束运行编号为352。的消费者从缓冲池中第3个缓冲区取出数据8编号为3520的消费者收到通知,线程结束运行Pressangkeytocontinue.8、实验结论、心得体会和改进建议:本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。生产者与消费者是一个与现实有关的经验问题,通过此原理举一反三可以解决其他类似的问题。通过本实验设计,我们对操作系统的P、V进一步的认识,深入的了解PV操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。2、实验学时:23、实验内容和目的:实验目的:通过本实验掌握进程间的同步和互斥机制的使用。实验内容:1、有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池:生产者进程从文件中读取一个数据,并将它存放到一个缓冲区中;消费者进程从一个缓冲区中取走数据,并输出此数据。生产者和消费者之间必须保持同步原则:不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。2、创建3进程(或者线程)作为生产者,4个进程(或者线程)作为消费者。创建一个文件作为数据源,文件中事先写入一些内容作为数据。3、生产者和消费者进程(或者线程)都具有相同的优先级。4、实验原理:利用进程间共享的信号量、互斥锁等控制线程的同步。相关函数说明:信号量sem_tsemjnit信号量初始化)、sem_wait(信号量值减一)、sem_post(信号量值加一)互斥量(线程)pthread_mutex_tpthread_mutex_init(互斥量初始化)pthread_mutexJock(互斥量加锁)pthread_mutex_unlock(互斥量解锁)线程和进程pthread_t(线程)pid_t(进程)pthread_create(创建线程)fork(创建进程)pthreadjoin(等待线程结束)waitpid(停止目前进程的执行,直到有信号来到或子进程结束)(1)学生每人一台PC,安装WindowsXP^OOO操作系统。(2)局域网络环境。(3)个人PC安装VMware虚拟机和Ubuntu系统。6、实验步骤:.算法思想生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。.流程图否生产者向队列中写入一个新元素项否生产者向队列中写入一个新元素项.程序代码#include<windows.h>#include<iostream.h>#include<fstream.h>#include<string.h>#include<conio.h>〃声明所需变量intin=O;intout=0;HANDLEh_Thread[20];//线程数组HANDLEempty_Semaphore;〃表示空缓冲区的信号量HANDLEfull_Semaphore;〃表示空缓冲区的信号量HANDLEmutex;structdata(intID;〃序号chartype;〃类型,是生产者还是消费者,porcdoubledelay;〃线程延迟的时间,对应生产者生产产品的时间或消费者消费产品的时间);dataThreadlnfo[20];〃线程信息数组intlength;〃线程信息数组中实际的线程个数voidProduce(void*p);〃生产者进程voidConsume(void*p);〃消费者进程voidinput(void);intmain(void)(input();〃初始化临界区对象//lnitializeCriticalSection(&PC_Critical);empty_Semaphore=CreateSemaphore(NULLz10/10,NULL);full_Semaphore=CreateSemaphore(NULL,0,10,NULL);mutex=::CreateMutex(NULL,FALSE,NULL);cout<<”下面生产者和消费者开始工作!!”<<endl;cout«endl;〃创建生产者和消费者线程for(inti=O;i(if(Threadlnfo[i].type=='p')h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&(Threadlnfo[i]),0,NULL);elseif(Threadlnfo[i].type==,c')h_Thread[i]=CreateThread(NULL,07(LPTHREAD_START_ROUTINE)(Consume),&(Threadlnfo[i]),0,NULL);)〃主程序等待各个线程的动作结束WaitForMultipleObjects(length,h_Thread,TRUE,-l);cout«endl;::Sleep(100);cout<<“所有的生产者和消费者都完成了它们的工作!!”<<endl«endl;return0;//〃生产者进程*T* *T* *i* “T,^T* ,T■,T■*T**T* *T**T*,T-voidProduce(void*p)(〃局部变量声明intmyjd;doublemy_delay;〃从线程信息数组中获得信息my_id=((data*)(p))->ID;my_delay=((data*)(p))->delay;〃开始请求生产WaitForSingleObject(empty_Semaphore,-l);::WaitForSingleObject(mutex,-l);//EnterCriticalSection(&PC_Critical);cout""生产者”<vmyjd<<“发出生产请求。"<<endl;cout«endl;cout<<“生产者“<<myjd<<"生产"«endl;in=(in+l);Sleep(my_delay*10);cout<<“生产者完成了生产。”<<endl<<endl;//LeaveCriticalSection(&PC_Critical);ReleaseSemaphore(full_Semaphore,l/NULL);::ReleaseMutex(mutex);Kf4tli4_t|^fa〃消费者进程voidConsume(void*p)〃局部变量声明intmyjd;doublemy_delay;〃从线程信息数组中获得信息my_id=((data*)(p))->ID;my_delay=((data*)(p))->delay;〃开始请求消费WaitForSingleObject(full_Semaphore,-l);::WaitForSingleObject(mutex,-l);//EnterCriticalSection(&PC_Critical);cout<<“消费者"<<my_id<〈”发出消费请求。"<<endl;cout«endl;cout<<”消费者,,<<myjd<<,'消费"«endl;out=(out+l);Sleep(my_delay*10);cout<<“消费者完成了消费。"<<endl«endl;//LeaveCriticalSection(&PC_Critical)ReleaseSemaphore(empty_Semaphore,l,NULL);::ReleaseMutex(mutex)〃输入进程信息的函数voidinput(void)(〃定义局部变量intid;charch;doubletime;intk=0;cout<<”********请输入线程信息:"«encll;cout<<“********线程ID;"«endl;cout<<”********线程的类型(生产者线程,还是消费者线程,P代表生产者,C代表消费者);"«endl;cout<<“********线程延迟时间。“<<endl;coutvv"********线程ID为0时结束线程信息的输入!!”<<endl<<endl;while(id!=0)(cout«"pleaseinputathreadID."«endl;cin»id;Threadlnfo[k].ID=id;if(id==O)break;cout«"pleaseinputathreadtype."«endl;cin»ch;Threadlnfo[k].type=c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论