生产者与消费者.doc

上传人:豆**** 文档编号:24048567 上传时间:2022-07-03 格式:DOC 页数:22 大小:210.50KB
返回 下载 相关 举报
生产者与消费者.doc_第1页
第1页 / 共22页
生产者与消费者.doc_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《生产者与消费者.doc》由会员分享,可在线阅读,更多相关《生产者与消费者.doc(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流生产者与消费者.精品文档.重庆交通大学计算机操作系统课程设计报告班 级: 计软专业 2013 级 2 班 姓 名: 学 号: 课程设计题目: 生产者/消费者与FCFS 所 属 课 程 : 计算机操作系统 实验室(中心): 语音大楼801 指 导 教 师 : 刘洋 完 成 时 间 : 2015 年 12 月 5 日信息科学与工程学院课程设计成绩单课程名称:计算机操作系统指导教师:刘洋姓名刘沅良性别男学号631306050202班级软件 1302综合成绩 程序运行情况 (占总成绩20%)能正确运行基本能正确运行能运行但结果不完善(20分) (15

2、分) (10分)程序功能完善程度(占总成绩 10%)完善基本完善不完善(10 分)(8 分)(5 分)程序结构的合理性(占总成绩 10%)合理基本合理不太合理(10 分)(8 分)(5 分)对问题的答辩情况(占总成绩 40%) 概念正确有创新 能正确回答所有问题 基本能正确回答(40 分)(35 分)(30 分)部分问题回答概念不清晰(20 分)学生的工作态度与 独立工作能力(占总成绩 10%)工作态度认真能独立完成任务工作态度认真但独立性较差(10 分)(8 分)工作态度基本认真但缺乏独立性(5 分)设计报告的规范性(占总成绩 10%)符合规范基本符合规范规范性较差(10 分)(8 分)(5

3、 分)重庆交通学院信息科学与工程学院课程设计任务书课 程计算机操作系统班级软件2013级 2班指导教师刘洋题 目生产者/消费者与FCFS完成时间2015年6月 30日至2015年12月8 日主要内容1 生产者与消费者问题;2 先来先服务问题。设计报告要求1封面;2课程设计成绩单、课程设计任务书3内容提要;4“课程设计报告”正文部分:主要应包括:问题分析和任务定义;环境简介;设计:主要是指数据结构与核心算法的设计描述;操作界面的设计;主要功能的算法框架;测试用例设计等内容。编译参数与步骤的说明;上机调试总结与分析;用户使用说明;测试数据与测试结果等内容。课程设计总结:可以包括课程设计过程的收获、

4、遇到的问题及解决过程的思考、对数据结构这门课程的思考和认识等内容。附录程序清单5参考文献版面要求1. 题目用黑体三号,段后距18磅(或1行),居中对齐;2. 标题用黑体四号,段前、段后距6磅(或0.3行);3. 正文用小四号宋体,行距为1.25倍行距;4. 标题按“一”、“”、“1”、“”顺序编号。指导时间安排星期周次一二三四五六17周18周指导地点语音大楼801生产者/消费者与FCFS一、内容提要操作系统是计算机的核心软件,是计算机专业学生的专业必修课。进程同步问题是计算机操作系统中的重点内容,而生产者-消费者问题是进程同步问题中的经典,它是计算机中相互合作进程关系的一种抽象,该问题具有很大

5、的代表性和使用价值。在计算机系统中,很多问题都可以归结为生产者与消费者问题,提别是在通讯和控制系统中。因此,对该类问题的研究是非常必要的。一般而言,我们把提供给某种资源的进程(线程)称之为生产者,二吧消耗资源的进程(线程)称之为消费者。在大多数情况下,生产者和消费者的数目都是多于一个的。下面以多个进程(线程)共享一有界缓冲池为例来说明。nn-1n-2 .321如图,左端箭头表示生产者,右端箭头表示消费者,设P1、P2、PK是k个想缓冲池装入数据的进程(线程)(生产者)C1、C2、Cm是m个冲缓冲池中取出数据进行处理的进程(线程)(消费者),假设对任何Pi每次向缓冲区中申请一空白缓冲区,并把数据

6、装入其中;而对于常见的情况是任何Ci每次都从缓冲池中取出一满缓冲区的内容,并进行相应的处理,并把缓冲区清空。而每次生产者装入数据和消费者取出数据都是相同的(这是最常见的情况)。针对以上进程(线程)通信,如不对生产者进程(线程)和消费者(线程)的操作进行限制,则可能破坏数据的完整性。一种情况是一个生产者进程(线程)正在装入数据到缓冲区时,另外的生产者进程(线程)可能同时把数据写入相同区域,造成数据破坏,另一种情况是一个生产者进程(线程)正在装入数据到缓冲区时,另外的消费者进程(线程)可能读入该区域数据,由于数据未写完,从而造成消费者读到的数据是不完整的。对于先来先服务,如果早就绪的进程排在就绪队

7、列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务总是把当前处于就绪队列之首的那个进程调度到运行状态。也就是说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU的长短及其他因素。二、正文(一)问题分析和任务定义1、生产者/消费者(1)生产者与消费者之间的关系问题。作为消费者(P1、P2、PK)它每次都需要消耗缓冲池中空白缓冲区;而消费者(C1、C2、Cm)它每次都需要消耗缓冲池中的满缓冲区,并给缓冲池中提供空白缓冲区。因此,生产者群体和消费者之间首先存在同步问题。为了提高系统的效率,也就是说有生产者正在装入数据到空白数据缓冲区时,消费者可以提取已经装满数据的满缓冲区,因此,生产者

8、和消费者之间可以不应该存在互斥关系。(2)生产者(P1、P2、PK)群体内部的关系问题:当有生产者Pi正在装入数据时,如果这时又有生产者Pj到达,如允许其也进行装入数据工作,则有可能导致数据装入同一缓冲区,造成数据 丢失,因此,必须让所有生产者以互斥方式对缓冲区进行操作。(3)消费者(C1、C2、Cm)群体内部的关系问题。当有消费者Ci正在取出数据时,如果这时又有消费者Cj到达,如果允许其取出数据工作,则有可可能导致同一缓冲区多次取用,这也是不能允许的,因为一个数据只能使用一次。因此,必须让所有消费者以互斥方式对缓冲池进行操作。2、FCFS先来先服务算法按照作业进入系统后备作业队列的先后次序挑

9、选作业,先进入系统的作业将优先被挑选进入主存,创建用户进程,分配所需资源,然后,移入就绪队列.这是一种非剥夺式调度算法,易于实现,但效率不高.只顾及作业的等候时间,未考虑作业要求服务时间的长短,不利于短作业而优待长作业,不利于I/O繁忙型作业而有利于CPU繁忙型作业.有时为了等待场作业执行结束,短作业的周转时间和带全周转时间将变得很大,从而若干作业的平均周转时间和平均带权周转时间也变得很大。(二)环境简介Windows系统电脑一台;JDK环境下用EditPlus软件编写程序。(三)设计1、生产者/消费者(1)数据结构与核心算法描述Storage类模拟缓冲池,包含数据成员如下:private i

10、nt pnumber;/生产商品数private int cnumber;/消耗商品数private int number;/缓冲区商品数private boolean flag1;/private boolean flag2;/private boolean flag3;/private boolean flag4;/包含的方法如下:public void setPNumber(int pnumber)/获取当前生产的商品数public void setCNumber(int cnumber)/或取当前消耗的商品数public int countNumber()/库存量(生产数量 - 消费数

11、量)public void setStorageBallFlag()/public boolean getFlag1()public boolean getFlag2()public boolean getFlag3()生产者Productor类并实现接口Runnable,包含的数据成员如下:private Storage storage;/仓库private MyCanvas mycanvas;/画图包含的方法如下:public void run()/run方法中调用product()方法进行生产public void product(Storage storage,MyCanvas myc

12、anvas) throws InterruptedException/生产商品,并进行相应的画图消费者Customer类并实现接口Runnable,包含的数据成员如下:private Storage storage; /仓库private MyCanvas mycanvas; /画图包含的方法如下:public void run()/run方法中调用cast()方法进行生产public void cast(Storage storage,MyCanvas mycanvas) throws InterruptedException/生产商品,并进行相应的画图(2)操作界面的设计MyFrame类进

13、行界面的搭建,包含的数据成员如下:private JFrame myframe;/private Button pbutton;/生产者按钮private Button cbutton;/消费者按钮private MyCanvas mycanvas;/轨道private Storage storage;/仓库对象private final int TABLE_WIDTH = 400;/界面宽度private final int TABLE_HEIGHT = 300;/界面长度其中,为按钮添加事件监听器。由构造函数public MyFrame()完成界面的搭建。界面图如下:(3)主要功能算法描述

14、点击生产按钮,进行模拟生产,若仓库满则停止生产。点击消费按钮,进行模拟消费,若仓库空则停止消费。2、FCFS(1)数据结构与核心算法描述核心算法如下:class TBall1 implements Runnableclass TBall2 implements Runnableclass TBall3 implements Runnableclass TBall4 implements Runnable以上四个方法对小球进行控制,先到的先进入CPU。(2)操作界面的设计View类进行界面的搭建,包含的数据成员如下:private JFrame f = new JFrame(先来先服务-6313

15、06050202-刘沅良);private final int T = 200;private final int TABLE_WIDTH = 400;/宽度private final int TABLE_HEIGHT = 300; /长度private final int BALL_SIZE = 20;/球的直径private MyCanvas mc = new MyCanvas();/球的轨道控制FlowLayout flow = new FlowLayout();private Button start = new Button(开始);Queue queue = new LinkedL

16、ist();private boolean flag1 = true;/控制小球进入CPUprivate boolean flag2 = true;private boolean flag3 = true;private boolean flag4 = true;private int b_v = 10;private int b1_v = 1+(int)(Math.random()*10);/小球的速度,用随机数产生private int b2_v = 1+(int)(Math.random()*10);private int b3_v = 1+(int)(Math.random()*10)

17、;private int b4_v = 1+(int)(Math.random()*10);private int b1_x = 50;/小球一横坐标private int b2_x = 50;private int b3_x = 50;private int b4_x = 50;private int b1_y = 50;private int b2_y = 100;private int b3_y = 150;private int b4_y = 200; 其中,为按钮添加事件监听器。由构造函数public View()完成界面的搭建。界面图如下:(3)主要功能算法描述点击开始,四个小球以

18、不同的速度向前移动,用队列进行存储,先到的先入队,利用队列先进先出的特点。(四)编译参数与步骤1、生产者/消费者2、FCFS(五)上机调试总结与分析1、生产者/消费者刚开始时基本语法问题,改了以后出现的问题是仓库满了还可以继续生产,以及仓库空的时候还可以继续消费,这是不允许,分析后发现没有在生产和消费时加以控制。2、FCFS一开始的是并不能实现先来先服务的条件,球到了模拟缓冲区以后没有按照顺序进入CPU,分析之后使用了队列来实现。(六)用户使用说明1、生产者/消费者点击生产按钮,进行模拟生产,若仓库满则停止生产。点击消费按钮,进行模拟消费,若仓库空则停止消费。2、FCFS点击开始,四个小球以不

19、同的速度向前移动,用队列进行存储,先到的先入队,利用队列先进先出的特点。先到缓冲区先进入CPU。(七)测试数据与测试结果1、生产者/消费者(八)课程设计总结通过这次课程设计,让我对资源共享有了更深一步的了解,同时对线程的理解比以前更熟了一些,而且,在FCFS中,让我对进程作业先来先服务调度概念,有了更深入的认识。初步理解了操作系统对于作业处理的基本思想。同时,这次课程设计也是对自己编程能力的一种考验,加深了理论知识的实际应用。但还是暴露出对java语言不熟练的缺点,希望在以后的学习中能够学好,逐步增强自己的编程能力。(九)附录1、生产者/消费者代码/程序功能:生产者消费者模拟import ja

20、vax.swing.*;import java.awt.*;import java.awt.event.*;class MyFrame extends JFrameprivate JFrame myframe;private Button pbutton;private Button cbutton;private MyCanvas mycanvas;private Storage storage;private final int TABLE_WIDTH = 400;private final int TABLE_HEIGHT = 300;public MyFrame()myframe=ne

21、w JFrame(生产者消费者-631306050202-刘沅良);pbutton=new Button(生产);cbutton=new Button(消费);storage=new Storage();mycanvas=new MyCanvas(storage);mycanvas.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT);myframe.add(pbutton,BorderLayout.NORTH);myframe.add(cbutton,BorderLayout.SOUTH);myframe.add(mycanvas)

22、;myframe.pack();pbutton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) new Thread(new Productor(storage,mycanvas).start(););/按钮事件响应cbutton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) new Thread(new Customer(storage,mycanvas) ).st

23、art();myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myframe.setVisible(true);class Storageprivate int pnumber;/商品数private int cnumber;private int number;private boolean flag1; private boolean flag2; private boolean flag3; private boolean flag4;public Storage()pnumber=0;cnumber=0;number=0;fl

24、ag1=false;flag2=false;flag3=false;flag4=false;public void setPNumber(int pnumber)this.pnumber=pnumber;public void setCNumber(int cnumber)this. cnumber=cnumber;public int countNumber()this.number=pnumber-cnumber;return number;public void setStorageBallFlag()if(countNumber()= 0) flag1 = false; flag2 =

25、 false; flag3 = false;if(countNumber() = 1) flag1 = true; flag2 = false; flag3 = false;if(countNumber() = 2) flag1 = true; flag2 = true; flag3 = false;if(countNumber() = 3) flag1 = true; flag2 = true; flag3 = true;public boolean getFlag1()return flag1;public boolean getFlag2()return flag2;public boo

26、lean getFlag3()return flag3;class MyCanvas extends Canvasprivate final int BALLSIZE;private int ballx;private int bally;Storage storage;public MyCanvas(Storage storage)BALLSIZE=30;ballx=50;bally=50;this.storage=storage;public void paint(Graphics mygraphics)mygraphics.setColor(Color.BLUE); mygraphics

27、.drawRect(50, 50, 150, 30); mygraphics.drawRect(200, 200, 150, 30);/定义一个生产道和一个消费道mygraphics.setColor(Color.RED);mygraphics.fillOval(ballx, bally, BALLSIZE, BALLSIZE);mygraphics.setColor(Color.BLUE);mygraphics.drawRect(155, 135, 90, 30);storage.setStorageBallFlag();if(storage.getFlag1() = true) mygra

28、phics.setColor(Color.YELLOW); mygraphics.fillOval(155, 135, BALLSIZE, BALLSIZE);if(storage.getFlag2() = true) mygraphics.setColor(Color.YELLOW); mygraphics.fillOval(185, 135, BALLSIZE, BALLSIZE);if(storage.getFlag3() = true)mygraphics.setColor(Color.YELLOW); mygraphics.fillOval(215, 135, BALLSIZE, B

29、ALLSIZE);public void setPBallLocus(int ballx, int bally) try Thread.sleep(400);catch (InterruptedException e) e.printStackTrace(); this.ballx = ballx; this.bally = bally; this.repaint();public void setCBallLocus(int ballx, int bally) try Thread.sleep(400);catch (InterruptedException e)e.printStackTr

30、ace(); this.ballx = ballx; this.bally = bally; this.repaint();class Productor implements Runnable/private Productors productors;private Storage storage;private MyCanvas mycanvas;public Productor(Storage storage,MyCanvas mycanvas)/this.productors=productors;this.storage=storage;this.mycanvas=mycanvas

31、;public void run() tryproduct(storage,mycanvas);catch (InterruptedException e)e.printStackTrace();public void product(Storage storage,MyCanvas mycanvas) throws InterruptedException for(int j = 0; j 100; j+) while(storage.countNumber()=3) try storage.wait(); catch (InterruptedException e) e.printStac

32、kTrace(); System.out.println(第 + (j+1) + 次生产 ); for(int i = 0; i 9; i+ ) mycanvas.setPBallLocus(50 + i * 15, 50); storage.setPNumber(j + 1); storage.notifyAll();class Customer implements Runnableprivate Storage storage;private MyCanvas mycanvas;public Customer(Storage storage,MyCanvas mycanvas)this.

33、storage=storage;this.mycanvas=mycanvas; public void run() trycast(storage,mycanvas);catch (InterruptedException e)e.printStackTrace();public void cast(Storage storage,MyCanvas mycanvas)throws InterruptedExceptionfor(int j = 0; j 100; j+)while(storage.countNumber()=0)trystorage.wait();catch (Interrup

34、tedException e) e.printStackTrace(); System.out.println(第 + (j+1) +次消费); for(int i = 0; i 9; i+) mycanvas.setCBallLocus(200 + i * 15, 200); storage.setCNumber(j + 1); storage.notifyAll();public class MyProgrampublic static void main(String args)MyFrame myprogram=new MyFrame();2、FCFS代码import javax.sw

35、ing.*;import java.awt.Button;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.LinkedList;import java.util.Queue;clas

36、s View private JFrame f = new JFrame(先来先服务-631306050202-刘沅良);private final int T = 200;private final int TABLE_WIDTH = 400;private final int TABLE_HEIGHT = 300; private final int BALL_SIZE = 20;private MyCanvas mc = new MyCanvas();FlowLayout flow = new FlowLayout();private Button start = new Button(

37、开始);Queue queue = new LinkedList();private boolean flag1 = true;private boolean flag2 = true;private boolean flag3 = true;private boolean flag4 = true;/private boolean msg = true;private int b_v = 10;private int b1_v = 1+(int)(Math.random()*10);/小球的速度,用随机数产生private int b2_v = 1+(int)(Math.random()*1

38、0);private int b3_v = 1+(int)(Math.random()*10);private int b4_v = 1+(int)(Math.random()*10);private int b1_x = 50;/小球一横坐标private int b2_x = 50;private int b3_x = 50;private int b4_x = 50;private int b1_y = 50;private int b2_y = 100;private int b3_y = 150;private int b4_y = 200;public View() mc.setP

39、referredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT);f.add(mc);f.setLayout( flow);f.add(start);f.pack();start.addActionListener(new ActionListener()/按钮事件监听器Overridepublic void actionPerformed(ActionEvent e) new Thread(new TBall1().start();new Thread(new TBall2().start();new Thread(new TBall3().start

40、();new Thread(new TBall4().start();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true);public void setBALL1(int b1_x, int b1_y)try Thread.sleep(200);catch (InterruptedException e) e.printStackTrace();this.b1_x = b1_x;this.b1_y = b1_y;mc.repaint();public void setBALL2(int b2_x, int b

41、2_y)try Thread.sleep(200); catch (InterruptedException e) e.printStackTrace();this.b2_x = b2_x;this.b2_y = b2_y;mc.repaint();public void setBALL3(int b3_x, int b3_y)try Thread.sleep(200);catch (InterruptedException e) e.printStackTrace();this.b3_x = b3_x;this.b3_y = b3_y;mc.repaint();public void set

42、BALL4(int b4_x, int b4_y)try Thread.sleep(200); catch (InterruptedException e) e.printStackTrace();this.b4_x = b4_x;this.b4_y = b4_y;mc.repaint();class TBall1 implements RunnableOverridepublic void run() for(int i = 0; i = 190) flag1 = false; queue.add(A); b1_v = 0; if( queue.peek() = A & b1_x = 190) b1_v = 10; b1_y = 140; if(b1_x = 330) System.out.println(queue.poll();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com