实验二、作业调度模拟程序
一、 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、 实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。
(一)、模拟数据的生成
1. 允许用户指定作业的个数(2-24),默认值为5。
2. 允许用户选择输入每个作业的到达时间和所需运行时间。
3. (**)从文件中读入以上数据。
4. (**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。
(二)、模拟程序的功能
5. 按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。
6. 动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。
7. (**)允许用户在模拟过程中提交新作业。
8. (**)编写并调度一个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采用基于先来先服务的调度算法。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
(三)、模拟数据结果分析
9. 对同一个模拟数据各算法的平均周转时间,周转系数比较。
10. (**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。
(四)、其他要求
11. 完成报告书,内容完整,规格规范。
12. 实验须检查,回答实验相关问题。
注:带**号的条目表示选做内容。
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件Operation.rar(rar或zip)中源程序名 Operation.java
原理分析及流程图
流程图
主要总体设计问题。
用户输入作业个数以及作业的信息,作业用一个类表示
用户选择其中一个调度算法,然后按那个调度算法算出作业的运行过程
用户还可以对同一组作业,选择不同的调度算法
用户还可以重新输入作业信息
菜单:
1--先来先服务
2--短作业优先
3--最高响应比优先算法
4--重新输入任务
0--退出
- 2. 主要程序段及其解释:
主要功能的程序段:
单道FCFS算法:
static void FCFS()//先来先服务调度算法
{
System.out.println("按先来先服务调度算法进行调度!!");
while((notnum>0)||(arrnum>0))
{ System.out.println("********************************************");
System.out.println("当前系统时间为:"+systemtime);
notarrtoarr(not,arr);
//pause
if(notnum>0)
{
System.out.println("还没进入后备队列的作业:");
print(not,notnum);
}
if(arrnum==0)
systemtime++;
if(arrnum>0)
{
System.out.println("\n进入后备队列的作业:");
sortarr(arr,arrnum);
print(arr,arrnum);
running=arr[0];
for(int k=0;k<arrnum;k++)
arr[k]=arr[k+1];
arrnum--;
running.status='R';
running.starttime=systemtime;
running.endtime=(running.starttime)+(running.requtime);
running.zztime=(running.endtime)-(running.arrtime);
running.zzxs=Float.parseFloat(df.format((float)((running.zztime*1.0)/(running.requtime*1.0))));
System.out.println("\n处于运行的作业:"+running.jname);
System.out.println("运行中.......");
fin[finnum]=running;
fin[finnum].status='F';
finnum++;
systemtime=systemtime+running.requtime;
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\n已经完成的作业:");
printall(fin,finnum);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
单道SJPF算法:
static void SJPF()
{
System.out.println("按短作业优先调度算法进行调度!!");
while((notnum>0)||(arrnum>0))
{
System.out.println("********************************************");
System.out.println("当前系统时间为:"+systemtime);
notarrtoarr(not,arr);
//pause
if(notnum>0)
{
System.out.println("还没进入后备队列的作业:");
print(not,notnum);
}
if(arrnum==0)
systemtime++;
if(arrnum>0)
{
System.out.println("进入后备队列的作业:");
sortrequ(arr,arrnum);
print(arr,arrnum);
running=arr[0];
for(int k=0;k<arrnum;k++)
{
arr[k]=arr[k+1];
}
arrnum--;
running.status='R';
running.starttime=systemtime;
running.endtime=(running.starttime)+(running.requtime);
running.zztime=(running.endtime)-(running.arrtime);
running.zzxs=Float.parseFloat(df.format((float)((running.zztime*1.0)/(running.requtime*1.0))));
System.out.println("处于运行的作业:"+running.jname);
System.out.println("运行中.......");
fin[finnum]=running;
finnum++;
systemtime=systemtime+running.requtime;
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("已经完成的作业:");
printall(fin,finnum);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
单道HRRN算法:
static void HRRN()//最高响应比调度算法
{
System.out.println("按最高响应比调度算法进行调度!!");
while((notnum>0)||(arrnum>0))
{
System.out.println("********************************************");
System.out.println("当前系统时间为:"+systemtime);
notarrtoarr(not,arr);
//pause
if(notnum>0)
{
System.out.println("还没进入后备队列的作业:");
print(not,notnum);
}
if(arrnum==0)
systemtime++;
if(arrnum>0)
{
System.out.println("进入后备队列的作业:");
sortrp(arr,arrnum);
print(arr,arrnum);
running=arr[0];
for(int k=0;k<arrnum;k++)
{
arr[k]=arr[k+1];
}
arrnum--;
running.status='R';
running.starttime=systemtime;
running.endtime=(running.starttime)+(running.requtime);
running.zztime=(running.endtime)-(running.arrtime);
running.zzxs=Float.parseFloat(df.format((float)((running.zztime*1.0)/(running.requtime*1.0))));
System.out.println("处于运行的作业:"+running.jname);
System.out.println("运行中.......");
fin[finnum]=running;
finnum++;
systemtime=systemtime+running.requtime;
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("已经完成的作业:");
printall(fin,finnum);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- 3. 运行结果及分析
结果符合预期及其分析。
程序执行:
输入作业信息:
输入完后出现菜单:
先来先服务作业;
可以继续选择另外一种调度方式:按回车继续出现菜单
短作业优先
最高响应比优先
重新输入数据:
退出:
四、 实验总结
在这次的实验里面,一开始自己完全不知道该怎么入手,对这几种调度方法还是可以理解,但是要编写模拟调度方法程序,其中的思路是很混乱的,后来老师给的C语言的例子,根据这个例子,大概知道是什么样的思路,也能够自己按照这样的思路,写下另外两种方法,老师的方法我进行了修改,主要是排序的地方,在结构上也修改,现在的程序能有三种调度方法。
本来想再弄一个加入新作业,但是在添加时出错了,所以就先不交那个版本,后面自己再进行更新。我觉得在编写java,写程序时最重要的时思路清晰,弄清楚要怎么走,要实现什么,遇到关卡也不能慌,要一步一步的走看是哪里出错然后不断地测试就可以找出错误的地方,然后继续做下去。