多进程同步方法演示“生产者-消费者”问题_第1页
多进程同步方法演示“生产者-消费者”问题_第2页
多进程同步方法演示“生产者-消费者”问题_第3页
多进程同步方法演示“生产者-消费者”问题_第4页
多进程同步方法演示“生产者-消费者”问题_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

1、.青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术专业学生姓名:班级:学号 :题目 :用多进程同步方法演示“生产者 -消费者”问题起迄日期 :设计地点 :指导教师:年度第 学期完成日期:年月日;.一、课程设计目的本次进行操作系统课程设计的主要任务是设计一个模拟生产者消费者工作的系统。这个问题中有一种生产者和一种消费者,生产者和消费者对同一个缓冲区进行操作,互斥的访问缓冲区。 本次课程设计的目的就是加深对多进程如何正确访问资源的认识,同时掌握信号量在互斥访问时应该如何正确有效地使用。掌握生产者消费者问题的解决流程和方法,提高编程能力、解决问题的能力和查阅文档的能力。

2、二、课程设计内容与要求1、设计目的:通过研究 Linux 的进程同步机制和信号量,实现生产者消费者问题的并发控制。2、说明:有界缓冲区内设有20 个存储单元,放入取出的产品设定为20 个 100 以内的随机整数。3、设计要求:1) 生产者与消费者均有二个以上2) 生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者3) 生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效4) 生产者生产的产品由随机函数决定5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界

3、缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符7) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态三、系统分析与设计1、系统分析系统分析1.此次课程设计的任务是生产者消费者问题的模拟演示,需要处理的数据有:生产者进程数目,消费者进程数目,生产者生产速度,消费者消费速度,缓冲区中产品的个数,以及生产、消费产品的指针。2.程序中需要缓冲区中的信息可以动态演示,生产者、消费者的个数以及生产、消费时的速度可以随时调节,同时为了使程序更加友好, 应该具有开始、 暂停、停止等相关可操作按钮。3.系统对外的界面如下:1)对进程个数的修改:点击

4、生产者、消费者进程数据文本框下的增加、减少按钮2)对速度的修改:速度值默认为 2000ms/个,如需修改,则在速度文本框中输入所修改的值,点击修改按钮即可进行修改。3)需要开始模拟时,点击右上方的开始按钮。如需暂停模拟过程,可点击暂停按钮。当需要运行完毕时,点击停止按钮,进程工作停止。;.4.此次使用 java 平台实现, 保证了程序在各种机器的运行, 只需要事前建立 java 的运行环境即可,便于程序的移植5.系统界面如下:进程工作情况动态显示区开始、暂停、停止按钮区2、系统设计:2.1、模块设计:系统主模块主生消界产费面者者控控制制2.2、数据结构说明:同步信号量emptyfull互斥信号

5、量mutex进程数目调节区程序速度控制调节区主界面生消生消有产费产费界者者者者缓数数速速冲目目度度区调调调调控节节节节制产品指针缓冲区pointcp;.2.3、算法流程图:生产者流程图:申请空缓冲区信号量 enmpty>0YESpointcp = pointcp+1E_Fpointcp=true打印缓冲区状态chanpin = chanpin+1full = full+1释放缓冲区消费者流程图:申请空缓冲区full = full+1信号量 full>0YESpointcp = pointcp-1E_Fpointcp=false打印缓冲区状态.NO仓库已满, 线程阻塞NO仓库已满,

6、线程阻塞释放缓冲区chanpin = chanpin-1empty = empty+1;.四、系统测试与调试分析1、系统测试( 1)因为当生产者在缓冲区满了以后自动阻塞,需要消费者唤醒,所以需要测试唤醒的实现是否正常。测测试名称用多进程同步方法演示“生产者-消费者”问题试测试目的验证生产者能被消费者唤醒说测试技术单元测试明测试方法黑盒测试法测试内容当生产者生产满缓冲区后,开始增加消费者,唤醒生产者测测试步骤增加生产者等待缓冲区被用完增加消费者测试数据增加生产者到 2缓冲区空闲位为0苹果消费者增加到 3试缓冲区产品数量 20用预期结果缓冲区开始增加产品缓冲区满 生产者阻塞生产者被唤醒,缓冲区例中

7、产品数量减少测试结果与预期相符与预期相符与预期相符( 2)因为当生产者在缓冲区满了以后自动阻塞,需要消费者唤醒,所以需要测试唤醒的实现是否正常。测测试名称用多进程同步方法演示“生产者-消费者”问题试测试目的验证多个生产者和消费者互斥操作缓冲区说测试技术单元测试明测试方法黑盒测试法测试内容缓冲区为空,消费者阻塞时,生产者唤醒消费者测试步骤开始生产产品,缓冲区开始消费产品,终止生产线开始增加生产者测为空 空闲位 20程减少消费者测试数据生产者数量 5生产者减少到 0增加生产者到 5试增加消费者到 5减少消费者到 2用例预期结果缓冲区内产品数量每次消费完成产品,消费者阻塞唤醒消费者,缓冲区中增加 5

8、个产品增加测试结果与预期相符与预期相符与预期相符3)测试生产者和消费者的速度是否可以调节测测试名称用多进程同步方法演示“生产者-消费者”问题试测试目的苹果、橘子生产者和苹果、橘子消费者速度可以调节说测试技术单元测试明测试方法黑盒测试法测测试内容调节生产者和消费者速度测试步骤开始程序运行输入生产者、 消费者速度值点击修改按钮试测试数据生产者速度 2000生产者速度值 1000点击修改用消费者速度 2000消费者速度值 1000例预期结果缓冲区开始被操作界面文本框中显示速度值速度均变化到 1000;.测试结果与预期相符与预期相符与预期相符2、调试分析:1. 在编写过程中,由于函数较多,开始时由于名

9、称不够清晰,程序出现错误。2. 测试运行过程中,由于函数名称的相似,出现引用混乱的情况,程序无法正常运行。3. 在制作界面时, 由于遗忘了 chuangkou.add(jp);chuangkou.setVisible(true);两个语句,导致界面无法正常显示。4. 制作界面时,对各个控件的坐标和大小考虑不周,导致界面混乱,影响美观。五、用户手册1.使用的语言和平台本次实验使用的是java 语言的 eclipse 平台2.对于程序运行环境的注意事项需要安装java 运行环境, eclipss 平台不需要安装,只需要下载完成就可以使用。3.程序使用步骤图 1:系统登录界面。图 2:生产者速度调节

10、图 3:消费者速度调节图 4:生产者数量调节图 5:消费者数量调节;.图 6::控制界面图 7:动态显示缓冲区4.程序使用步骤:1)单击开始按钮,程序开始初始化执行2)点击增加按钮分别增加生产者和消费者,可以看到可视化缓冲区开始运动;.3)在速度调节部分调节生产者和消费者的速度,可以看到缓冲区出现预期的产品种类和数量的变化。六、程序清单classConsumerextendsThreadprivatehuanchongquhcq ; / 保存一个缓冲区类的引用staticlongspeed = 2000;/speed表示消费者线程的速度staticintcpause = 0;/cpause变量

11、用来控制消费者线程的开始与暂停booleanout =false;/ 定义构造方法,接收一个缓冲区类型的变量publicConsumer(huanchongqu hcq)this. hcq = hcq;/run()方法调用接收的缓冲区类型的变量指向的decrease()方法,开始消费元素。Overridepublicvoidrun()while(!out )if ( out )break ;if ( cpause= 1)tryThread.sleep ( speed );.catch(InterruptedException e)e.printStackTrace();hcq .Consume

12、();classProducerextendsThreadprivatehuanchongquhcq ; / 定义缓冲区类的引用。staticlongspeed = 2000;/定义 speed 变量,表示线程速度booleanout =false;publicstaticintppause = 0;/ppause变量用来控制生产者线程的开始与暂停/ 定义构造方法,接收一个缓冲区类型的变量publicProducer(huanchongqu hcq)this. hcq = hcq;publicvoidchangeout()out = !out ;/run()方法调用缓冲区类型变量指向的对象的i

13、ncrease()方法,开始生产元素。Overridepublicvoidrun()while(!out )if ( out )break ;if ( ppause = 1)tryThread.sleep ( speed );.catch(InterruptedException e)e.printStackTrace();hcq .Produce();classhuanchongqu/number表示动态缓冲区中元素的数量staticintnumber = 0;staticbooleanE_F =new boolean 20;/ 缓冲区状态控制staticint storage=new in

14、t20;staticSemaphoreempty=new Semaphore(20);staticSemaphorefull=new Semaphore(0);staticSemaphorechanpin=new Semaphore(0);staticSemaphoremutex=new Semaphore(1);staticintcpnum = 0;staticint pointcp = -1;publichuanchongqu()for( inti = 0 ;i < 20 ;i+)E_Fi =false;storagei ='0'publicvoidProduce()

15、empty .acquire();/ 信号量的 p操作,申请空缓冲区mutex .acquire();/ 互斥信号量if ( pointcp+1!= 20)pointcp+;E_F pointcp =true ; / 将生产了产品的标志位设为满cpnum+;storage pointcp = (int)(Math.random ()*99+0);/ 存储生产的产品;.String str2 = Thread.currentThread().getName();pc. ta2 .append(" 生产者 " + str2 +"运行 n" );number

16、+;pc. ta1 .append(" 仓库中的产品个数为" +number +"n");pc. ta1 .append(" 它们是: n" );for( intj = 0; j < 20; j+)if ( storagej !='0')pc. ta1 .append("(" +j+ ")"+storagej +" ");elsepc. ta1 .append(" ");if ( number = 20)pc. ta1 .append

17、("n 仓库已满 " );pc. ta1 .append("n");mutex .release();/释放互斥锁full.release();/ 增加满信号量的值chanpin.release();/ 增加产品信号量的值publicvoidConsume()chanpin.acquire();/申请获得产品full.acquire();/申请满缓冲区mutex .acquire();/ 互斥进入临界区String str2 = Thread.currentThread().getName();pc. ta2 .append(" 消费者 &qu

18、ot; + 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 ( storagej !='0')pc. ta1 .append("(&

19、quot;+j+ ")"+storagej +" ");elsepc. ta1 .append(" ");.if ( number = 0)pc. ta1 .append("n 仓库已空 " );pc. ta1 .append("n");mutex .release();/ 退出临界区empty .release();/ 空缓冲区信号量加一classSemaphoreintvalue ;publicSemaphore(intv)this. value= v;/ 定义 P、 V原语操作,原语操作就

20、是执行时不能中断,所以synchronized 修饰publicsynchronizedvoidacquire()/ 获取value -;if ( value <0)trythis.wait();/ 等待catch(InterruptedException e) 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论