操作系统课程设计报告―多进程同步橘子苹果问题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:__班级:__学号:题目:用多进程同步方法演示“桔子-苹果”问题____起迄日期:_2012.07.02_--2012.07.13_____设计地点:现代教育中心指导教师:熊晓芸2011—2012年度第2学期完成日期:2012年7月13日一、课程设计目的本次实验进行操作系统课程设计的主要任务是模拟生产者和消费者的一个衍生,即-1-实现“橘子-苹果问题”。这个问题中有两个生产者,分别生产苹果核橘子,有两个消费者,分别消费橘子和苹果。同时,因为两个生产者和两个消费者对同一个缓冲区进行操作,所以应互斥的访问缓冲区以保证程序的正确性。本次实验的目的就是加深各个进程正确有效的对资源的访问,即同步和互斥。同时掌握信号量在互斥访问中的使用。掌握生产者和消费者问题的流程和实现方法。同时提高编程的能力、对问题的解决能力及查阅文档的能力。二、课程设计内容与要求1、通过研究Linux的进程同步机制和信号量,实现特殊的生产者与消费者问题的并发控制。2、说明:有两类生产者,一类负责生产桔子,一类负责生产苹果;有两类消费者,一类负责消费桔子,一类负责消费苹果;他们共享一个有20个存储单元的有界缓冲区,每个存储单元只能放入一种产品(桔子/苹果)。3、设计要求:1)二类生产者与二类消费者数目均为20,即20个生产者负责生产桔子,20个生产者负责生产苹果;20个消费者负责消费桔子,20个消费者负责消费苹果2)二类生产者的生产速度与二类消费者的消费速度均可独立在程序界面调节,在运行中,该值调整后立即生效3)多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码,同时需要考虑算法的效率性4)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符5)采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态三、系统分析与设计1、系统分析1.此次任务是实现特殊生产者和消费者的演示程序,所需要处理的信息是生产者和消费者的个数,生产苹果、橘子和消费苹果、橘子的速度控制,缓冲区中橘子和苹果的个数和当前生产、消费指针的位置。2.程序中需要处理缓冲区的动态显示、生产者和消费者的速度可以调节,生产者和消费者个数可以改变。为了实现界面的友好性,应该对用户标明清楚各个模块的作用。同时实时的对程序进行暂停和停止。演示程序中用图形显示的方法描述缓冲区的使用情况,即当前缓冲区有多少个苹果和橘子,还有生产和消费者的指针。3.系统对外的界面如下:可以调节橘子和苹果的生产速度和消费苹果和橘子的速度,在文本框中输入相应的速度,再按下修改按键即可实现速度的实时调节。在苹果生产者、橘子生产者、苹果消费者、橘子消费者中实现对个数按钮的按下即可动态实时的调节生产者和消费者的个数的调节。在界面的最下面点击开始按钮,程序开始运行,暂停按钮使程序暂停挂起,再点击则可以继续运行。停止按钮实现此次程序的演示结束。4.此次使用java平台实现,保证了程序在各种机器的运行,只需要事前建立java的运行环境即可,便于程序的移植5.系统界面如下:-2-2、系统设计:2.1、模块设计:系统主模块主界面模块生产者控制模块消费者控制模块块有界缓冲区控制模块人工智能模块动态显示区程序速度控制区生产者和消费者数字调节开始、暂停、终止按键区-3-2.2、数据结构说明:1.缓冲区的数据结构:双端队列说明:左端放置生产苹果的指针,右端放置生产橘子的指针。2.缓冲区操作的类图,实现对缓冲区的实际操作2.3、算法流程图:1.生产苹果算法主界面模块绘图模块动态进度条生产者数目调节消费者数目调节生产者速度调节消费者速度调节缓冲区苹果指针橘子指针缓冲区MyStorage生产苹果increaseapple()生产橘子increaseorange()消费苹果decreaseapple()消费橘子decreaseorange()缓冲区状态isFull互斥信号量mutex同步信号量emptyfull苹果指针pointapple橘子指针pointorange-4-2.消费苹果算法申请空缓冲区full=full+1信号量full大于0pointapple=pointapple-1isFull[applepoint]=falsePool[pointapple]=0打印缓冲区状态apple=apple-1empty=empty+1释放缓冲区线程阻塞YN申请空缓冲区信号量empty大于0pointapple=pointapple+1isFull[applepoint]=truePool[pointapple]=1打印缓冲区状态apple=apple+1full=full+1释放缓冲区线程阻塞NY-5-3.绘图算法4.生产苹果者人工智能算法(生产橘子人工智能相似)5.苹果消费者人工智能算法(生产橘子算法类似)i=i+1i20?pool[i]=0pool[i]=1填充红色填充黄色画矩形画指针i=-1进入缓冲区缓冲区产品数16苹果=16增加苹果消费者,减少苹果生产者,增加橘子生产者生产苹果苹果=12拒绝生产请求增加苹果消费者退出缓冲区NYNYN-6-四、系统测试与调试分析1、系统测试(1)因为当苹果生产者在缓冲区满了以后自动阻塞,需要苹果消费者唤醒,所以需要测试唤醒的实现是否正常。测试说明测试名称用多进程同步方法演示“桔子-苹果”问题测试目的验证苹果生产者能被苹果消费者唤醒测试技术单元测试测试方法黑盒测试法测试用例测试内容当生产者生产满缓冲区后,开始增加消费者,唤醒生产者测试步骤增加苹果生产者等待缓冲区被用完增加苹果消费者测试数据增加苹果生产者到3缓冲区苹果数量20缓冲区空闲位为0苹果消费者增加到4预期结果缓冲区开始增加苹果缓冲区满苹果生产者阻塞苹果生产者被唤醒,缓冲区中苹果数量减少测试结果与预期相符与预期相符与预期相符(2)因为当苹果生产者在缓冲区满了以后自动阻塞,需要苹果消费者唤醒,所以需要测试唤醒的实现是否正常。测试说测试名称用多进程同步方法演示“桔子-苹果”问题测试目的验证多个苹果橘子生产者和苹果、橘子消费者互斥操作缓冲区测试技术单元测试进入缓冲区缓冲区产品数=4苹果个数2消费苹果增加苹果生产者减少苹果消费者增加橘子生产者增加橘子生产者减少橘子消费者增加苹果生产者退出缓冲区YNYN橘子数2增加橘子生产者减少橘子消费者增加苹果生产者苹果数2增加苹果生产者减少苹果消费者增加橘子生产者YYNN-7-明测试方法黑盒测试法测试用例测试内容缓冲区为空,消费者阻塞时,生产者唤醒消费者测试步骤开始生产产品,缓冲区为空空闲位20开始消费产品,终止生产线程开始增加生产者减少消费者测试数据橘子生产者数量5苹果生产者数量5苹果生产者减少到0橘子生产者减少到0增加橘子消费者到5增加苹果消费者到5增加苹果生产者到5增加橘子生产者到5减少橘子消费者到2减少苹果消费者到2预期结果缓冲区内产品数量每次减少10个消费完成产品,消费者阻塞唤醒消费者,缓冲区中产品增加测试结果与预期相符与预期相符与预期相符(3)测试生产者和消费者的速度是否可以调节测试说明测试名称用多进程同步方法演示“桔子-苹果”问题测试目的苹果、橘子生产者和苹果、橘子消费者速度可以调节测试技术单元测试测试方法黑盒测试法测试用例测试内容调节生产者和消费者速度测试步骤开始程序运行输入生产者、消费者速度值点击修改按钮测试数据苹果、橘子生产者速度2000苹果、橘子消费者速度2000生产者的速度值1000消费者速度值1000点击修改预期结果缓冲区开始被操作界面文本框中显示速度值生产者、消费者速度变化到1000测试结果与预期相符与预期相符与预期相符(4)实现了人工智能操作:即系统自动保持生产者和消费者的相对平衡,测试功能的正确实现测试说明测试名称用多进程同步方法演示“桔子-苹果”问题测试目的测试编写的人工智能是否实现测试技术单元测试测试方法黑盒测试法测试用例测试内容自动维持缓冲区的稳定测试步骤开始程序的运行运行人工智能操作测试数据苹果生产者5苹果消费者5橘子生产者3橘子消费者0减少苹果生产者到0增加苹果消费者数量到6预期结果缓冲区开始被操作生产者、消费者数量都靠拢至4测试结果与预期相符与预期相符与预期相符2、调试分析:-8-(1)程序编写过程中,因为有两个生产者和消费者,极易把操作写错。在编写增加苹果数量额函数中,程序中午无法增加苹果数量。解决办法:在函数中查找错误,对苹果的操作写成了对橘子的操作,导致程序出现问题。(2)在对缓冲区进行绘图的时候,java的JComponent组件内绘图位置出现错误。解决办法:JComponent内绘图时因为JComponent内使用的是相对坐标,所以不能使用面板的绝对坐标,换成相对坐标正确绘图。(3)实现人工智能操作的时候,点击相应按钮无法执行解决办法:在排查完毕后,发现按键响应没有对程序已经设计的标志值进行修改,致使程序没有按预期执行,修改完标志值即可以。五、用户手册1.使用的语言和平台本次实验使用的是java语言的eclipse平台2.对于程序运行环境的注意事项需要安装java运行环境,eclipss平台不需要安装,只需要下载完成就可以使用。3.程序使用步骤图1:系统登录界面。-9-图2:生产者速度调节图3:消费者速度调节图4:生产者数量调节图5:消费者数量调节图6::控制界面图7:动态可视化缓冲区4.程序使用步骤:1)单击开始按钮,程序开始初始化执行2)点击增加按钮分别增加生产者和消费者,可以看到可视化缓冲区开始运动-10-3)在速度调节部分调节生产者和消费者的速度,可以看到缓冲区出现预期的产品种类和数量的变化。4)在程序运行状态,可以点击“人工智能”按钮,可以实现人工智能自动操作缓冲区,保持缓冲区的产品数量和种类的稳定,不至于产品数量过多或过少,也不会出现某种产品数量过多或者过少。六、程序清单publicvoidincreaseapple(){empty.acquire();//相当于信号量的P操作,申请空缓冲区mutex.acquire();//互斥信号量if(pointapple+1!=pointorange){pointapple++;if(pointapple==20)pointapple=19;isFull[pointapple]=true;//将生产了产品的标志位设置为满applenum++;storage[pointapple]='A';//存储生产的产品pool[pointapple]=1;//标志此位置生产的是苹果,1表示苹果}Stringstr2=Thread.currentThread().getName();Apple.textArea2.append(生产者生产了一个苹果+str2+运行\n);number++;Apple.textArea1.append(仓库中的产品个数为+number+\n);Apple.textArea1.append(它们是:\n);for(intj=0;j20;j++){if(storage[j]!='0')Apple.textArea1.append((+j+)+storage[j]+);elseApple.textArea1.append();}Apple.textArea1.append(\n);mutex.release();//释放互斥锁-11-full.release();//增加满信号量的值apple.release();//增加苹果信号量的值}publicvoidincreaseorange(){empty.acquire();//相当于信号量的P操作,申请空缓冲区mutex.acquire();//互斥进入临界区if(pointapple+1!=pointorange){pointorange--;if(pointorange0)pointorange=0;isFull[pointorange]=true;//将

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功