一、实验目的
作业调度算法是指依照某种原则或策略从后备作业队列中选取作业的方法。响应比最高者优先算法是通过计算输入井后备队列中每个作业的响应比大小,从中选择响应比最高的作业装入主存,这样既考虑了作业的等待时间,又考虑了作业的运行时间。本实验要求学生设计一个响应比最高者优先算法来模拟实现作业调度过程。
二、实验要求
假设本系统仍采用单道批处理系统,忽略设备工作时间和系统进行调度所花的时间。要求从键盘输入作业个数N,及每个作业的作业名、作业入井时间、估计运行时间。请编程输出采用响应比最高者优先算法得到的每个作业调度序号、作业名、作业入井时间、开始调度时间、运行时间、结束时间、周转时间, 以及所有作业的平均周转时间。
三、源代码
#include <iostream>
#include <cstdio>
const int N=10;
using namespace std;
typedef struct time{
int hour;
int minute;
}time;
//作业控制块
typedef struct jcb{
string name;
time intime;//入井时间
int runtime;
bool flag;//作业是否完成
}jcb;
jcb jobs[N];
//运行结果表单
typedef struct form{
int seq;//序号
jcb job;//作业
time schetime;//调度时间
time endtime;//结束时间
int trtime;//周转时间
}form;
form forms[N];
int n;
//打印表单的结果
void print()
{
int i;
cout<<"序号\t作业名\t入井时间\t调度时间\t运行时间\t结束时间\t周转时间"<<endl;
for(i=0;i<n;i++)
{
cout<<forms[i].seq<<"\t"<<forms[i].job.name<<"\t";
printf("%d:%.*d",forms[i].job.intime.hour,2,forms[i].job.intime.minute);cout<<"\t\t";
printf("%d:%.*d",forms[i].schetime.hour,2,forms[i].schetime.minute);cout<<"\t\t";
cout<<forms[i].job.runtime<<"\t\t";
printf("%d:%.*d",forms[i].endtime.hour,2,forms[i].endtime.minute);cout<<"\t\t";
cout<<forms[i].trtime<<endl;
}
}
//初始化表单
void init()
{
int i;
for(i=0;i<n;i++)
{
forms[i].job=jobs[i];
}
}
//修改更新表单
void revise(int t,int sequ)
{
forms[t].seq=sequ;//序号
if(sequ==1)//调度时间
{
forms[t].schetime.hour=jobs[t].intime.hour;
forms[t].schetime.minute=jobs[t].intime.minute;
}
else
{
int k;
for(int i=0;i<n;i++)
{
if(forms[i].seq==sequ-1)
{
k=i;
}
}
forms[t].schetime.hour=forms[k].endtime.hour;
forms[t].schetime.minute=forms[k].endtime.minute;
}
int ltime;//结束时间
ltime=forms[t].schetime.hour*60+forms[t].schetime.minute+forms[t].job.runtime;
forms[t].endtime.hour=ltime/60;
forms[t].endtime.minute=ltime%60;
//周转时间
forms[t].trtime=forms[t].endtime.hour*60+forms[t].endtime.minute-forms[t].job.intime.hour*60-forms[t].job.intime.minute;
}
//计算响应比,返回响应比最高
int Response(int it[],int k,int t)
{
double res[10];
int i,lt1,lt2;
lt1=forms[t].endtime.hour*60+forms[t].endtime.minute;
for(i=0;i<k;i++)//计算响应比
{
lt2=jobs[it[i]].intime.hour*60+jobs[it[i]].intime.minute;
res[i]=(lt1-lt2+jobs[it[i]].runtime*1.0)/jobs[it[i]].runtime;
}
int temp=0;
for(i=1;i<k;i++)//寻找最高响应比
{
if(res[temp]<res[i])
{
temp=i;
}
}
return it[temp];
}
//寻找最先入井作业
int searc()
{
int i,temp;
int st[10];
for(i=0;i<n;i++)//计算各作业入井时间先后
{
st[i]=jobs[i].intime.hour*60+jobs[i].intime.minute;
}
temp=0;
for(i=1;i<n;i++)//寻找最先入井作业
{
if(st[temp]>st[i])
{
temp=i;
}
}
return temp;
}
//寻找已入井还未完成的作业
int searcs(int t)
{
int it[10];//存放已入井的作业
int i,lt1,lt2,jb,k=0;
lt2=forms[t].endtime.hour*60+forms[t].endtime.minute;
for(i=0;i<n;i++)//找出已入井的作业
{
lt1=jobs[i].intime.hour*60+jobs[i].intime.minute;
if(lt1<=lt2&&jobs[i].flag!=true)
{
it[k]=i;
k++;
}
}
//计算响应比
jb=Response(it,k,t);
return jb;
}
//最高响应比算法
void HRRF()
{
int sequ,t;
sequ=0;//运行的顺序
//1.找出最先入井的作业,让其运行
t=searc();
sequ++;
revise(t,sequ);
jobs[t].flag=true;//作业已运行完成
//2.找出后面入井的作业,计算响应比
while(sequ<n)
{
t=searcs(t);
sequ++;
revise(t,sequ);
jobs[t].flag=true;
}
}
int main()
{
int i;
cout<<"请输入要运行的作业个数:";
cin>>n;
cout<<"作业名\t入井时间\t运行时间"<<endl;
for(i=0;i<n;i++)
{
cin>>jobs[i].name;
scanf("%d:%d",&jobs[i].intime.hour,&jobs[i].intime.minute);
cin>>jobs[i].runtime;
}
init();
HRRF();
print();
return 0;
}