先来先服务问题java程序设计报告.docx

上传人:叶*** 文档编号:89150793 上传时间:2023-05-05 格式:DOCX 页数:31 大小:197.21KB
返回 下载 相关 举报
先来先服务问题java程序设计报告.docx_第1页
第1页 / 共31页
先来先服务问题java程序设计报告.docx_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《先来先服务问题java程序设计报告.docx》由会员分享,可在线阅读,更多相关《先来先服务问题java程序设计报告.docx(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、重庆交通大学计算机操作系统课程设计报告班 级: 计软专业 2013 级 班 姓 名: 学 号: 课程设计题目: 先来先服务问题 所 属 课 程 : 计算机操作系统 实验室(中心): 语音楼801 指 导 教 师 : 完 成 时 间 : 2015 年 11 月20 日信息科学与工程学院课程设计成绩单课程名称:计算机操作系统指导教师:刘洋姓名 刘克性别男学号631306050224班级软件 1302班综合成绩 程序运行情况 (占总成绩20%)能正确运行基本能正确运行能运行但结果不完善(20分) (15分) (10分)程序功能完善程度(占总成绩 10%)完善基本完善不完善(10 分)(8 分)(5

2、分)程序结构的合理性(占总成绩 10%)合理基本合理不太合理(10 分)(8 分)(5 分)对问题的答辩情况(占总成绩 40%) 概念正确有创新 能正确回答所有问题 基本能正确回答(40 分)(35 分)(30 分)部分问题回答概念不清晰(20 分)学生的工作态度与 独立工作能力(占总成绩 10%)工作态度认真能独立完成任务工作态度认真但独立性较差(10 分)(8 分)工作态度基本认真但缺乏独立性(5 分)设计报告的规范性(占总成绩 10%)符合规范基本符合规范规范性较差(10 分)(8 分)(5 分)重庆交通学院信息科学与工程学院课程设计任务书课 程计算机操作系统班级软件2013级 班指导教

3、师刘洋题 目先来先服务问题完成时间2015年6月 日至2015年11月 日主要内容1.利用进程调度算法来模拟CPU先来先服务的特点。设计报告要求1封面;2课程设计成绩单、课程设计任务书3内容提要;4“课程设计报告”正文部分:主要应包括:问题分析和任务定义;环境简介;设计:主要是指数据结构与核心算法的设计描述;操作界面的设计;主要功能的算法框架;测试用例设计等内容。编译参数与步骤的说明;上机调试总结与分析;用户使用说明;测试数据与测试结果等内容。课程设计总结:可以包括课程设计过程的收获、遇到的问题及解决过程的思考、对数据结构这门课程的思考和认识等内容。附录程序清单5参考文献版面要求1. 题目用黑

4、体三号,段后距18磅(或1行),居中对齐;2. 标题用黑体四号,段前、段后距6磅(或0.3行);3. 正文用小四号宋体,行距为1.25倍行距;4. 标题按“一”、“”、“1”、“”顺序编号。指导时间安排星期周次一二三四五六17周18周指导地点一、 问题分析和任务定义(1) 问题分析本问题是要模拟CPU先来先服务进程调度,即多个进程谁先得到CPU资源谁就先执行,其余的进入等待序列。等到进程执行完毕,释放CPU资源之后,最早进入等待序列的进程优先执行。依次类推,直到所有的进程执行完毕。先来先服务(First Come First Server)是典型的进程常见的进程调度算法。FCFS总是把当前处于

5、就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素。FCFS算法简单易行,但性能却不大好。(2) 任务定义对于FCFS算法,一般使用队列来完成,因为队列有着先来先服务的特点。利用java编写可视化程序,在界面上绘制4个小球,绘制一个就绪队列的矩形和一个CPU矩形。点击“开始”,则4个小球以不同的速度(速度每次开始运行程序随机生成)开始运动,最先到达CPU边缘的小球优先通过CPU矩形,其余的小球在就绪队列矩形开始等待。小球通过CPU矩形之后,先进入就绪队列的小球优先通过CPU矩形。直到所有的小球通过CPU矩形。二、 环境简介

6、开发工具:eclipse操作系统:win10三、 设计:主要是指数据结构与核心算法的设计描述;操作界面的设计;主要功能的算法框架;测试用例设计等内容。(1) 界面设计如上所示:左侧是初始状态的小球,右侧是就绪队列和CPU矩形。下面是“开始”、“关闭”、“重置”按钮。(2) 算法设计首先定义两个队列waitQueue(等待队列)和runQueue(运行队列),定义move函数来控制小球的运动。小球开始运动到CPU边缘时首先判断runQueue队列之中是否有元素,如果没有则将小球的序号进队,如果有元素,则要判断该元素是否是它本身(因为move函数要不断的调用,下次判断时队列之中的元素有可能是它本身

7、),如果不是,则进入waitQueue。进入runQueue之中的小球可以继续前进,等到小球运动出CPU矩形之后,则从runQueue出队并且从waitQueue弹出一个元素进入runQueu之中。这样最早进入等待序列中是小球就可以继续前进了。move函数代码如下:public void move(int i)/i为小球编号,n为移动速度 if(finishnum=3&moveXi770) moveXi+; else if(moveXi490) moveXi+=speedi; else if(runQueue.size()=0) runQueue.offer(i);/把i压入队列 else i

8、f (x=runQueue.peek()=i&moveXi770)/如果运行队列中的元素就是它自己,继续行进 moveXi+; else if(numi=0) waitQueue.offer(i);/如果不是它自己则进入就绪队列numi+;/保障只进一次队 if(moveXi=770) moveXi+; finishnum+; if(runQueue.size()!=0) runQueue.remove();/到达终点之后则出运行队列 if(waitQueue.size()!=0)/如果就绪队列之中有值,则出队 runQueue.offer(waitQueue.poll(); (3) 测试用例

9、设计在界面上有“开始”、“关闭”、“重置”按钮,点击“开始”按钮则四个小球开始移动,点击“重置”按钮则小球恢复至本次的初始状态,重新执行。四、 上机调试总结与分析调试结果显示:先来先服务的基本功能已经实现,基本没有bug。在界面上可以添加“暂停”,“继续”按钮来控制小球的运动。五、 用户使用说明点击“开始”按钮就可以看到小球开始运动,最先到达CPU边缘的小球会继续前进,其余的小球则在CPU边缘之外开始等待,等到小球通过CPU矩形后,小球停止在CPU矩形之外。这时,最先开始等待的小球开始通过CPU矩形。直到所有的小球通过CPU矩形为止。最终小球会停止在CPU边缘之外。点击“重置”则重复此次小球运

10、行状态。点击“关闭”则关闭程序界面。六、 测试数据与测试结果等内容。测试结果如下:初始界面红球通过CPU,其余小球开始等待小球全部通过CPU八、课程设计总结这次的实验花了我不少的时间,因为一开始不知道怎么做。使用C#来写是很简单的,但是这是个典型的线程问题,虽然有线程但是我们并没有学,所以也不会使用。我们这学期学了java,所以我最终决定使用java来写这个实验。而java使用线程以及搭建界面都是比较麻烦的,但是功夫不负有心人,我还是完成这个实验。总体来说这次课程设计的收获还是很多的,首先是我们这学期刚学了java语言,但是由于课时较少,只有八周的学习时间,所有说编的程序并不是很多,对于jav

11、a语言了解的也不够深入,尤其是java可视化程序更是不太会写,通过这次的课程设计,我基本掌握了java界面的搭建方法,以及界面布局的方法。更多的收获是对于java的一大特色线程有了更深入的了解。之前很少使用线程去写程序的。这次使用了线程之后我才发现java线程的应用还是非常方便的。在写此程序的过程中遇到的问题还是很多的,比如说界面的搭建以及小球和矩形的绘制等,但这些都是属于java编程的内容,基本上在网上可以找到比较好的解决方案。最大的问题就是小球移动的算法设计了,在我对于先来先服务的算法进行分析之后,最终找到了使用队列解决该问题的方法。九、附录程序清单 (1)FCFS.java清单packa

12、ge 先来先服务;import java.awt.Frame;public class FCFS public static void main(String args) / TODO Auto-generated method stub MyFrame frame=new MyFrame(先来先服务); frame.setVisible(true); (2)MoveThread.java清单package 先来先服务;import java.awt.Frame;/线程类public class MoveThread extends Threadpublic int id;/小球编号 MyFr

13、ame frame; public MoveThread(int i,MyFrame fra) id=i; frame=fra; public void run() while (true) frame.move(id); frame.repaint(); try sleep(10); catch (Exception e) / TODO: handle exception(3)MyFrame.java清单package 先来先服务;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.a

14、wt.Image;import java.awt.Transparency;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.LinkedList;import java.util.Queue;import java.util.Random;import java.util.Stack;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JInternalFrame;public

15、 class MyFrame extends JFrame private JButton btnStart=new JButton(开始); private JButton btnClose=new JButton(关闭); private JButton btnReset=new JButton(重置); private JButton btnStop=new JButton(暂停); private JButton btnContinue=new JButton(继续); / public int moveX1=0,moveX2=0,moveX3=0;/分别表示小球圆心的横坐标 publ

16、ic int speed1,speed2,speed3,speed4;/分别设置三个小球的速度 public int moveX=new int4; public int speed=new int4; public int x; public int finishnum=0; public int num=0,0,0,0; public Queue runQueue=new LinkedList();/表示正在运行的小球队列 public Queue waitQueue=new LinkedList();/定义就绪队列 MoveThread t=new MoveThread(0,this);

17、 MoveThread t1=new MoveThread(1,this); MoveThread t2=new MoveThread(2,this); /创建三个线程,分别控制三个小球 MoveThread t3=new MoveThread(3, this); private Image offScreenImg;/创建图像对象 private Graphics offScreenG;/创建画板对象 Random random=new Random(); public MyFrame(String title) super(title); setSize(1000,600); setLoc

18、ation(50,50); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); speed1=(random.nextInt(5)+1); do speed2=(random.nextInt(5)+1); while(speed1=speed2); do speed3=(random.nextInt(5)+1); while(speed3=speed1|speed2=speed3); do speed4=(random.nextInt(5)+1); while(speed4=speed1|speed4=speed2|speed4=speed3); s

19、peed0=speed1; speed1=speed2; speed2=speed3; speed3=speed4; getContentPane().setLayout(null); btnStart.setBounds(300,500,80,40); getContentPane().add(btnStart); btnStart.setVisible(true); btnClose.setBounds(400,500,80,40); getContentPane().add(btnClose); btnClose.setVisible(true); btnReset.setBounds(

20、500,500,80,40); getContentPane().add(btnReset); btnReset.setVisible(true); btnStart.addActionListener(new ActionListener() Override public void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stub try t.start(); t1.start(); t2.start(); t3.start(); catch (Exception e) / TODO: handle ex

21、ception ); btnClose.addActionListener(new ActionListener() Override public void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stub System.exit(0);/退出程序 ); btnReset.addActionListener(new ActionListener() Override public void actionPerformed(ActionEvent e) / TODO Auto-generated method

22、 stub moveX0=0; moveX1=0; moveX2=0; moveX3=0; finishnum=0; num0=num1=num2=num3=0; while (runQueue.size()!=0) runQueue.remove(); while(waitQueue.size()!=0) waitQueue.remove(); ); public void paint(Graphics g) offScreenImg=this.createImage(1000,500); offScreenG=offScreenImg.getGraphics(); /绘制就绪队列矩形 of

23、fScreenG.setColor(Color.yellow); offScreenG.fillRect(500, 50,80, 450); offScreenG.setColor(Color.gray); offScreenG.setFont(new Font(楷体, Font.BOLD,19); offScreenG.drawString(就绪队列, 500, 69); /绘制CPU矩形 offScreenG.setColor(Color.cyan); offScreenG.fillRect(580, 50,200, 450); offScreenG.setColor(Color.gray

24、); offScreenG.setFont(new Font(楷体, Font.BOLD,50); offScreenG.drawString(CPU, 650, 90); offScreenG.setColor(Color.black); Font font=new Font(楷体, Font.ITALIC,20); offScreenG.setFont(font); offScreenG.drawString(631306050224 刘克 软件二班, 20, 70); /绘制四个小球 offScreenG.setColor(Color.blue); offScreenG.fillOval

25、(10+moveX0, 100, 80, 80); offScreenG.setColor(Color.red); offScreenG.fillOval(10+moveX1, 200, 80, 80); offScreenG.setColor(Color.green); offScreenG.fillOval(10+moveX2, 300, 80, 80); offScreenG.setColor(Color.gray); offScreenG.fillOval(10+moveX3, 400, 80, 80); btnStart.repaint(); btnClose.repaint();

26、btnReset.repaint(); g.drawImage(offScreenImg,0,0,this);/输出图像 public void move(int i)/i为小球编号,n为移动速度 if(finishnum=3&moveXi770) moveXi+; else if(moveXi490) moveXi+=speedi; else if(runQueue.size()=0) runQueue.offer(i);/把i压入队列 else if (x=runQueue.peek()=i&moveXi=599&i=0) x0=20;/生产者回到起点 Id.push(picturePro

27、duce);/添加到栈中添加一个产品,此时缓冲区并没有产品 image=produce(); pictureProduce=new JLabel(image); add(pictureProduce); else if(n=20&i=1|n=599&i=1) if(n=20&i=1)/如果是可以消费 if(!Id.isEmpty()/当缓冲区不为空时,可以消费 pictureConsume=consume(); else pictureConsume=null; /System.out.println(n); if(x1=599&i=1) pictureConsume.setVisible(true); x1=20; return true; else return false; 四、 上机调试总结与分析;调试结果显示:生产者消费者问题的基本功能已经实现,基本没有bug。五、 用户使用说明; 点击“开始生产”则图片开始运动,表示正在生产,图片运动出生产矩形之后,表示生产完成,此时缓冲区则显示一个图片。点击“停止生产”则生产进程停止。 点击“开始消费”则缓冲区会少一个产品,表示从缓冲区取走了一个产品消费,同时图片开始在消费矩形之中运动,运动出消费矩形之后停止。点击“停止消费

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

当前位置:首页 > 应用文书 > 工作总结

本站为文档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