1、(操作系统课程设计)生产者与消费者学生姓名: 学生学号: 班 级: 01140、02、03、04班制 二一三年十二月一、 课程题目分析这个题目就是生产者向消费者提供商品,消费者消耗商品,并且两组人共用同一缓冲区。生产者提供了商品之后消费者才能去取商品,消费者若不取走商品则当缓冲区用完之后生产者则不能再向缓冲区中添加新得商品。思考问题:(1) 对于生产者进程:每产生一个数据,则需去访问共用缓冲区就是否有已满,未满则可以将该数据存入并通知消费者进程,否则不能。(2) 对于消费者进程:每当想去消费(取出数据)时,则需访问缓冲区就是否为空,为空则不能消费(取出数据),否则可以取,并通知生产者。(3)
2、缓冲区就是个临界资源,所有得进程对于该空间都就是共享得,所以,还有互斥问题存在。二、 课程设计目得通过实验模拟生产者与消费者之间得关系,了解并掌握她们之间得关系及原理。由此增加对进程同步问题得了解:(1) 掌握基本得同步互斥算法,理解生产者与消费者模型(2) 了解indos中多线程(多进程)得并发执行机制,线程(进程)间得同步于互斥(3) 学习使用windows中基本得同步对象,掌握相应得API。三、 课程设计内容有n个生产者与m个消费者,连接在具有k个单位缓冲区得有界环转缓冲上,故又称有界缓冲问题。其中Pi与j都就是并发进程,只要缓冲区未满,生产者进程Pi所生产得产品就可投入缓冲区;类似地,
3、只要缓冲区非空,消费者进程Cj就可以从缓冲区取走并消耗产品。四、 开发环境操作系统:Widows系统编写语言:+语言五、 系统分析设计(一) 算法原理生产者消费者问题就是典型得进程同步问题,这些进程必须按照一定得生产率与消费率来访问共享缓冲区,用P、V操作解决生产者与消费者共享单缓冲区得问题,可设置两个信号量emp与ful,其初值分别为与0,empty指示能否向缓冲区放入产品,fll指示能否从缓冲区取出产品。为了使其协调工作,必须使用一个信号量muex(初值为1),以限制生产者与消费者互斥地对缓冲区进行存取,另用两个信号量mt(初值为缓冲区大小)与full(初值为),以保证生产者不向已满得缓冲
4、区中放入产品,消费者不从空缓冲区中取产品。(二) 功能描述生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满得缓冲区,那么消费者线程将被阻塞,直到新得物品被生产出来。(三) 算法流程图生产者流程图: 消费者流程图:总得流程图:(四) 数据结构及部分函数描述(1)类SeqSuae:对类qSquae得声明及其中一些函数class SqSua
5、republic:Squar(n );Seqare();voidP(i); /p操作vidV(int x); /操作l Empty(); /判断就是否为空o IsF(); /判断就是否已满voi dea();void db();int getSe();nt aSie();in gettop();int geta();intgetb();protecte:private:int*elemens;int top,b,maSie;说明:用动态整型数组emes来代表缓冲区,不管就是生产产品还就是对已有产品得消费都需要访问该缓冲区。函数IsFull()用于判断缓冲区就是否已满,生产者能否使用缓冲区.函数
6、IsEmpty()用于判断缓冲区就是否为空,消费者能否使用缓冲区。(2) 生产者与消费者操作及显示函数howbuf:voidproducer(SSquae *a) /生产者操作a-P(1);vod onsumer(SSqure *a) /消费者操作 aV(1); /缓冲区显示vid shobuf(SqSqur a)int i=getize();(3) 在实现本程序得生产者消费者模型时,具体地通过以下同步对象实现互斥:设一个互斥量te,以实现生产者在查询与保留缓冲区得下一个空位置时进行互斥。每一个生产者用一个信号量与消费者同步,通过设置ul实现,该组信号量用于表示相应产品以生产。同时用一个表示空
7、缓冲区数目得信号量Empt进行类似得同步,指示缓冲区中就是否存在空位置,以便开始生产下一个产品。(四) 调试过程为解决生产者、消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区得数目,用Fll表示,其初值为用户输入得缓冲区得大小,另一个表示缓冲区中产品得数目,用pty表示,其初值为0、另外,由于缓冲区就是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量Mutex,其初值为1、在生产者、消费者问题中,信号量实现两种功能。首先,她就是生产产品与消费产品得计数器,计数器得初值就是可使用得资源数目(缓冲区得长度)。其次,她就是确保产品得生产者与消费者之间得动作同步得同步器。生产者要生产
8、一个产品时,首先对资源信号量Ful与互斥信号量Muex进行P操作,申请资源.如果可以通过得话,就生产一个产品,并把产品送人缓冲区.然后对互斥信号量Mut与资源信号量Emy进行V操作,释放资源。消费者要消费一个产品时,首先对资源信号量Empty与互斥信号量te进行P操作,申请资源。如果可以通过得话就从缓冲区取出一个产品并消费掉.然后对互斥信号量Mut与资源信号量Ful进行操作,释放资源。如果缓冲区中已经没有可用资源,就把申请资源得进程添加到等待队列得队尾.如果有一个资源被释放,在等待队列中得第一个进程被唤醒并取得这个资源得使用权。(五) 参考资料操作系统教程 孙钟秀 高等教育出版社C+程序设计
9、谭浩强 高等教育出版社六、 运行实例及结果分析(一) 运行实例缓冲区大小为3,先生产一件产品,显示缓冲区,再接着生产一件产品,消耗一件产品,显示缓冲区,在消耗两件产品,再生产4件产品,改变缓冲区得大小为6,显示缓冲区,选择一个未出现得选项,退出程序.(二) 结果显示(三) 结果分析(1) 在每个程序中需要先做P,后做V,二者要成对出现,夹在二者中间得代码段就就是该进程得临界区。(2) 对同步信号量fll与empt得P,操作同样必须成对出现,但它们分别位于不同得程序中。(3)无论在生产者进程中还就是消费者进程中,两个P操作得次序不能颠倒:应先执行同步信号量得P操作,然后执行互斥信号量得P操作.否
10、则可能造成进程死锁。七、个人体验虽然我也很想用jaa语言写这个程序,但就是由于自己学艺不精,所以只能用C+写。通过这个实验我发现我以前有很多知识都忘记了,重新拿起课本学习时发现原来很多不懂得问题都有了新得认识,有一种豁然开朗得感觉。也为我考研开了一个好得开头。我认为我完成得这个设计做得比较出色得地方就是对C+语言中类以及数组得运用,其实这里我对数组得操作就是按照“先进先出”得方法进行运作得,这就是参考了栈得工作原理,因为缓冲区一般也就是堆栈,比较符合设计要求。这次实验中我感觉做得很粗糙,自己所想得模拟过程得确得到实现了,但就是感觉灵活性不太高,思考还不过全面,应该以后多注意一下,多考虑考虑才就
11、是。在这次实验中我重新将C+程序设计与数据结构得几个重要章节复习了一遍,对类、数组、C+得/流类库以及堆栈得语句格式、注意细节都再一次熟悉,感觉蛮有趣得.不过,在编程过程中许多语句得小问题还真就是出现不少,而且感觉自己对C+强大丰富得语句方法用得太呆板,不够灵活,总就是想到那些常用得,而忽略了颗粒让语句更简短得方法,以后要多多注意才就是.八、 附录/生产者消费者1、pp : Dentheentryi for theconsoeapliaio、/#inude stdaf、h”#nclde”iostream”usingnamespace td;cls SqSquaepubl:SeqSqar(ntn
12、);SeqSqre();oid P(nt ); /p操作oiV(n); /v操作bool IEty(); /判断就是否为空bool Isu(); /判断就是否已满vid da();void decb();t eize();int getmaSize();int etto();int geta();int getb();tectd:piate:inteemen;int ,a,b,maxze;ool SeqSuae::sEpy() /判断就是否为空tun(to=1)?rue:fale;bolSeqSque::IsFull() /判断就是否已满retrn(top=maxSize-1)?ue:fl;o
13、id eSquare:deca()a;vd eqquare::deb();it eSquare::geSze()retur top1;in SSqure:getmaxSize()turn maxSze;int SqSqare::gettop()rurtop;itSeqquare:gea()rtun a;in SSquare::getb()etunb;SeqSae::qSqae(int )top 1;a = b =;maSe =n;elements = new tmaxSze;odeqSquae::P(int )f(IsFll()=tru)a=a+1;elseements+top= x;void
14、 Seqqure:(it )i(IsEmty()=tue)b =+;ex =elementtp;vododucer(SeqSre *a) /生产者操作a-P(1);vid consr(SeqSquae *a) 消费者操作 -V(1);Sqquar::SSquare()dlete eemns;/缓冲区显示vid howuf(eqSquare a)inti=agetSe();intmain()inti,n;cut请输入缓冲区大小:”en;cinn;Seqquar ;s = ne SqSqare(n);while(i!=4)c请选择操作: nd;cou1、生产一件产品;、消费一件产品”n;cut”、
15、显示缓冲区; 4、退出系统. endl;cotgta()=0)outenl成功生产一件商品!”endlenl;elecutendl”没有空间供生产者生产!edledl;s-deca();bra;case :osumr(s);f (-getb()=0)oendl成功消费一件商品!endlendl;escoutdl没有产品供消费者消费!ndedl;bre;cas 3:shwbf(s);coutendl缓冲区已占用:-geSze() 可用空间为:(ngetSiz())edend;beak;ae 4:otel”成功退出程序!”endlenl;brek;as 5:coued请输入缓冲区大小:end;cinn;s =nwSqquare(n);ctd”缓冲区大小已发生改变,数据已清除!”dlend;brak;eful:outendl输入操作不正确,请重新输入!ndledl;return 0;
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100