




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z.理工大学操作系统课程设计报告院〔系〕:计算机工程学院专业:计算机科学与技术专业学生:__班级:_______**:题目:用多进程同步方法演示“生产者-消费者〞问题起迄日期:设计地点:指导教师:年度第学期完成日期:年月日课程设计目的本次进展操作系统课程设计的主要任务是设计一个模拟生产者消费者工作的系统。这个问题中有一种生产者和一种消费者,生产者和消费者对同一个缓冲区进展操作,互斥的访问缓冲区。本次课程设计的目的就是加深对多进程如何正确访问资源的认识,同时掌握信号量在互斥访问时应该如何正确有效地使用。掌握生产者消费者问题的解决流程和方法,提高编程能力、解决问题的能力和查阅文档的能力。课程设计容与要求1、设计目的:通过研究Linu*的进程同步机制和信号量,实现生产者消费者问题的并发控制。2、说明:有界缓冲区设有20个存储单元,放入取出的产品设定为20个100以的随机整数。3、设计要求:生产者与消费者均有二个以上生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效生产者生产的产品由随机函数决定多个生产者或多个消费者之间必须有共享对缓冲区进展操作的函数代码每个生产者和消费者对有界缓冲区进展操作后,即时显示有界缓冲区的全部容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态系统分析与设计系统分析系统分析1.此次课程设计的任务是生产者消费者问题的模拟演示,需要处理的数据有:生产者进程数目,消费者进程数目,生产者生产速度,消费者消费速度,缓冲区中产品的个数,以及生产、消费产品的指针。2.程序中需要缓冲区中的信息可以动态演示,生产者、消费者的个数以及生产、消费时的速度可以随时调节,同时为了使程序更加友好,应该具有开场、暂停、停顿等相关可操作按钮。3.系统对外的界面如下:1〕对进程个数的修改:点击生产者、消费者进程数据文本框下的增加、减少按钮2〕对速度的修改:速度值默认为2000ms/个,如需修改,则在速度文本框中输入所修改的值,点击修改按钮即可进展修改。3〕需要开场模拟时,点击右上方的开场按钮。如需暂停模拟过程,可点击暂停按钮。当需要运行完毕时,点击停顿按钮,进程工作停顿。4.此次使用java平台实现,保证了程序在各种机器的运行,只需要事前建立java的运行环境即可,便于程序的移植5.系统界面如下:开场、暂停、停顿按钮区进程工作情况动态显示区开场、暂停、停顿按钮区进程工作情况动态显示区进程数目调节区进程数目调节区程序速度控制调节区程序速度控制调节区2、系统设计:主界面2.1、模块设计:主界面系统主模块系统主模块消费者速度调节生产者速度调节消费者数目调节生产者数目调节消费者速度调节生产者速度调节消费者数目调节生产者数目调节有界缓冲区控制消费者控制生产者控制主界面有界缓冲区控制消费者控制生产者控制主界面2.2、数据构造说明:产品指针pointcp缓冲区产品指针pointcp缓冲区同步信号量emptyfull消费Consume生产消费Consume生产Produce缓冲区状态E_F缓冲区状态E_F互斥信号量mute*2.3、算法流程图:生产者流程图:申请空缓冲区申请空缓冲区信号量enmpty>0信号量enmpty>0NO仓库已满,线程阻塞NO仓库已满,线程阻塞YESYESpointcp=pointcp+1pointcp=pointcp+1E_F[pointcp]=trueE_F[pointcp]=true打印缓冲区状态打印缓冲区状态chanpin=chanpin+1chanpin=chanpin+1full=full+1释放缓冲区释放缓冲区消费者流程图:申请空缓冲区申请空缓冲区full=full+1信号量full>0仓库已满,线程阻塞信号量full>0仓库已满,线程阻塞NONOYESYESpointcp=pointcp-1pointcp=pointcp-1释放缓冲区E_F[pointcp]=false释放缓冲区E_F[pointcp]=falsechanpin=chanpin-1chanpin=chanpin-1empty=empty+1打印缓冲区状态打印缓冲区状态四、系统测试与调试分析1、系统测试〔1〕因为当生产者在缓冲区满了以后自动阻塞,需要消费者唤醒,所以需要测试唤醒的实现是否正常。测试说明测试名称用多进程同步方法演示“生产者-消费者〞问题测试目的验证生产者能被消费者唤醒测试技术单元测试测试方法黑盒测试法测试用例测试容当生产者生产满缓冲区后,开场增加消费者,唤醒生产者测试步骤增加生产者等待缓冲区被用完增加消费者测试数据增加生产者到2缓冲区产品数量20缓冲区空闲位为0苹果消费者增加到3预期结果缓冲区开场增加产品缓冲区满生产者阻塞生产者被唤醒,缓冲区中产品数量减少测试结果与预期相符与预期相符与预期相符〔2〕因为当生产者在缓冲区满了以后自动阻塞,需要消费者唤醒,所以需要测试唤醒的实现是否正常。测试说明测试名称用多进程同步方法演示“生产者-消费者〞问题测试目的验证多个生产者和消费者互斥操作缓冲区测试技术单元测试测试方法黑盒测试法测试用例测试容缓冲区为空,消费者阻塞时,生产者唤醒消费者测试步骤开场生产产品,缓冲区为空空闲位20开场消费产品,终止生产线程开场增加生产者减少消费者测试数据生产者数量5生产者减少到0增加消费者到5增加生产者到5减少消费者到2预期结果缓冲区产品数量每次增加5个消费完成产品,消费者阻塞唤醒消费者,缓冲区中产品增加测试结果与预期相符与预期相符与预期相符3〕测试生产者和消费者的速度是否可以调节测试说明测试名称用多进程同步方法演示“生产者-消费者〞问题测试目的苹果、橘子生产者和苹果、橘子消费者速度可以调节测试技术单元测试测试方法黑盒测试法测试用例测试容调节生产者和消费者速度测试步骤开场程序运行输入生产者、消费者速度值点击修改按钮测试数据生产者速度2000消费者速度2000生产者速度值1000消费者速度值1000点击修改预期结果缓冲区开场被操作界面文本框中显示速度值速度均变化到1000测试结果与预期相符与预期相符与预期相符2、调试分析:1.在编写过程中,由于函数较多,开场时由于名称不够清晰,程序出现错误。2.测试运行过程中,由于函数名称的相似,出现引用混乱的情况,程序无常运行。3.在制作界面时,由于遗忘了chuangkou.add(jp);chuangkou.setVisible(true);两个语句,导致界面无常显示。4.制作界面时,对各个控件的坐标和大小考虑不周,导致界面混乱,影响美观。五、用户手册1.使用的语言和平台本次实验使用的是java语言的eclipse平台2.对于程序运行环境的考前须知需要安装java运行环境,eclipss平台不需要安装,只需要下载完成就可以使用。程序使用步骤图1:系统登录界面。图2:生产者速度调节图3:消费者速度调节图4:生产者数量调节图5:消费者数量调节图6::控制界面图7:动态显示缓冲区4.程序使用步骤:1〕单击开场按钮,程序开场初始化执行2〕点击增加按钮分别增加生产者和消费者,可以看到可视化缓冲区开场运动3〕在速度调节局部调节生产者和消费者的速度,可以看到缓冲区出现预期的产品种类和数量的变化。六、程序清单classConsumere*tendsThread{privatehuanchongquhcq;//保存一个缓冲区类的引用staticlongspeed=2000;//speed表示消费者线程的速度staticintcpause=0;//cpause变量用来控制消费者线程的开场与暂停booleanout=false;//定义构造方法,接收一个缓冲区类型的变量publicConsumer(huanchongquhcq) {this.hcq=hcq; }//run()方法调用接收的缓冲区类型的变量指向的decrease()方法,开场消费元素。Overridepublicvoidrun() {while(!out) {if(out)break;if(cpause==1) {try { Thread.sleep(speed); }catch(InterruptedE*ceptione) { e.printStackTrace(); }hcq.Consume(); } } }}classProducere*tendsThread{privatehuanchongquhcq;//定义缓冲区类的引用。staticlongspeed=2000;//定义speed变量,表示线程速度booleanout=false;publicstaticintppause=0;//ppause变量用来控制生产者线程的开场与暂停//定义构造方法,接收一个缓冲区类型的变量publicProducer(huanchongquhcq) {this.hcq=hcq; }publicvoidchangeout() {out=!out; }//run()方法调用缓冲区类型变量指向的对象的increase()方法,开场生产元素。Overridepublicvoidrun() {while(!out) {if(out)break;if(ppause==1) {try { Thread.sleep(speed); }catch(InterruptedE*ceptione) { e.printStackTrace(); }hcq.Produce(); } } }}classhuanchongqu{//number表示动态缓冲区中元素的数量staticintnumber=0;staticboolean[]E_F=newboolean[20];//缓冲区状态控制staticint[]storage=newint[20];staticSemaphoreempty=newSemaphore(20);staticSemaphorefull=newSemaphore(0);staticSemaphorechanpin=newSemaphore(0);staticSemaphoremute*=newSemaphore(1);staticintcpnum=0;staticintpointcp=-1;publichuanchongqu() {for(inti=0;i<20;i++) {E_F[i]=false;storage[i]='0'; } }publicvoidProduce() {empty.acquire();//信号量的p操作,申请空缓冲区mute*.acquire();//互斥信号量if(pointcp+1!=20){pointcp++;E_F[pointcp]=true;//将生产了产品的标志位设为满cpnum++;storage[pointcp]=(int)(Math.random()*99+0);//存储生产的产品 } Stringstr2=Thread.currentThread().getName(); pc.ta2.append("生产者"+str2+"运行\n");number++; pc.ta1.append("仓库中的产品个数为"+number+"\n"); pc.ta1.append("它们是:\n");for(intj=0;j<20;j++) {if(storage[j]!='0') pc.ta1.append("("+j+")"+storage[j]+"");else pc.ta1.append(""); }if(number==20){ pc.ta1.append("\n仓库已满"); } pc.ta1.append("\n");mute*.release();//释放互斥锁full.release();//增加满信号量的值chanpin.release();//增加产品信号量的值 }publicvoidConsume() {chanpin.acquire();//申请获得产品full.acquire();//申请满缓冲区mute*.acquire();//互斥进入临界区 Stringstr2=Thread.currentThread().getName(); pc.ta2.append("消费者"+str2+"运行\n");number--;cpnum--;E_F[pointcp]=false;//设置为空storage[pointcp]='0';pointcp--;//产品指针减一 pc.ta1.append("仓库中的数字个数为"+number+"\n"); pc.ta1.append("它们是:\n");for(intj=0;j<20;j++) {if(storage[j]!='0') pc.ta1.append("("+j+")"+storage[j]+"");else pc.ta1.append(""); }if(number==0){ pc.ta1.append("\n仓库已空"); } pc.ta1.append("\n");mute*.release();//退出临界区empty.release();//空缓冲区信号量加一 } }classSemaphore{intvalue;publicSemaphore(intv){this.value=v; }//定义P、V原语操作,原语操作就是执行时不能中断,所以synchronized修饰publicsynchronizedvoidacquire(){//获取value--;if(value<0){try{this.wait();//等待 }catch(InterruptedE*ceptione){ e.printStackTrace(); } } }publicsynchronizedvoidrelease(){//释放value++;if(value<=0){this.notify();//唤醒 } }}七、体会与自我评价对于本次课程设计,我采用了java语言进展程序编制。因为相对于mfc等,java语言更轻便简洁,在绘制可视化图形界面时也相对容易很多。可是由于对java了解不深,掌握的也不是很好,所以编制的程序并不算完美。比方在按了暂停按钮或停顿按钮之后,程序会出现延迟等现象。本次实验并没有特别困难的算法。其实主要的算法只有两种,一种是生产者的生产过程,一种是消费者的消费过程。在设计过程中,由于生产者与消费者需要互斥的访问缓冲区,将产品放进去或从里面取出,所以最后决定使用指针的方法,通过指针前后移动来表现产品被放入缓冲池或取出缓冲池的过程。刚开场时,我将指针的初值设置为0,但是出现的产品只有19个,不符合20个缓冲池的要求。后来我发现是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《糖尿病伴低钾血症》课件
- 赣州师范高等专科学校《路桥施工技术》2023-2024学年第一学期期末试卷
- 赣南师范大学《机械工程测试技术英》2023-2024学年第一学期期末试卷
- 赣南科技学院《锅炉原理课程设计》2023-2024学年第一学期期末试卷
- 《克隆与治疗性克隆》课件
- 甘孜职业学院《数字影像工程》2023-2024学年第一学期期末试卷
- 七年级道德与法治上册第一单元成长的节拍第三课发现自己第一框认识自己教案新人教版
- 《微小世界和我们》课件
- git内部培训课件
- 中学生交通安全教育
- 上海市市辖区(2024年-2025年小学五年级语文)部编版期末考试(上学期)试卷及答案
- 第10课《我们不乱扔》(教学设计)-部编版道德与法治二年级上册
- 期末试卷(试题)-2024-2025学年五年级上册数学人教版
- 护理安全警示教育-新-
- 社会工作行政复习要点
- 2025届浙江省乐清市知临中学高一数学第一学期期末检测试题含解析
- 课程设计报告课程设计报告书(3篇)
- SOR-04-014-00 药品受托生产企业审计评估报告模板
- 三级电子商务师理论考试题(含答案)
- 智慧物流第10套理论题附有答案
- 2024AI时代的社交媒体营销进化
评论
0/150
提交评论