生产者与消费者多线程模拟_第1页
生产者与消费者多线程模拟_第2页
生产者与消费者多线程模拟_第3页
生产者与消费者多线程模拟_第4页
生产者与消费者多线程模拟_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统课程实验报告 课 程 名 称: 操作系统 实验项目名称: 生产者-消费者问题实现 专 业 班 级: 智能1302 姓 名: 匿 名 学 号: 1 完 成 时 间: 2015 年 12 月 2 日一实习内容本次实验要求完成下列内容:模拟操作系统中进程同步和互斥。二、实验目的 熟悉临界资源、信号量及PV操作的定义与物理意义 了解进程通信的方法 掌握进程互斥与进程同步的相关知识 掌握用信号量机制解决进程之间的同步与互斥问题 实现生产者消费者问题,深刻理解进程同步问题三实验题目实现经典同步问题:生产者消费者,具体要求如下L可以采用C+或者java编程)(1)一个大小为10的缓冲区,初始状态为空

2、。 (2)2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复10次。(3)2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复10次。 四提示 本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。(1)间接制约。这是由于多个进程共享同一资源(如CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。 (2)直接制约。只是由于进程合作中各个进程为完成同一任务而造

3、成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。五源代码实现:package thread;/* * 多线程有关的以生产者消费者问题为原型的Java程

4、序源码。 * 开启五个生产者和五个消费者线程,对大小为10的缓冲区进行操作,要做到缓冲区产品达到5的时候,生产者线程阻塞,* 直到消费者线程减少缓冲区的产品数量,并对阻塞进程进行唤醒*/ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class myProducer implements Runnable private myProAndCon mpc; myProducer( myProAndCon mpac ) this.mpc = mpac; public void

5、run() try while(!Terrupted() /生产者互斥 synchronized (this) /静态计数值达到上限,则wait()阻塞,等待被消费者线程唤醒 while ( mpc.get() = 5 ) System.out.println(仓储容量不足!); this.wait(); Thread.sleep(2000); /未发生阻塞时,向缓冲区内放入产品,增加计数值,并唤醒所有阻塞的消费者线程 synchronized ( mpc.c ) System.out.println(生产者生产产品数量为: + mpc.inc() ); mpc.c.noti

6、fyAll(); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); class myConsumer implements Runnable private myProAndCon mpc; myConsumer( myProAndCon mpac ) this.mpc = mpac; public void run() try while(!Terrupted() /消费者互斥 synchronized ( this ) /当缓冲区无产品时,消费者线程阻

7、塞,等待被生产者线程唤醒 while ( mpc.get() = 0 ) System.out.println(缓存区没有产品,消费者线程阻塞!); this.wait(); Thread.sleep(2500); /未发生阻塞时,从缓冲区取出产品,减少计数值,并唤醒所有阻塞的生产者线程 synchronized (mpc.p) System.out.println(消费者消费商品数量为: + mpc.dec() ); mpc.p.notifyAll(); catch (InterruptedException e) / TODO Auto-generated catch block e.pr

8、intStackTrace(); public class myProAndCon /缓冲区计数器(静态)以及对其进行的三个synchronized操作 volatile private static int counter = 0; synchronized static int inc() return +counter; synchronized static int dec() return counter -= 1; synchronized static int get() return counter; /构造两个对象,作为开启线程的参数 public myConsumer c = new myConsumer(this); public myProducer p = new myProducer(this); private ExecutorService exec = Executors.newCachedThreadPool(); public myProAndCon() /打开五个生产者线程 for ( int i = 0 ; i 5 ; i + ) exec.execute(p); /打开五个消费者线程

温馨提示

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

评论

0/150

提交评论