操作系统实验报告(生产者消费者问题)-模板.doc_第1页
操作系统实验报告(生产者消费者问题)-模板.doc_第2页
操作系统实验报告(生产者消费者问题)-模板.doc_第3页
操作系统实验报告(生产者消费者问题)-模板.doc_第4页
操作系统实验报告(生产者消费者问题)-模板.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

操作系统实验报告HUNAN UNIVERSITY操作系统实验报告题 目:学生姓名:李汉乾学生学号:20100810411专业班级:物联一班同组成员:上课老师:肖德贵目 录一、内容2二、目的2三、实验设计思想和流程2四、主要数据结构及符号说明2五、程序初值及运行结果2六、实验体会和思考题2附录(源代码及注释)2一、内容模拟操作系统中进程同步和互斥。二、目的1熟悉临界资源、信号量及PV操作的定义与物理意义;2了解进程通信的方法;3掌握进程互斥与进程同步的相关知识;4掌握用信号量机制解决进程之间的同步与互斥问题;5实现生产者消费者问题,深刻理解进程同步问题。三、实验设计思想和流程这次实验的主要设计思想为:用线程来模拟生产者与消费者,用一个数组来模拟缓冲池,在缓冲池里,写了关于如何便面生产者消费者同时进入缓冲池的代码。如下:它是通过定义两个函数public synchronized void get(int id)。public synchronized void put(int id)关键字就是避免生产者与消费者同时进入缓冲池。(至于如何避免这是java提供函数的内部代码,我也不知道啊!)四、主要数据结构及符号说明public class Buffer JTextArea ta;static final int productBufferNum = 10; /缓冲单元数ProductBuffer pBuffer = new ProductBufferproductBufferNum; /缓冲队列int in = 0; /缓冲单元指针,用于放产品get()int out = 0; /缓冲单元指针,用于取产品put()int consumeProductNo; /记录消费产品的编号int usedBufferNum = 0; /记录缓冲队列已使用的缓冲单元个数public class ProductBuffer int product; /存放产品编号boolean hasProduct; /标识该缓冲区是否有产品,true有产品,false无产品public class Customer_Consumer_Test implements ActionListenerprivate JPanel jp=new JPanel10;boolean isRun = true;/用于控制线程结束JTextArea ta = new JTextArea();Buffer buffers = new Buffer(ta); /缓冲队列static final int producerNum = 3; /生产者个数static final int consumerNum = 3; /消费者个数ProducerThread proThread = new ProducerThreadproducerNum;ConsumerThread conThread = new ConsumerThreadconsumerNum;Thread producer = new ThreadproducerNum;Thread consumer = new ThreadconsumerNum;5、 程序初值及运行结果生产者1将产品1放入缓冲单元0,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态01true1-1false2-1false3-1false4-1false5-1false6-1false7-1false8-1false9-1false生产者3将产品1放入缓冲单元1,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态01true11true2-1false3-1false4-1false5-1false6-1false7-1false8-1false9-1false消费者2将产品1从缓冲单元0取出,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false11true2-1false3-1false4-1false5-1false6-1false7-1false8-1false9-1false消费者3将产品1从缓冲单元1取出,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false2-1false3-1false4-1false5-1false6-1false7-1false8-1false9-1false生产者2将产品1放入缓冲单元2,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false21true3-1false4-1false5-1false6-1false7-1false8-1false9-1false消费者1将产品1从缓冲单元2取出,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false3-1false4-1false5-1false6-1false7-1false8-1false9-1false生产者3将产品2放入缓冲单元3,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false32true4-1false5-1false6-1false7-1false8-1false9-1false消费者2将产品2从缓冲单元3取出,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false30false4-1false5-1false6-1false7-1false8-1false9-1false消费者3将产品-1从缓冲单元4取出,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false30false40false5-1false6-1false7-1false8-1false9-1false生产者1将产品2放入缓冲单元4,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false30false42true5-1false6-1false7-1false8-1false9-1false生产者2将产品2放入缓冲单元5,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false30false42true52true6-1false7-1false8-1false9-1false消费者1将产品2从缓冲单元5取出,缓冲队列状态如下: 缓冲单元编号 产品编号 缓冲单元状态00false10false20false30false42true50false6-1false7-1false8-1false9-1false六、实验体会和思考题附录(源代码及注释)Customer_Consumer_Test.javapackage LEO_Customer;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;/* * 生产者消费者问题实现(可以有多个生产者消费者) * */public class Customer_Consumer_Test implements ActionListenerprivate JPanel jp=new JPanel10;boolean isRun = true;/用于控制线程结束JTextArea ta = new JTextArea();Buffer buffers = new Buffer(ta); /缓冲队列static final int producerNum = 3; /生产者个数static final int consumerNum = 3; /消费者个数ProducerThread proThread = new ProducerThreadproducerNum;ConsumerThread conThread = new ConsumerThreadconsumerNum;Thread producer = new ThreadproducerNum;Thread consumer = new ThreadconsumerNum;public Customer_Consumer_Test()createUI();/createNewUI();/创建多个生产者和消费者线程并开始执行for(int i=0; iproducerNum; i+)proThreadi = new ProducerThread(i+1);produceri = new Thread(proThreadi);produceri.start();for(int j=0; jconsumerNum; j+)conThreadj = new ConsumerThread(j+1);consumerj = new Thread(conThreadj);consumerj.start();private void createNewUI() JFrame frame=new JFrame(Leo);/创建界面public void 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);JButton button = new JButton(停止);button.addActionListener(this);panel.add(button, BorderLayout.SOUTH);panel.setBackground(Color.BLUE);frame.add(panel);frame.setVisible(true);frame.setSize(1000,500);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/按钮响应事件public void actionPerformed(ActionEvent e)isRun = false; /控制线程结束System.out.println(停止);public static void main(String args)Customer_Consumer_Test producerConsumer = new Customer_Consumer_Test();/定义生产者线程class ProducerThread implements Runnable int productNo = 0; /产品编号int id; /生产者IDpublic ProducerThread(int id)this.id = id;public void run()while(isRun)productNo+; /生产产品buffers.put(productNo, id); /将产品放入缓冲队列tryThread.sleep(1000);catch(Exception e)e.printStackTrace();/定义消费者线程class ConsumerThread implements Runnable int id; /消费者IDpublic ConsumerThread(int id)this.id = id;public void run()while(isRun)buffers.get(id); /从缓冲队列中取出产品tryThread.sleep(1000);catch(Exception e)e.printStackTrace();Buffer.javapackage LEO_Customer;import javax.swing.JTextArea;/* * 定义临界资源:缓冲队列 * */public class Buffer JTextArea ta;static final int productBufferNum = 10; /缓冲单元数ProductBuffer pBuffer = new ProductBufferproductBufferNum; /缓冲队列int in = 0; /缓冲单元指针,用于放产品get()int out = 0; /缓冲单元指针,用于取产品put()int consumeProductNo; /记录消费产品的编号int usedBufferNum = 0; /记录缓冲队列已使用的缓冲单元个数public Buffer (JTextArea ta)this.ta = ta;/初始化for(int j=0; jproductBufferNum; j+)pBufferj = new ProductBuffer();for(int i=0; iproductBufferNum; i+)pBduct = -1;pBufferi.hasProduct = false;/取产品public synchronized void get(int id)/缓冲队列空则等待if(usedBufferNum = 0)trysuper.wait();catch(Exception e)e.printStackTrace();consumeProductNo = pBduct; /取出产品pBduct = 0; /清空缓冲单元pBufferout.hasProduct = false; /置无产品标识usedBufferNum-;/输出本次取产品后缓冲队列的情况ta.append(消费者+id+将产品+consumeProductNo+从缓冲单元+out+取出,缓冲队列状态如下:n);printBuffer();out=(out+1)%productBufferNum; /更新指针/唤醒等待线程super.notify();/放产品public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论