《生产者消费者问题设计与实现》由会员分享,可在线阅读,更多相关《生产者消费者问题设计与实现(19页珍藏版)》请在金锄头文库上搜索。
1、word 操作系统 课程设计任务书 学 院计算机与信息工程专 业计算机科学与技术课程名称操作系统题 目生产者消费者问题设计与实现完成期限自2015年6月23日至2015年6月29日共1周内容与任务一、项目的目的1.理生产者消费者问题根本概念和工作原理,以与实现技术;2.理解并掌握生产者消费者问题相关算法,以与它的实现方法;3.掌握在eclipse环境下,系统开发的根本步骤和方法;在eclipse环境下,设计和开发一个简单的生产者消费者问题系统来模拟操作系统中生产者消费者问题。二、项目任务的主要内容和要求1.精读并理解和掌握生产者消费者问题;2.编写程序来模拟生产者消费者问题的实现;3.编写应用
2、程序测试生产者消费者问题,并显示结果。三、项目设计研究思路本课程设计的根本思路是,首先理解和掌握生产者消费者问题的根本思想和原理,然后根据理解的根本思想和原理编程实现生产者消费者问题,最后通过数据分析生产者消费者问题。四、具体成果形式和要求 成果:生产者消费者问题程序语言实现;设计说明书。要求:编写好的生产者消费者问题程序能够正确启动运行;设计说明书规X、合理。进度安排起止日期工作内容熟悉相关内容系统设计和实现系统实现和撰写相关文档主要参考资料1.计算机操作系统汤子瀛哲凤屏 汤小丹主编 某某电子科技大学.2.计算机操作系统概论陈宏 杨忠耀主编 某某邮电大学.3.计算机操作系统根本知识廖成 X阳
3、 主编 电子工业.4.操作系统实现与设计陆刚 望能主编 电子工业.5.java程序语言设计丁振凡主编,薛清华副主编清华大学.指导教师意见签字: 年 月 日系教研室主任意见签字: 年 月 日 / 目录1111112参考文献13致谢13附录14指导教师评语19成绩评定19生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者如此可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两类:1采用某种机制保护生产者和消费者之间的同步;2在生产者和消费者之间建立一个管道。第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的
4、模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。因此本文只介绍同步机制实现的生产者/消费者问题。同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。2设计思路2.消费者问题是一种同步问题的抽象描述。2.2计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。2.3而当某个进程释放资
5、源时,如此它就相当一个生产者首先,生产者和消费者可能同时进入缓冲区,甚至可能同时读/写一个存储单元,将导致执行结果不确定。这显然是不允许的。所以,必须使生产者和消费者互斥进入缓冲区。即某时刻只允许一个实体生产者或消费者访问缓冲区,生产者互斥消费者和其他任何生产者。 其次,生产者不能向满的缓冲区写数据,消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空存储单元,假如缓冲区存储单元全部用完,如此生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。假如缓冲区内有“空存储单元,生产者需要判断此时是否有别的生产者或消
6、费者正在使用缓冲区,假如是有,如此阻塞等待,否如此,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权。消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,假如缓冲区为“空,如此阻塞等待,否如此,判断缓冲区是否正在被使用,假如正被使用,假如正被使用,如此阻塞等待,否如此,获得缓冲区的使用权,进入缓冲区取数据,释放缓冲区的使用权。3.1.1生产者流程图:消费者流程图:主程序流程图:3.1.4生产者:ProducerThread /定义生产者线程class ProducerThread implements Runnable intproductNo = 0; /产品编号intid
7、; /生产者IDpublic ProducerThread(intid)this.id = id;publicvoid run()while(isRun)productNo+; /生产产品buffers.put(productNo, id); /将产品放入缓冲队列tryThread.sleep(1000);catch(Exception e)e.printStackTrace();3.1.5消费者 ConsumerThread /定义消费者线程class ConsumerThread implements Runnable intid; /消费者IDpublic ConsumerThread(
8、intid)this.id = id;publicvoid run()while(isRun)buffers.get(id); /从缓冲队列中取出产品tryThread.sleep(1000);catch(Exception e)e.printStackTrace();3.1.6缓冲区Buffer class Buffer JTextArea ta;staticfinalintproductBufferNum = 10; /缓冲单元数ProductBuffer pBuffer = new ProductBufferproductBufferNum; /缓冲队列intin = 0; /缓冲单元指
9、针,用于放产品get()intout = 0; /缓冲单元指针,用于取产品put()intconsumeProductNo; /记录消费产品的编号intusedBufferNum = 0; /记录缓冲队列已使用的缓冲单元个数public Buffer (JTextArea ta)this.ta = ta;/初始化for(intj=0; jproductBufferNum; j+)pBufferj = new ProductBuffer();for(inti=0; iproductBufferNum; i+)pBufferi.product = -1;pBufferi.hasProduct =
10、false;/取产品publicsynchronizedvoid get(intid)/缓冲队列空如此等待if(usedBufferNum = 0)trysuper.wait();catch(Exception e)e.printStackTrace();consumeProductNo = pBufferout.product; /取出产品pBufferout.product = 0; /清空缓冲单元pBufferout.hasProduct = false; /置无产品标识usedBufferNum-;/输出本次取产品后缓冲队列的情况ta.append(消费者+id+将产品+consume
11、ProductNo+从缓冲单元+out+取出,缓冲队列状态如下:n);printBuffer();out=(out+1)%productBufferNum; /更新指针/唤醒等待线程super.notify();/放产品publicsynchronizedvoid put(intproductNo, intid)/缓冲队列满如此等待if(usedBufferNum = productBufferNum)trysuper.wait();catch(Exception e)e.printStackTrace();pBufferin.product = productNo; /放产品pBufferi
12、n.hasProduct = true; /置“有产品标识usedBufferNum+;/输出本次放入产品后,缓冲队列的情况ta.append(生产者+id+将产品+productNo+放入缓冲单元+in+,缓冲队列状态如下:n);printBuffer();in=(in+1)%productBufferNum; /更新指针/唤醒等待线程super.notify();/打印缓冲队列当前情况privatevoid printBuffer()ta.append( 缓冲单元编号 产品编号 缓冲单元状态n);for(inti=0; iproductBufferNum; i+)ta.append(t+i
13、+t+pBufferi.product+t+pBufferi.hasProduct+n);/*一个缓冲单元*/class ProductBuffer intproduct; /存放产品编号booleanhasProduct; /标识该缓冲区是否有产品,true有产品,false无产品publicvoid createUI()JFrame frame = new JFrame(生产者消费者);JPanel panel = new JPanel(new BorderLayout();/ta.setBackground(Color.blue);JScrollPane scrPane = new JScrollPane(ta);panel.add(scrPane, BorderLayout.CENTER);utton button = new utton(停止);button.addActionListener(this);panel.add(button, BorderLayout.SOUT