操作系统课程设计报告专业计算机科学与技术学生姓名丁可班级B计123班学号1210704314指导教师李先锋完成日期2015年11月20日信息工程学院题目:生产者-消费者问题的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。二、设计内容1、概述用进程同步方法解决“生产者-消费者”问题,C或C++语言实现。1、设计目的通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。2、设计要求1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。说明:有界缓冲区(提示:有界缓冲区可用数组实现)内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。2)生产者和消费者各有两个以上。3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。2、设计原理在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。3、详细设计及编码定义两个信号量HANDLEg_hFullSemaphore;//资源信号量:缓冲区满HANDLEg_hEmptySemaphore;//资源信号量:缓冲区空unsignedshortin=0;//用于记录生产者的指针位置unsignedshortout=0;//用于记录消费者的指针位置HANDLEg_hMutex;//线程间的互斥信号量生产者进程while(TRUE){生产一个产品;P(g_hEmptySemaphore);P(mutex1);产品送往buffer(in);in=(in+1)modn;V(mutex1);V(g_hFullSemaphore);}消费者进程while(TRUE){P(g_hFullSemaphore);P(mutex2);从buffer(out)中取出产品;out=(out+1)modn;V(mutex2);V(g_hEmptySemaphore);(算法流程图、编程及程序注释等)主要的方法:4、运行结果分析1、运行示例在c++中运行源程序,程序主界面截图.按回车及申请资源和缓冲区进行p操作和申请互斥(生产者和消费者都是2个)(运行界面截图、界面说明、输入输出数据说明和分析等)附录代码:#includewindows.h#includeiostreamconstunsignedshortSIZE_OF_BUFFER=20;//有界缓冲区长度intg_buffer[SIZE_OF_BUFFER];//开辟缓冲区?用数组表示?可以看成是一个循环队列unsignedshortProductID=0;//新生产出来的产品的产品号unsignedshortConsumeID=0;//被消耗的产品的产品号unsignedshortin=0;//产品进缓冲区时的缓冲区下标?用于记录生产者的指针位置unsignedshortout=0;//产品出缓冲区时的缓冲区下标?用于记录消费者的指针位置boolg_continue=1;//控制程序运行:1表示继续运行?0表示停止运行HANDLEg_hMutex;//线程间的互斥信号量HANDLEg_hFullSemaphore;//资源信号量:缓冲区满HANDLEg_hEmptySemaphore;//资源信号量:缓冲区空DWORDWINAPIProducer(LPVOID);//生产者线程DWORDWINAPIConsumer(LPVOID);//消费者线程constunsignedshortPRODUCERS_COUNT=2;//生产者的个数constunsignedshortCONSUMERS_COUNT=2;//消费者的个数constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总线程数HANDLEhThreads[PRODUCERS_COUNT];//各线程的handleDWORDproducerID[CONSUMERS_COUNT];//生产者线程的标识符DWORDconsumerID[THREADS_COUNT];//消费者线程的标识符/*----------------------------程序提示信息开始------------------------------*/voidinfo()//程序提示信息{std::cout*-----------------------*std::endl;std::cout|课程设计课题:生产者-消费者问题的模拟实现|std::endl;std::cout|指导老师:李先锋|std::endl;std::cout|学生:丁可|std::endl;std::cout|班级:B计123班|std::endl;std::cout*-----------------------*std::endl;std::cout==》按回车开始该程序std::endl;getchar();}/*----------------------------程序提示信息结束------------------------------*//*----------------------------生产一个产品开始------------------------------*///生产一个产品:输出其ID号voidProduce(){std::coutstd::endl;std::cerr生产一个产品:++ProductID;std::coutstd::endl;}/*----------------------------生产一个产品结束------------------------------*//*----------------------把新生产的产品放入缓冲区开------------------------*///把新生产的产品放入缓冲区voidAppend(){std::cerr把生产的产品送入缓冲区;g_buffer[in]=ProductID;in=(in+1)%SIZE_OF_BUFFER;std::cerrstd::endl;std::cout缓冲区产品生产者/消费者std::endl;//新产品放入缓冲区后?输出缓冲区当前的状态for(inti=0;iSIZE_OF_BUFFER;++i){//输出缓冲区下标if(i10)std::coutig_buffer[i];elsestd::coutig_buffer[i];if(i==in){if(g_buffer[i]10)std::cout;elsestd::cout;std::cout--生产者;//输出生产者的指针位置}if(i==out){if(g_buffer[i]10)std::cout;elsestd::cout;std::cout--消费者;//输出消费者的指针位置}std::coutstd::endl;}}/*----------------------把新生产的产品放入缓冲区结------------------------*//*----------------------------消费一个产品开始------------------------------*/voidConsume()//消费一个产品{std::coutstd::endl;std::cerr消费一个产品:ConsumeID;std::coutstd::endl;}/*----------------------------消费一个产品结束------------------------------*//*-----------------------从缓冲区中取出一个产品开始-------------------------*///从缓冲区中取出一个产品voidTake(){std::coutstd::endl;std::cerr从缓冲区取出一个产品;ConsumeID=g_buffer[out];out=(out+1)%SIZE_OF_BUFFER;std::cerrstd::endl;std::coutstd::endl;std::cout缓冲区产品生产者/消费者std::endl;//取出一个产品后:输出缓冲区当前的状态for(inti=0;iSIZE_OF_BUFFER;++i){//输出缓冲区下标if(i10)std::coutig_buffer[i];elsestd::coutig_buffer[i];if(i==in){if(g_buffer[i]10)std::cout;elsestd::cout;std::cout--生产者;//输出生产者的指针位置}if(i==out){if(g_buffer[i]10)std::cout;elsestd::cout;std::cout--消费者;//输出消费者的指针位置}std::coutstd::endl;}}/*-----------------------从缓冲区中取出一个产品结束-------------------------*//*-----------------------------生产者线程开始-------------------------------*///生产者线程DWORDWINAPIProducer(LPVOIDlpPara){while(g_continue){//资源信号量的P操作WaitForSingleObject(g_hFullSemaphore,INFINITE);//互斥信号量的P操作WaitForSingleObject(g_hMutex,INFINITE);//生产一个产品Produce();//把新生产的产品放入缓冲区Append();Sleep(2000);//互斥信号量的V操作ReleaseMutex(g_hMutex);//资源信号量的V操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL);}return0;}/*-----------------------------生产者线程结束-------------------------------*//*-----------------------------消费者线程开始-------------------------------*///消费者线程DWORDWINAPIConsumer(LPVOIDlpPara){while(g_continue){//资源信号量的P操作WaitForSingleObject(g_hEmptySemaphore,INFINITE);//互斥信号量的P操作WaitForSingleObject(g_hMutex,INFINITE);//从缓冲区中取出一个产品Take();//消费一个产品Consume();Sleep(2000);//互斥信号量的V操作ReleaseMutex(g_hMutex);//资源信号量的V操作ReleaseSemaphore(g_hFullSemaphore,1,NULL);}return0;}/*----------------------------