




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
黑龙江外国语学院 2012-2013学年 第1学期 Term 1 2012-2013 Academic Year Heilongjiang International University答卷封面(COVER)评阅结果Final mark评阅人Examiner课程名称(Subject): 操作系统课程设计编 号 (No.): 12-13-1-050154 系 别 (Department): 信息科学系专 业 (Major): 计算机科学与技术 姓 名 (Name): 高怀云 学 号 (Students Number): BC10331103 注意事项(Notes)1.考生需将上述有关项目填写清楚2.字迹要清楚,保持卷面清洁。3.交卷时请将本答卷和题签一起上交,题签作为封面下一页装订。1、Candidates should fill in the information appropriately.2、Keep the handwriting clear and the paper tidy.3、Candidate should hand in this cover and paper together; the answer sheet should be attached to the cover.IV机密(Confidential) 编号(No.): 12-13-1-050154试 题(Test)课程名称(Subject):操作系统课程设计考核类别(Type of test):考查课程类别(Type of course) : 实践环节 考试形式(Test type) : 论文 使用范围(Target group): 计算机科学与技术 要求:一、通过本课程设计,使学生在上机实验中体会计算机操作系统的基本原理,训练学生模拟实现操作系统管理和控制资源的能力。二、学生可在下列13个题目中任选1个。(1)先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法、优先级调度算法(2)生产者-消费者问题(3)最先适应算法、最佳适应算法、最坏适应算法(4)先进先出算法、最久未使用淘汰算法、理想淘汰算法(5)银行家算法(6)小型文件系统三、模拟实现算法在Windows平台下,可用C语言、C+语言和Java语言等。摘 要短作业优先调度算SJF,是指对短作业或短进程优先调度的算法。它们可已分别用于作业调度和进程调度。短作业优先的调度算法是从后备队列中选择一个或若干个估计运行最短的作业,将它们调入内存运行。对成批进入系统的用户,根据进程控制块的信息,按一定的策略选取若干个作业使它们可以获得处理机运行的一项工作。而对每个用户来说希望自己的周转时间是最小的,短作业优先(SJF)便是其中的一种算法。该算法每次调度都是从后备作业队列中,选择一个或多个最短服务时间的进程进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度算法中采用FJS算法时,这每次调度是从就绪队列中,选择一个服务时间最短的进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件阻塞后,才放弃处理机。本设计是为了加深对作业概念的理解,掌握段作业优先(SJF)算法,深入了解批处理系统如何组织作业、管理作业和调度作业,了解作业控制块的作用,以及作业控制块的内容和组织方式。关键词:操作系统 短作业优先调度算法 Java语言目 录一、设计题目二、设计内容三、设计过程3.1短作业优先调度算法分析3.2短作业优先调度算法设计3.3短作业优先调度算法数据设计3.4代码实现3.5程序运行四、总结五、参考文献黑龙江外国语学院 2012-2013学年 第1学期 Term 1 2012-2013 Academic Year Heilongjiang International University一、 设计题目短作业优先调度算法。二、设计内容实验内容:短作业优先调度算法的基本思想是按照作业提交的服务时间的长短,调入系统或分派CPU,换句话说,当在作业调度中采用短作业优先务算法时,每次调度都是从后备作业队列中选择一个或多个服务时间最短的进程进入队列的作业,将它们调入内存,为它们分配资源、创建进程然后放入就须队列一旦选择了服务时间最短的入该队列的进程,该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。编写程序完成批处理系统中的作业调度,要求采用短作业优先的作业调度算法。实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所作工作进程测试。创建作业控制块JCB,定义为结构体,为进入系统的作业建立档案,其中定义了作业名,作业到达时间,作业服务时间,作业开始执行时间,作业完成时间,作业周转时间,作业平均周转时间。输出文字提醒用户操作步骤:设定输入数据的格式及数量;运行完程序后显示输出实验结果。首先按各个作业完成时间由大到小排序。再用输入到达时间与服务时间按一定算法算出各个作业的开始执行时间、完成时间、周转时间、作业平均周转时间。运行结果:先比较各个进程服务时间找到服务时间最短的放入就绪队列,然后根据进程的服务时间的长短把进程依次运行,结果是依次按着进程的服务时间的长短输出各个进程。三、设计过程3.1短作业优先调度算法分析1算法设计能够实现以下功能:1)短作业优先调度算法是没从进程队列中选择服务时间最短的进程调度内存执行该进程。2)能够输入进程的基本信息,其中包括进程名,到达时间、开始时间、服务时间、完成时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间,本程序是通过文件输入数据而不是通过键盘输入数据。3)根据短作业优先调度算法计算各个进程的到达时间、开始时间、服务时间、完成时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间、最后在标准输出上面打印出周转时间、平均周转时间、带权周转时间、平均带权周转时间。2通过操作系统课程设计,从而加深对短作业优先调度算法的理解,更加深刻体会短作业优先调度算法的核心思想,从而更好的学习该算法,掌握短作业优先调度算法,以及调度算法中的进程队列的基本操作情况。能够用程序设计语言模拟各个算法的实现,能够判断算法的优缺点,从而明白该算法以及其它的算法相比较更加深刻的了解各个算法的好处以及该算法的不足从而明白处理及模拟进程的各个情况通过对运行结果与运行情况的分析更能深刻的了解短作业优先调度算法。3.2短作业优先调度算法设计进程定义了一个类B来实现进程从而把各个进程表示出来其中定义了字段有String processname表示进程名,float arrivetime表示到达时间,float servetime表示服务时间,float finishtime表示完成时间,float turnovertime表示周转时间,float weighturnovertime表示带权周转时间,int flag标记该进程是否已经完成进程用到了一个fun()方法标记最早执行的进程然后通过where循环把各个进程按照先来先服务的顺序依次执行完。进程利用了一个set()方法从而计算一个进程的完成时间、周转时间、带权周转时间利用了一个print()方法把进程的平均周转时间和平均带权周转时间给打印输出。B模块:这个模块表示进程类,能够记录进程名,开始时间、等待时间、需要执行时间、周转时间、完成时间、带权周转时间,在最先执行的进程可以通过用fun()方法获取通过先来先服务的顺序分配CPU。在B类中一个比较重要的方法是setFinish()方法通过该方法从而记录各个进程开始执行的时间以及每个进程的完成时间还有就是set()方法通过该方法可以计算各个进程的完成时间、周转时间、带权周转时间以及完成进程的个数。A模块:这个模块主要是对给定的进程的执行以及计算各个进程的到达时间、服务时间、完成时间、开始时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间的定义以及打印输出。 开始短作业优先调度算法输入进程数进程2信息进程1信息进程n信息退出3.3短作业优先调度算法数据设计1)用到了一个进程类B2)用到了一个A类3)用到了一个public static void main(String args) /系统的主函数4)public String toString() /打印输出5)public void print() /打印输出平均周转时间和平均带权周转时间6)数据结构是创建一个进程信息结构:class B private String processname ;/进程名private int arrivetime ;/到达时间private int servetime ;/服务时间 private int finishtime ;/完成时间private int turnovertime ;/周转时间private int finish=0;private double weighturnovertime ;/带权周转时间private int flag=0 ;/标记该进程是否已经完成private static int finishnum=0 ;/记录已经完成的进程数private double aveturnovertime ;/平均周转时间private double aveweighturnovertime ;/平均带劝周转时间public B(String processname,float arrivetime,float servetime) /构造方法只传入已知量 cessname=processname ; this.arrivetime=arrivetime ; this.servetime=servetime ;public void setFlag() this.flag=1 ; ;public void setFinishtime(float finishtime) this.finishtime=finishtime ; public void setTurnovertime() this.turnovertime=this.finishtime-this.arrivetime ; public void setWeighturnovertime() this.weighturnovertime=this.turnovertime/this.servetime ; public String toString() return cessname + t + this.arrivetime+ tt + this.servetime + t + this.finishtime + tt + this.turnovertime + tt + this.weighturnovertime + n ; 此外,定义了进程数组、记录进程的个数、记录已完成的进程的个数以及各个进程的开始时间:private B processes=new B10 ;/进程数组private int n=0 ;/记录进程数private int finishnum=0 ;/记录已经完成的进程数private float finish=0 ;此外还定义了用来找到最早到达的进程记录进程个数的和各个进程的开始时间以及完成进程个数的方法:public void fun() /查找第一个到达时间最找的进程 float temp=processes0.arrivetime ;/记录最小的到达时间 int k=0 ;/标志该执行的进程 for(int i=0;iprocessesi.arrivetime) temp=processesi.arrivetime ; k=i ; this.finish=temp ;/设置finish的初始值为到达最早的进程的到达时间 this.set(k) ; while(this.finishnum!=this.n) float min=1000f ;int flag=0 ; for(int i=0;in;i+)/根据到达时间最早原则,找到该执行的进程 if(cessesi.flag=0 & cessesi.arrivetime) min=cessesi.arrivetime ; k=i ; flag=1 ; if(flag=0) this.finish+ ; else this.set(k) ; 此外,定义了传递进程名、到达时间、服务时间的方法。还定义了计算平均周转时间和平均带全周转时间的方法。public void add(String processname,float arrivetime,float servetime)/添加进程并计算完成时间 B process=new B(processname,arrivetime,servetime) ; cessesn=process ; n+ ; for (int i=0;ithis.n;i+ ) this.aveturnovertime+=processesi.turnovertime ; this.aveturnovertime/=this.n ; for (int i=0;ithis.n;i+ ) this.aveweighturnovertime+=processesi.weighturnovertime ; this.aveweighturnovertime/=this.n ; 定义了一个计算进程的完成时间和周转时间以及各个进程的开始执行的时间的方法:public void set(int i)/计算一个进程的完成时间,周转时间,带权周转时间 this.setFinish(cessesi.servetime) ; cessesi.setFinishtime(finish) ; cessesi.setTurnovertime() ; cessesi.setWeighturnovertime() ; cessesi.setFlag() ;/进程完成 this.finishnum+ ; 通过定义了一个进程的类B从而定义了一个进程的数组通过进程里的方法从而传递进程名到达时间服务时间并把进程的完成时间、周转时间、带圈周转时间、平均周转时间、平均带权周转时间计算出来并且打印输出。3.4代码实现经过前面的工作,最后在集成编辑环境中,编写的程序代码如下:class A class B private String processname ; private float arrivetime ; private float servetime ; private float finishtime ; private float turnovertime ; private float weighturnovertime ; private int flag=0 ; public B(String processname,float arrivetime,float servetime) cessname=processname ; this.arrivetime=arrivetime ; this.servetime=servetime ; public void setFlag() this.flag=1 ; public void setFinishtime(float finishtime) this.finishtime=finishtime ; public void setTurnovertime() this.turnovertime=this.finishtime-this.arrivetime ; public void setWeighturnovertime() this.weighturnovertime=this.turnovertime/this.servetime ; public String toString() return cessname + t + this.arrivetime+ tt + this.servetime + t + this.finishtime + tt + this.turnovertime + tt + this.weighturnovertime + n ; private B processes=new B10 ; private int n=0 ; private int finishnum=0 ; private float finish=0 ; private float aveturnovertime ; private float aveweighturnovertime ; public void setFinish(float servetime) finish+=servetime ; public void add(String processname,float arrivetime,float servetime) B process=new B(processname,arrivetime,servetime) ; cessesn=process ; n+ ; public void fun() float temp=processes0.arrivetime ; int k=0 ; for(int i=0;iprocessesi.arrivetime) temp=processesi.arrivetime ; k=i ; this.finish=temp ; this.set(k) ; while(this.finishnum!=this.n) float min=1000f ;int flag=0 ; for(int i=0;in;i+) if(cessesi.flag=0 & cessesi.servetime) min=cessesi.servetime ; k=i ; flag=1 ; if(flag=0) this.finish+ ; else this.set(k) ; for (int i=0;ithis.n;i+ ) this.aveturnovertime+=processesi.turnovertime ; this.aveturnovertime/=this.n ; for (int i=0;ithis.n;i+ ) this.aveweighturnovertime+=processesi.weighturnovertime ; this.aveweighturnovertime/=this.n ; public void set(int i) this.setFinish(cessesi.servetime) ; cessesi.setFinishtime(finish) ; cessesi.setTurnovertime() ; cessesi.setWeighturnovertime() ; cessesi.setFlag() ; this.finishnum+ ; public void print() for(int i=0;ithis.n;i+) System.out.print(cessesi) ; System.out.println(平均周转时间: +this.aveturnovertime) ; System.out.println(平均带权周转时间: + this.aveweighturnovertime) ; public class FJS public static void main(String args) A a=new A() ; a.add(W,0,4) ; a.add(U,5,3) ; a.add(I,6,5) ; a.add(O,7,2) ; a.add(P,8,4) ; a.add(S,8,8) ; a.fun() ; System.out.println(进程名 到达时间 服务时间t完成时间t周转时间t带权周转时间) ; a.print() ; 计算进程开始时间的方法:public void setFnish(float servetime) finish+=servetime ; 3.5程序运行程序运行时随机输入五个进程分别是W、U、I、O、P、S以及它们的到达时间分别为0.0、5.0、6.0、7.0、8.0、8.0服务时间为4.0、3.0、5.0、2.0、4.0、8.0完成时间为4.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论