作业调度实现——最高响应比

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);
} 

以上内容仅供参考,若有错误欢迎批评指正!

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值