操作系统实验——作业调度算法(FCFS,SJF,HRRF)C语言

1.先来先到服务——FCFS

2.短作业优先——SJF(非抢占式)一般默认为非抢占式

3.最高响应比——HRRF

废话不多说直接上代码:

#include<stdio.h>
#define n 100
struct work
{
	int id;
	float submit_time;
	float run_time;
	float start_time;
	float finish_time;
	float zz_time;
	float dq_time;
	float hrrf_rate;
};
void print(work w[], int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf("请依次输入作业%d的提交时间,执行时间:", i + 1);
		scanf("%f%f", &w[i].submit_time, &w[i].run_time);
		w[i].id = i + 1;
		printf("\n");
	}
	printf("1.先来先到服务算法\n2.短作业优先算法\n3.最高响应算法\n0.退出\n");
}
void headprint()
{
	printf("作业序号\t提交时间\t执行时间\t开始时间\t完成时间\t周转时间\t权周转时间\n");
}
void FCFS(work w[], int len)
{
	int i, j;
	float sumzz_time = 0, sumdq_time = 0;
	work temp;
	for (i = 0; i < len; i++)
	{
		for (j = i + 1; j < len; j++)
			if (w[i].submit_time > w[j].submit_time)
			{
				temp = w[i];
				w[i] = w[j];
				w[j] = temp;
			}
	}
	for (i = 0; i < len; i++)
	{
		if (i == 0)
		{
			w[i].zz_time = w[i].run_time;
			w[i].start_time = w[i].submit_time;
			w[i].finish_time = w[i].submit_time + w[i].run_time;
			w[i].dq_time = w[i].zz_time / w[i].run_time;
		}
		else
		{
			w[i].start_time = w[i - 1].finish_time;
			w[i].finish_time = w[i].start_time + w[i].run_time;
			w[i].zz_time = w[i].finish_time - w[i].submit_time;
			w[i].dq_time = w[i].zz_time / w[i].run_time;
		}
		printf("  %d\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\n", w[i].id, w[i].submit_time, w[i].run_time, w[i].start_time, w[i].finish_time, w[i].zz_time, w[i].dq_time);
	}
	for (i = 0; i < len; i++)
	{
		sumzz_time += w[i].zz_time;
		sumdq_time += w[i].dq_time;
	}
	printf("平均周转时间为:%.2f\n平均周转系数:%.2f\n", sumzz_time / len, sumdq_time / len);

}
void SJF(work w[], int len)
{
	work temp;
	int i, j;
	float sumzz_time = 0, sumdq_time = 0;
	for (i = 0; i < len; i++)
	{
		for (j = i + 1; j < len; j++)
			if (w[i].submit_time > w[j].submit_time)
			{
				temp = w[i];
				w[i] = w[j];
				w[j] = temp;
			}
	}
	for (i = 1; i < len; i++)
	{
		for (j = i + 1; j < len; j++)
			if (w[i].run_time > w[j].run_time)
			{
				temp = w[i];
				w[i] = w[j];
				w[j] = temp;

			}
	}
	for (i = 0; i < len; i++)
	{
		if (i == 0)
		{
			w[i].zz_time = w[i].run_time;
			w[i].start_time = w[i].submit_time;
			w[i].finish_time = w[i].submit_time + w[i].run_time;
			w[i].dq_time = w[i].zz_time / w[i].run_time;
		}
		else
		{
			w[i].start_time = w[i - 1].finish_time;
			w[i].finish_time = w[i].start_time + w[i].run_time;
			w[i].zz_time = w[i].finish_time - w[i].submit_time;
			w[i].dq_time = w[i].zz_time / w[i].run_time;
		}
		printf("  %d\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\n", w[i].id, w[i].submit_time, w[i].run_time, w[i].start_time, w[i].finish_time, w[i].zz_time, w[i].dq_time);
	}
	for (i = 0; i < len; i++)
	{
		sumzz_time += w[i].zz_time;
		sumdq_time += w[i].dq_time;
	}
	printf("平均周转时间为:%.2f\n平均周转系数:%.2f\n", sumzz_time / len, sumdq_time / len);
}
void HRRF(work w[], int len)
{
	int i, j = len;
	work temp;
	for (i = 0; i < len; i++)
	{
		if (i == 0)
			w[i].finish_time = w[i].submit_time + w[i].run_time;
		else
			w[i].hrrf_rate = (w[i].run_time + (w[i - 1].finish_time - w[i].submit_time)) / w[i].run_time;
	}
	for (i = 0; i < len; i++)
	{
		for (j = i + 1; j < len; j++)
		{
			if (w[i].hrrf_rate < w[j].hrrf_rate)
			{
				temp = w[i];
				w[i] = w[j];
				w[j] = temp;
			}
		}
	}
	int m = 1;
	do
	{
		for (i = m; i < len; i++)
		{
			if (i == m)
				w[i].finish_time = w[i - 1].finish_time + w[i].run_time;
			else
				w[i].hrrf_rate = (w[i].run_time + (w[i - 1].finish_time - w[i].submit_time)) / w[i].run_time;
		}
		for (i = m + 1; i < len; i++)
		{
			for (j = i + 1; j < len; j++)
			{
				if (w[i].hrrf_rate < w[j].hrrf_rate)
				{
					temp = w[i];
					w[i] = w[j];
					w[j] = temp;
				}
			}
		}
		m++;
	} while (m <= len - 2);
	for (i = 0; i < len; i++)
	{
		if (i == 0)
		{
			w[i].zz_time = w[i].run_time;
			w[i].start_time = w[i].submit_time;
			w[i].finish_time = w[i].submit_time + w[i].run_time;
			w[i].dq_time = w[i].zz_time / w[i].run_time;
		}
		else
		{
			w[i].start_time = w[i - 1].finish_time;
			w[i].finish_time = w[i].start_time + w[i].run_time;
			w[i].zz_time = w[i].finish_time - w[i].submit_time;
			w[i].dq_time = w[i].zz_time / w[i].run_time;
		}
		printf("  %d\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\t\t% .2f\n", w[i].id, w[i].submit_time, w[i].run_time, w[i].start_time, w[i].finish_time, w[i].zz_time, w[i].dq_time);
	}
}
int main()
{
	work w[n] = { 0 };
	int len, command;
	int running = 1;
	printf("please input the numbers of work:");
	scanf("%d", &len);
	print(w, len);
	while (running)
	{
		printf("请选择算法:");
		scanf("%d", &command);
		switch (command)
		{

		case 1:
			headprint();
			FCFS(w, len);
			break;
		case 2:
			headprint();
			SJF(w, len);
			break;
		case 3:
			headprint();
			HRRF(w, len);
			break;
		case 0:
			running = 0;
			break;
		default:
			printf("请输入正确序号指令!");
			break;
		}
	}
	return 0;
}

运行结果

最后,如果本文有不足或错误的地方,欢迎各位C友在评论区留言指正。如果觉得不错的话,顺便点个赞哈。[爱心][爱心]

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值