39 作业调度实验
一、 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、 实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。
三、 实验方法、步骤及结果测试
1.源程序名:1020.c
可执行程序名:1020.exe
2.原理分析及流程图
1)理清思路,各函数实现模块功能;
2)流程图:
3.主要程序段及其解释:#include<stdio.h>
#define MAX 24
typedef struct node
{
char name[10];//作业名
int arrivetime;//作业到达时间
int runtime;//作业所需的运行时间
int starttime; //开始时间
int endtime; //结束时间
int zztime; //作业周转时间
float zzxs; //周转系数
//struct node *next; //链指针
}JCB;
static int N=5; //作业数
static int flag=0;
JCB job[MAX];
JCB finish[MAX];
void FCFS();
void getValue();
void getZZXS();
void input();
void print();
void choice();
void SJF();
void HRRN();
void line();
//JCB *finish, *ready, *tail, *run;
void getValue()
{
int i;
for(i=0; i<N; i++)
{
if(i==0 || job[i].arrivetime>job[i-1].endtime)
job[i].starttime=job[i].arrivetime;
else
job[i].starttime=job[i-1].endtime;
job[i].endtime=job[i].runtime+job[i].starttime;
job[i].zztime=job[i].endtime-job[i].arrivetime;
job[i].zzxs=(float)job[i].zztime/(float)job[i].runtime;
}
}
void input()
{
int i, jobNum, choi;
char flag=0;
printf("1.自选作业个数\n");
printf("2.系统默认作业个数\n");
printf("你的选择是:");
scanf("%d", &choi);
switch(choi)
{
case 1:
{
do{
printf("\nEnter process number(作业个数应在2~24之间):");
scanf("%d", &jobNum); //输入作业数
N=jobNum;
printf("\n");
}while(N<2 || N>24);
break;
}
case 2:
printf("\n系统默认作业个数为5");
break;
}
for(i=0; i<jobNum; i++)
{
printf("\njob %d name:",i+1);
scanf(" ");
gets(job[i].name); //输入作业名
printf("arrive time:");
scanf(" %d",&job[i].arrivetime); //输入作业达到时间
printf("running time:");
scanf(" %d",&job[i].runtime); //输入作业执行时间
job[i].starttime=0;
job[i].zztime=0;
}
}
void print()
{
int i;
printf(" name arrivetime runtime starttime endtime zztime zzxs\n");
for(i=0; i<N; i++)
{
printf("jod%d",i+1);
printf(" %s\t\t%d %d %d %d %d %.2f\n",job[i].name,job[i].arrivetime,job[i].runtime,job[i].starttime,job[i].endtime,job[i].zztime,job[i].zzxs);
}
}
void choice()
{
int mark;
do{
printf("\n\n1. 先来先服务(FCFS)调度算法;\n2. 短作业优先(SJF)调度算法;\n3. 响应比高者优先(HRRN)调度算法;\n4. 退出.");
printf("\nMake choice: ");
scanf("%d", &mark);
switch(mark)
{
case 1:
FCFS(); //先来先服务
break;
case 2:
SJF(); //短作业优先
break;
case 3:
HRRN(); //响应比高者优先
break;
case 4:
return;
default:
printf("\nerror!");
}
}while(mark!=4);
}
void FCFS()
{
int i, j;
JCB mark;
for(i=0;i<N-1; i++) //通过到达时间整体排序
{
for(j=i+1; j<N; j++)
{
if(job[j].arrivetime<job[i].arrivetime)
{
mark=job[j];
job[j]=job[i];
job[i]=mark;
}
}
}
getValue(); //给每个作业内的相关参数赋值
print(); //打印出来
}
void SJF()
{
int i, j;
JCB mark;
for(i=0;i<N-1; i++) //根据作业执行时间整体排序
{
for(j=i+1; j<N; j++)
{
if(job[j].runtime<job[i].runtime)
{
mark=job[j];
job[j]=job[i];
job[i]=mark;
}
}
}
getValue();
print(); //打印出来
}
void HRRN()
{
int i, j;
JCB mark;
for(i=0;i<N-1; i++) //通过到达时间整体排序
{
for(j=i+1; j<N; j++)
{
if(job[j].arrivetime<job[i].arrivetime)
{
mark=job[j];
job[j]=job[i];
job[i]=mark;
}
}
}
job[0].starttime=job[0].arrivetime;
job[0].endtime=job[0].runtime+job[0].starttime;;
job[0].zztime=job[0].endtime-job[0].arrivetime;
job[0].zzxs=(float)job[0].zztime/(float)job[0].runtime;
flag=0;
getZZXS(); // 得到响应比
print(); //打印出来
}
void getZZXS()
{
int i, j;
JCB mark2;
do{
for(i=flag+1; i<N; i++)
{
if(job[i].arrivetime>job[flag].endtime) //后面的与第一个对比
job[i].starttime=job[i].arrivetime;
else
job[i].starttime=job[flag].endtime;
job[i].endtime=job[i].runtime+job[i].starttime;;
job[i].zztime=job[i].endtime-job[i].arrivetime;
job[i].zzxs=(float)job[i].zztime/(float)job[i].runtime;
}
for(i=flag+1;i<N-1; i++) //后面的元素 根据响应比整体排序 得到高响应比的元素
{
for(j=i+1; j<N; j++)
{
if(job[j].zzxs>job[i].zzxs)
{
mark2=job[j];
job[j]=job[i];
job[i]=mark2;
}
}
}
flag++;
}while(flag<N);
}
void main()
{
input(); //输入
print(); //打印输出
choice(); //选择方式
}
4.运行结果及分析
图3.1 提示用户输入信息
图3.2 作业调度前
图3.3 FCFS算法结果
图3.4 SJF算法结果
图3.5 HRRN调度算法结果及退出
四、 实验总结
刚开始看到实验要求的时候会觉得无从下手,思路很乱,但后来理解了各种算法后,发现其实并不难。关键是要立理解,把思路理清,然后运用所学过的C语言编程就可以实现实验要求了。淡然过程中总会有运行出错的情况,但是不断运行,不断地修改,最终就能成功了。