此程序是模拟作业调度中的先来先服务算法(fcfs),最短作业优先算法(sjf),最高响应比优先算法(hrn)。
print()函数的功能是输出模拟后的各作业运行情况。
avg() 函数的功能是计算平均周转时间和平均带权周转时间并输出。
#include
#define MAX 100
typedef struct JCB
{
char job_id[10]; //作业ID
float Arr_time; //到达时刻
float Fun_time; //估计运行时间
float Wait_time; //等待时间
float Start_time; //开始时刻
float Fin_time; //完成时刻
float Tur_time; //周转时间
float WTur_time; //带权周转时间
int Order; //优先标记
}list;
void fcfs(list *p,int count);
void sjf(list *p,int count);
void hrn(list *p,int count);
void print(list *p,int count);
void avg(list *p,int count);
void fcfs(list *p,int count) //先来先服务算法
{
list temp; //临时结构体变量
int i;
int j;
for(i = 1;i < count;i++) //按到达时刻直接插入排序
{
temp = p[i];
j = i-1;
while(temp.Arr_time < p[j].Arr_time && j >= 0)
{
p[j+1] = p[j];
--j;
}
p[j+1] = temp;
}
for(i = 0;i < count;i++) //循环计算各个作业的时间值
{
if(i == 0)
{
p[i].Start_time = p[i].Arr_time;
}
else
{
p[i].Start_time = p[i-1].Fin_time; //开始时刻==前一个作业的完成时刻
}
p[i].Wait_time = p[i].Start_time - p[i].Arr_time; //等待==开始-到达
p[i].Fin_time = p[i].Start_time + p[i].Fun_time; //完成==开始+运行
p[i].Tur_time = p[i].Fin_time - p[i].Arr_time; //周转=完成-到达
p[i].WTur_time = p[i].Tur_time / p[i].Fun_time; //带权周转=周转/运行
}
return;
}
void sjf(list *p,int count) //最短作业优先算法(sjf)
{
list item; //结构体变量
int i = 0;
int j = 0;
int k = 0; //最短运行时间作业的下标
int flag = 0; //优先级设置
float min = 0; //最短运行时间
float temp; //开始的时刻
temp = p[0].Arr_time;
//先求出最先到达作业的时刻
for(i = 0;i < count;i++)
{
if(temp > p[i].Arr_time)
{
temp = p[i].Arr_time; //保存最先到达的作业的时刻
k = i; //最先到达的作业的下标,默认为p[0]
}
}
for(i = 0;i < count;i++)
{
p[k].Order = ++flag; //设置优先级为1,最高优先级
p[k].Start_time = temp;
p[k].Wait_time = temp - p[k].Arr_time; //计算各个时间
p[k].Fin_time = temp + p[k].Fun_time;
p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;
p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;
min = 100;
temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻
for(j = 0;j < count;j++)
{
if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的 和 到达时刻要晚于前一个作业的完成时刻的)
continue;
if(min > p[j].Fun_time)
{
min = p[j].Fun_time;
k = j; //求出满足条件最短运行时间的作业的下标
}
}
}
for(i = 1;i < count;i++) //按优先级排序
{
item = p[i];
j = i-1;
while(item.Order < p[j].Order && j >= 0)
{
p[j+1] = p[j];
--j;
}
p[j+1] = item;
}
return;
}
void hrn(list *p,int count) //最高响应比优先算法
{
list item; //结构体变量
int i = 0;
int j = 0;
int k = 0; //最高响应比作业的下标
int flag = 0; //优先级设置
float max = 0; //最大响应比的值
float temp; //开始的时刻
temp = p[0].Arr_time;
//先求出最先到达作业的时刻
for(i = 0;i < count;i++)
{
if(temp > p[i].Arr_time)
{
temp = p[i].Arr_time;
k = i; //最先到达的作业的下标,默认为p[0]
}
}
for(i = 0;i < count;i++)
{
p[k].Order = ++flag; //设置优先级
p[k].Start_time = temp; //计算各个作业的时间
p[k].Wait_time = temp - p[k].Arr_time;
p[k].Fin_time = temp + p[k].Fun_time;
p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;
p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;
max = 0;
temp = p[k].Fin_time;
for(j = 0;j < count;j++)
{
if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //排除优先级已设置 和 晚于作业完成时刻到达的
continue; //后一个判断可以不加,如果晚到的话,下面的if语句进不去
if(max < (temp - p[j].Arr_time) / p[j].Fun_time)
{
max = (temp - p[j].Arr_time) / p[j].Fun_time;
k = j; //求出剩下响应比最高的作业的下标
}
}
}
for(i = 1;i < count;i++) //按优先级排序
{
item = p[i];
j = i-1;
while(item.Order < p[j].Order && j >= 0)
{
p[j+1] = p[j];
--j;
}
p[j+1] = item;
}
return;
}
void print(list *p,int count) //输出各个作业的详细信息
{
int i;
printf("*****************************************************************\n");
printf("ID\t到达\t运行\t等待\t开始\t完成\t周转\t带权周转\n");
for(i = 0;i < count;i++)
{
printf("%s\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n",p[i].job_id,p[i].Arr_time,p[i].Fun_time,p[i].Wait_time,p[i].Start_time,p[i].Fin_time,p[i].Tur_time,p[i].WTur_time);
}
return;
}
void avg(list *p,int count)
{
float AvgTur1; //平均周转
float AvgTur2; //平均带权周转
float t1 = 0;
float t2 = 0;
int i;
for(i = 0;i < count;i++)
{
t1 += p[i].Tur_time; //周转时间和
t2 += p[i].WTur_time; //带权周转和
}
AvgTur1 = t1/count;
AvgTur2 = t2/count;
printf("\n平均周转时间为:%f\t平均带权周转时间为:%f\n",AvgTur1,AvgTur2);
printf("\n*****************************************************************\n");
return;
}
int main()
{
list st[MAX]; //最多可以一百个作业
int job_count = 0; //作业数量
int flag = 1; //算法标记
int i = 0;
printf("请输入作业数量:");
scanf("%d",&job_count);
printf("请输入作业ID,到达时刻,估计运行时间(用空格隔开):\n");
do
{
scanf("%s %f %f",st[i].job_id,&st[i].Arr_time,&st[i].Fun_time);
st[i].Order = 0; //优先级初始化
}while(++i < job_count);
printf("请选择算法:\n1, 先来先服务算法!\n2, 最短作业优先算法!\n3, 最高响应比优先算法!\n");
scanf("%d",&flag);
switch(flag)
{
case 1 : {
fcfs(st,job_count);
printf("\n*******************************************\n\n");
printf("先来先服务算法\n");
} break;
case 2 : {
sjf(st,job_count);
printf("\n*******************************************\n\n");
printf("最短作业优先算法\n");
} break;
case 3 : {
hrn(st,job_count);
printf("\n*******************************************\n\n");
printf("最高响应比优先算法\n");
} break;
}
print(st,job_count);
avg(st,job_count);
return 0;
}