已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖北中医学院信息技术系 操作系统课程设计操作系统课程设计(一号黑体加粗)用多进程同步方法解决生产者-消费者问题院 系:医学信息工程学院 班 级:2009级信息工程(2)班 学 号:20090702065 姓 名:宋冰冰 同 组 者: 时 间:2011-12-1 目录一、题目:3二、设计目的:3三、总体设计思想概述:3四、说明:3五、设计要求:3六、设计方案:3七、流程图:4八、运行结果4九、源程序7十、总结15十一、参考文献15一、题目:(标题2,即三号黑体加粗)用多进程同步方法解决生产者-消费者问题。二、设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。三、总体设计思想概述:1、 生产者消费者问题是一种同步问题的抽象描述。2、 计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。3、 而当某个进程释放资源时,则它就相当一个生产者。四、说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。五、设计要求:1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。2、生产者和消费者各有两个以上。3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。六、设计方案:用Java语言编写程序1、 抽象化生产者与消费者之间的关系,然后实例化,分别定义如下类:、生产者类class Producer、消费者类class Consumer、产品类class Product、缓冲区类class Buffer、生产者与消费者的类class Producer_Consumer2、在main函数中多定义多个生产者与消费者线程Thread,并启动线程。3、使用实现线程同步4、Runnble类的接口与Thread类的继承。5、重载父类run方法,即重新构造run方法七、流程图:YES创建“生产者”线程缓冲区缓冲区是否满“生产者”等待“消费者”取出缓冲区的数据创建“消费者”线程“消费者”阻塞缓冲区是否为空产生数据“生产者”生产产品后被唤醒NONOYES八、运行结果1、截图一:2、 截图二:3、截图三:4、截图四:5、截图五:九、源程序public class Producer_Consumerpublic static void main(String args) Buffer buffer = new Buffer(); /创建Buffer类的对象 Producer p = new Producer(buffer); /创建Producer类的对象 Consumer c = new Consumer(buffer); /创建Consumer类的对象 /*下面的是用来模拟多线程,这样总共有三个生产者,三个消费者*/ new Thread(p,生产者1).start(); /启动生产者线程1 new Thread(c,消费者1).start(); /启动消费者线程1 new Thread(p,生产者2).start(); /启动生产者线程2 new Thread(c,消费者2).start(); /启动消费者线程2 new Thread(p,生产者3).start(); /启动生产者线程3 new Thread(c,消费者3).start(); /启动消费者线程3 /*定义产品类*/class Product int product = 0; /定义一个变量表示产品Product(int product) duct = product; /*定义缓冲区类*/class Buffer int Count = 0; /定义一个变量,表示缓冲区放满的数目 Product Products = new Product20; /创建20个缓冲区,用来放产品 /*用synchronized来实现同步*/ public synchronized void push(Product m)/同步方法,缓冲区中的放东西方法 while(Count = Products.length) /生产者要放东西,当通通放满时,必须等待 try System.out.println( Thread.currentThread().getName() + :缓冲区已满,请等待!); this.wait(); catch(InterruptedException e) System.out.println(Throw InterrupedEXception); e.printStackTrace(); /有可能抛出异常,必须对它进行捕捉 notifyAll(); /如果没有满,则生产者顺利放入产品 ProductsCount = m; Count+; public synchronized Product get() while(Count = 0) /消费者要拿东西,却发现什么都没有 try System.out.println(Thread.currentThread().getName() + :缓冲区已空,请等待!); this.wait(); catch(InterruptedException e) System.out.println(Throw InterrupedEXception); e.printStackTrace(); /有可能抛出异常,必须对它进行捕捉 Count-; notifyAll(); /若成功拿取,则把空位置的数目减1,并返回产品 return ProductsCount; /*定义生产者线程类*/class Producer extends Thread Buffer buffer; /声明生产者要放产品的缓冲区 Producer(Buffer buffer) this.buffer = buffer; /*定义一个新线程必须重写父类的run方法 */ public void run() for(int i = 1; i = 20; i+) if(buffer.Count 20) Product m = new Product(i); /生产20个产品 buffer.push(m); System.out.println( Thread.currentThread().getName() + 生产了 + duct + 产品总数: + buffer.Count); try Thread.sleep(1000); catch(InterruptedException e) e.printStackTrace(); else try System.out.println(Thread.currentThread().getName()+ :缓冲区已满,请稍等!); this.wait(); catch(InterruptedException e) System.out.println(Throw InterrupedEXception); e.printStackTrace(); /有可能抛出异常,必须对它进行捕捉 /*定义消费者线程类*/class Consumer implements Runnable Buffer buffer; /声明生产者要放产品的缓冲区Consumer(Buffer buffer) this.buffer = buffer; /*定义一个新线程必须重写父类的run方法 */ public void run() for(int i = 0; i 0) Product m = buffer.get(); System.out.println(Thread.currentThread().getName() + 消费了 + duct + 产品总数: + buffer.Count); try Thread.sleep(1000); catch(InterruptedException e) e.printStackTrace(); else try System.out.println(Thread.currentThread().getName()+ :缓冲区已空,请稍等!); this.wait(); catch(InterruptedException e) System.out.println(Throw InterrupedEXception); e.printStackTrace(); /有可能抛出异常,必须对它进行捕捉 10、 总结在实验开始时,我一看题就想到在Java程序设计课上老师讲到的“采用信号量和同步方法使发送线程与接收线程同步运行”问题所以我就用了synchronized来实现同步,因为在Java程序设计上做过这个实验,这个实验还是比较顺利。实验完成后,我又翻了翻书,书上给出了这个实验的代码模型,以及我们所学的P、V操作,大概想了一下,在c+中,用p、v操作来实现同步与互斥。在低年级时还不怎么有一些科目之间有一些太多的联系,有联系也是理论上的,这次操作系统与Java程序设计或C+程序设计在实践上有了紧密的联系,让我也在此复习了Java编程的知识以及对操作系统线程同步有了进一步的学习。总之,在这次实验中我不仅复习了Java程序设计的知识,还进一步了解生产者与消费者问题和掌握线程同步问题,即生产者消费者问题是抽象化的进程同步问题,进程释放资源就好比生产者产生数据,进程使用资源就相当于消费者消费数据,当进程之间互相传递数据时,就需要缓冲区来存储数据,生产者将数据存入缓冲区,然后消费者从缓冲区取走数据。当然,缓冲区存储空间是有限的,只有缓冲区未满时,生产者才能将数据传入缓冲区;只有缓冲区未空时,消费者才能将数据从缓冲区取走。11、 参考文献操作系统原理第四版 庞丽萍著 华中科技大学出版社出版面向对象与Java程序设计 朱福喜著 清华大学出版社出版流程图参考百度文库源程序参考蔡晓鸿老师给的“线程同步的例子”如下: /【例10】 采用信号量和同步方法使发送线程与接收线程同步运行。public class BufferLock /加互斥锁的缓冲区 private int value; /共享变量 private boolean isEmpty=true; /value是否为空的信号量 public synchronized void put(int i) /同步方法 while (!isEmpty) /当value不空时,等待 try this.wait(); /使调用该方法的当前线程等待,即阻塞自己 catch(InterruptedException e) value = i; /当value空时,value获得值 isEmpty = false; /设置value为不空状态 notify(); /唤醒其他等待线程 public synchronized int get() /同步方法 while (isEmpty) /当value空时,等待 try this.wait(); catch(InterruptedException e) isEmpty = true; /设置value为空状态,并返回值 notify(); return value; class Sender extends Thread /发送线程类 private BufferLock buffer; public Sender(BufferLock buffer) this.buffer = buffer; public void run( ) for (int i=1; i6; i+) buffer.put(i); System.out.println(Sender put : +i); class Receiver extends Thread /接收线程类 private BufferLock buffer; public Receiver(BufferLock buffer) this.buffer = buffer ; public void run() for (int i=1; i6; i+) System.out.println(tttReceiver get : +buffer.get(); public static void main (String args)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 好学生评选办法
- 公关服务公司基础客户服务操作规范管理制度
- 工业软件公司招投标文件管理制度
- 2026电子知识面试题目及答案
- 工业空压机运行维护合同(2026年发电厂)
- 金融市场分析与投资风险控制指南
- Unit 8 Making a Difference Section B (1a- reading plus) 课件(内嵌视频)2025-2026学年人教版英语八年级下册
- 教师招聘(中学)考试通关秘籍题库带解析答案
- 烟草证件管理办理工作手册
- 物业维修与养护管理手册
- 2026年北京市西城区社区工作者招聘考试试卷(含答案解析)
- 2026重庆市合川区渭沱镇招聘农村基层本土人才13人考试备考题库及答案解析
- 2025上交所技术有限责任公司校园招聘20人笔试历年参考题库附带答案详解
- 高中学考英语作文基本模板
- 2026广西南宁市良庆区良庆镇人民政府招聘工作人员21人笔试参考试题及答案解析
- 2026年光伏建筑一体化(BIPV)行业分析报告及未来发展趋势报告
- 项目部消防应急预案
- 2025年山东青岛市八年级地理生物会考真题试卷(含答案)
- 广东省广州市七区2021-2022学年高二下学期期末地理试题
- 法律法规及其他要求清单-职业健康安全2026年1月版
- NB-T 10207-2019 风电场工程竣工图文件编制规程
评论
0/150
提交评论