C语言实现最高响应比(操作系统程序调度)
作业调度的算法有多种:
1.先来先服务(First Come First Served,FCFS)
2.最短作业优先(Shortest Job First,SJF)
3.最短剩余时间优先(Shortest Remaining Time First,SRTF)
4.最高响应比优先(Highest Response Ratio First,HRRF)
5.优先级调度算法
…
每个作业调度算法都有出现的价值,以及在某些情况下是做优的存在,这里仅仅针对HRRF做一点说明:
HRRF的出现是因为FCFS和SJF调度的片面性,FCFS只考虑作业的等待时间而忽视了计算时间,而后者恰恰相反,只考虑用户作业的计算时间而忽略了作业的等待时间。而最高响应比优先算法(HRRF)是介于这两者之间的一种折中的非剥夺式算法。既考虑了作业等待时间,又考虑了作业处理时间,这样既照顾短作业又不会使长作业的等待时间过长,有效的改善调度性能。
我们知道任何一个算法不可能是十全十美的,所以最高响应比优先算法也有缺点,它的缺点就是每次计算各道作业的响应比会导致一定的时间开销,在性能上看比SJF算法略差。
响应比计算方法:
响应比=作业周转时间 / 作业处理时间
=(作业等待时间+作业处理时间) / 作业处理时间
=1+ 作业等待时间 / 作业处理时间
下面各处本人写的最高响应比优先算法的源代码:(仅供参考)
#include<stdio.h>
#define N 50
typedef struct //结构体定义
{
char name[10]; //作业名
int arrivetime; //到达时间
float runtime; //运行时间
int waittime; //等待时间
int starttime; //开始时间
int endtime; //完成时间
float rr; //相应比
}PCB;
PCB job[N]; //通过结构体定义一个数组 用来接收数据
int n; //定义一个全局变量
void compare(int t) //比较到达时间,按升序排序
{
int i,j,min,index;
PCB temp;
for(i=1;i<=t;i++)
{
min=job[i].arrivetime,index=i;
for(j=i+1;j<=t;j++)
{
if(job[j].arrivetime<min)
{
min=job[j].arrivetime;
index=j;
}
}
temp=job[i];
job[i]=job[index];
job[index]=temp;
}
}
/*递归sort和hrrf*/
void sort(int t)
{
int i,j,index;
float max;
PCB temp;
for(i=t;i<=n;i++)
{
max=job[i].rr,index=i;
for(j=i+1;j<=n;j++)
{
if(job[j].rr>max)
{
max=job[j].rr;
index=j;
}
}
temp=job[i];
job[i]=job[index];
job[index]=temp;
}
hrrf(t+1);
}
int hrrf(int t,int j)
{
int i;
if(t>n)
return 0;
for(i=j+1;i<=t;i++)
{
job[i].rr=(job[j].runtime-job[i].arrivetime)/job[i].runtime;
//printf("%.2f\n",job[i].rr);
}
sort(j+1);
}
main()
{
int i;
printf("请输入将要调度的工作数量:");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
printf("请输入第%d个作业的名字,到达时间,所需运行时间:",i);
scanf("%s%d%f",&job[i].name,&job[i].arrivetime,&job[i].runtime);
job[i].waittime=0;
job[i].endtime=0;
job[i].rr=0.0;
}
compare(n);
job[1].starttime=job[1].arrivetime;
job[1].endtime=job[1].arrivetime+job[1].runtime;
job[1].waittime=0;
hrrf(n,1);
printf("作业名\t到达时间\t运行时间\t等待时间\t开始时间\t完成时间\n");
for(i=1;i<=n;i++) //计算等待时间,开始时间以及完成时间
{
job[i].waittime=job[i-1].endtime-job[i].arrivetime;
job[i].starttime=job[i-1].endtime;
job[i].endtime=job[i].runtime+job[i].starttime;
}
for(i=1;i<=n;i++)
printf("%s\t%5d\t\t%2.1f\t\t%5d\t\t%5d\t\t%5d\n",job[i].name,job[i].arrivetime,job[i].runtime,job[i].waittime,job[i].starttime,job[i].endtime);
}
以上内容仅供参考,若有错误欢迎批评指正!