生产者消费者问题实验报告

用信号量解决生产者消费者问题实验报告

一、实验目的:

通过信号量这一机制,解决生产者消费者问题中的两个进程会同时睡眠的问题。然后在实验中 ,设置多个生产者和消费者线程,设置一块大小为100的缓存,实现生产者消费者交替访问缓存的问题。

二、实验过程:

1. 我在实验中使用的是Java 语言,Java 语言中有自带的信号量Semaphore ,其中的acquire()方法相当于down(),其中的release()方法相当于up()。利用Java 自带的这个类便可以按照书中给的方法解决生产者消费者的问题。

2. 在实验中,我设置了3个类,分别为生产者线程类,消费者线程类,仓库类。生产者和消费者类都是继承了Runnable 类,生产者的run()方法就是不断往仓库放物品(),消费者的run()方法就是不断从仓库拿物品。 class Producer implements Runnable

{

int num=0; @Override public void run() {

while(true)

{ num++; try {

buffer.put(num);

System.out.println("生产数字"+num); Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace();

}

} } }

class Consumer implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { try { int num=(int)buffer.take(); System.out.println("消费者拿出数字"+num); Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } }

3. 然后仓库类其实就是带了full 、empty 、mutex 这3个信号量的buffer 数组,然后再

这个类中有两个方法:put(),take()。put()方法就是书中所写的produce()方法,take()方法就是书中所写的consumer()方法。在方法中使用信号量来保证生产者和消费者在放入库存和拿出库存时不会起冲突也不会双方都睡着。

/*

* 生产者生产并放入库存 */ public void put(Object o)throws InterruptedException { //保证非空, 将空槽数目-1 empty.acquire(); if(!empty.tryAcquire()) { System.out.println("仓库已满,稍后再生产"); } //得到写库存的权利 mutex.acquire(); try{ items[putindex]=o; putindex++; if(putindex==items.length) {

/*

} putindex=0; } count++; }finally { mutex.release(); //将满槽数目+1 full.release(); } * 消费者拿出库存 */ public Object take()throws InterruptedException { //将满槽数目-1 full.acquire(); if(!full.tryAcquire()) { System.out.println("仓库已空,稍后再消费"); } //拿到库存 mutex.acquire(); try{ Object o=items[takeindex]; takeindex++; if(takeindex==items.length) { takeindex=0; } count--; return o; }finally { mutex.release(); //给空槽+1 empty.release(); } }

4. 在main()函数中新建生产者和消费者线程,然后开始运行即可看到结果。

三、实验结果:

在此结果中,主要就是这4张图代表的状态。图1表示在运行初始时,仓库为空,所以一直提醒消费者,仓库已空,稍候消费,然后阻塞消费者。图2表示多个生产者进程一直在生产放入库存,直到仓库已满。图3表示仓库几乎为满的情况下,消费者不停消费拿出库存,然后提示生产者仓库已满,稍候再放。图4就是一个生产消费几乎

达到平衡的状态。

图1图

2

图3 图4

用信号量解决生产者消费者问题实验报告

一、实验目的:

通过信号量这一机制,解决生产者消费者问题中的两个进程会同时睡眠的问题。然后在实验中 ,设置多个生产者和消费者线程,设置一块大小为100的缓存,实现生产者消费者交替访问缓存的问题。

二、实验过程:

1. 我在实验中使用的是Java 语言,Java 语言中有自带的信号量Semaphore ,其中的acquire()方法相当于down(),其中的release()方法相当于up()。利用Java 自带的这个类便可以按照书中给的方法解决生产者消费者的问题。

2. 在实验中,我设置了3个类,分别为生产者线程类,消费者线程类,仓库类。生产者和消费者类都是继承了Runnable 类,生产者的run()方法就是不断往仓库放物品(),消费者的run()方法就是不断从仓库拿物品。 class Producer implements Runnable

{

int num=0; @Override public void run() {

while(true)

{ num++; try {

buffer.put(num);

System.out.println("生产数字"+num); Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace();

}

} } }

class Consumer implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(true) { try { int num=(int)buffer.take(); System.out.println("消费者拿出数字"+num); Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } }

3. 然后仓库类其实就是带了full 、empty 、mutex 这3个信号量的buffer 数组,然后再

这个类中有两个方法:put(),take()。put()方法就是书中所写的produce()方法,take()方法就是书中所写的consumer()方法。在方法中使用信号量来保证生产者和消费者在放入库存和拿出库存时不会起冲突也不会双方都睡着。

/*

* 生产者生产并放入库存 */ public void put(Object o)throws InterruptedException { //保证非空, 将空槽数目-1 empty.acquire(); if(!empty.tryAcquire()) { System.out.println("仓库已满,稍后再生产"); } //得到写库存的权利 mutex.acquire(); try{ items[putindex]=o; putindex++; if(putindex==items.length) {

/*

} putindex=0; } count++; }finally { mutex.release(); //将满槽数目+1 full.release(); } * 消费者拿出库存 */ public Object take()throws InterruptedException { //将满槽数目-1 full.acquire(); if(!full.tryAcquire()) { System.out.println("仓库已空,稍后再消费"); } //拿到库存 mutex.acquire(); try{ Object o=items[takeindex]; takeindex++; if(takeindex==items.length) { takeindex=0; } count--; return o; }finally { mutex.release(); //给空槽+1 empty.release(); } }

4. 在main()函数中新建生产者和消费者线程,然后开始运行即可看到结果。

三、实验结果:

在此结果中,主要就是这4张图代表的状态。图1表示在运行初始时,仓库为空,所以一直提醒消费者,仓库已空,稍候消费,然后阻塞消费者。图2表示多个生产者进程一直在生产放入库存,直到仓库已满。图3表示仓库几乎为满的情况下,消费者不停消费拿出库存,然后提示生产者仓库已满,稍候再放。图4就是一个生产消费几乎

达到平衡的状态。

图1图

2

图3 图4


相关文章

  • 商品学课程实验指导书
  • 中南林业科技大学商学院 <商品学> 课程实验指导书 任课老师:郑贵军 实验专业:市场营销 2011年9月7日 前言 -.本实验课程性质.任务和教学目的 商品学是营销专业的一门专业基础课,是学好后续课程的前提.它强调理论与实际的结 ...查看


  • 东南大学操作系统实验报告
  • 操作系统课程设计 操作系统实验 -- 基于WRK 的进程工作集实验 1 掌握虚拟机和调试工具等的使用. 2 阅读Windows 源码中工作集管理相关部分. 3 修改Windows 内核中页面置换算法,深入理解工作集和页面置换算法如何在一个完 ...查看


  • 市场营销模拟实验报告 1
  • 市场营销模拟实习 实验报告 实验报告 实验目的: 1.学习市场投入与产品销售之间的资金合理分配: 2.通过计算表格等方式寻找使资本收益最大化的市场投入与产品销售的资金投入比例: 3.通过寻找资本收益最大化的过程加深对市场与销售平衡的营销理论 ...查看


  • 供应链啤酒游戏实验报告
  • 啤酒游戏实验报告 班级:09物流管理 组别:第四组 小组成员: 2012/3/23 实 验 报 告 一.游戏进程: 1,角色分配 4个角色:零售商:丁亚和杨晓伟.经销商:王小毛和赵培亮.批发商:裴杨和徐吴明.生产商:王万军和郑训民. 各就各 ...查看


  • 市场调查实验报告2016.4
  • 内蒙古医科大学 实验报告 题 目 新疆彩棉市场调查实验报告 学生姓名 张佳华 学 号 2014050893 院 系 卫生管理学院 专 业 市场营销 专业 指导教师 甘小芳老师 胡嘉靖 老师 2016年12月12日 目 录 一.前言 .... ...查看


  • 啤酒实验实验报告
  • 啤酒实验介绍 啤酒游戏,是1960 年代,MIT 的 Sloan 管理学院所发展出来的一种类似「大富翁」的策略游戏.基于零售商.分销商.批发商和制造商的啤酒游戏模拟了在信息不对称的情况下,市场需求变动后,整个供应链产生的一系列连锁反应.&q ...查看


  • ERP-金蝶K3上机实验报告
  • ERP综合实训中心 企业资源计划 上机实验报告 企业名称: ERP班级: 指导教师: 学 期: 一. 企业名称及LOGO 名称:海工实业 LOGO: 二. 企业简介(经营范围)及组织机构图 简介: 南海海工实业有限公司创建于2007年底,是 ...查看


  • 07级生产实习及毕业实习任务书1
  • 服装系专业实习指导任务书 (2010~2011年第2学期) 根据教学计划安排,我系为加强企业实践性的教学环节,使学生在企业实习工作更加规范,并使学生对服装企业运作与管理的全过程有较全面的了解,现制定以下专业实习指导任务书,希望实习指导小组与 ...查看


  • 北京电大纺织分校工商管理社会实践模拟实验报告样本
  • 因奈特企业管理模拟实验报告 一.实验时间 本实验于20XX年X月XX-XX日在XX校区X号楼XX室 二.实验地点 北京电大机房 二.实验内容 因奈特企业管理模拟 三.实验结果与体会: (一)企业运营管理的分析 通过本次实验我认为企业运营管理 ...查看


热门内容