操作系统实验——作业调度算法模拟

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXJOB  50
typedef struct node
{
	int number;       
	int reach_time;
	int need_time;
	int privilege;
	float excellent;
	int start_time;
	int wait_time;
	int visited;
}job;
job jobs[MAXJOB];
int quantity;
void initial_jobs()
{
	int i;
	for (i = 0; i < MAXJOB; i++)
	{
		jobs[i].number = 0;
		jobs[i].reach_time = 0;
		jobs[i].privilege = 0;
		jobs[i].excellent = 0;
		jobs[i].start_time = 0;
		jobs[i].wait_time = 0;
		jobs[i].visited = 0;
	}
	quantity = 0;
}
void readJobdata()
{
	FILE *fp;
	char fname[20];
	int i;
	printf("please input job data file name\n");
	scanf("%s", fname);
	if ((fp = fopen(fname, "r")) == NULL)
	{
		printf("error, open file failed, please check filename:\n");
	}
	else
	{
		while (!feof(fp))
		{
			if (fscanf(fp, "%d %d %d %d", &jobs[quantity].number, &jobs[quantity].reach_time, &jobs[quantity].need_time, &jobs[quantity].privilege) == 4)
				quantity++;
		}
		printf("output the origin job data\n");
		printf("---------------------------------------------------------------------\n");
		printf("\tjobID\treachtime\tneedtime\tprivilege\n");
		for (i = 0; i < quantity; i++)
		{
			printf("\t%-8d\t%-8d\t%-8d\t%-8d\n", jobs[i].number, jobs[i].reach_time, jobs[i].need_time, jobs[i].privilege);
		}
	}
}
void reset_jinfo()
{
	int i;
	for (i = 0; i < MAXJOB; i++)
	{
		jobs[i].start_time = 0;
		jobs[i].wait_time = 0;
		jobs[i].visited = 0;
	}
}
int findrearlyjob(job jobs[], int count)
{
	int rearlyloc = -1;
	int rearlyjob = -1;
	for (int i = 0; i < count; i++)
	{
		if (rearlyloc == -1)
		{
			if (jobs[i].visited == 0)
			{
				rearlyloc = i;
				rearlyjob = jobs[i].reach_time;
			}
		}
		else if (rearlyjob > jobs[i].reach_time&&jobs[i].visited == 0)
		{
			rearlyjob = jobs[i].reach_time;
			rearlyloc = i;
		}
	}
	return rearlyloc;
}
int findminjob(job jobs[], int count, int current_time)
{
	int minjob = -1;
	int minloc = -1;
	for (int i = 0; i < count; i++)
	{
		if (minloc == -1) 
		{
			if (jobs[i].reach_time <= current_time && jobs[i].visited == 0) 
			{
				minjob = jobs[i].need_time;
				minloc = i;
			}
		}
		else if (minjob > jobs[i].need_time&&jobs[i].visited == 0 && jobs[i].reach_time <= current_time)
		{
			minjob = jobs[i].need_time;
			minloc = i;
		}
		else if (minjob == jobs[i].need_time&&jobs[i].visited == 0 && jobs[i].reach_time <= current_time && jobs[minloc].reach_time > jobs[i].reach_time)
		{
			minloc = i;
		}
	}
	if (minloc == -1)
		minloc = findrearlyjob(jobs, quantity);
	return minloc;
}
int findhighprivilegejob(job jobs[], int count, int current_time)
{
	int t;
	int privilegejob = -1;
	int privilegeloc = -1;
	int privilege = -1;
	for (int i = 0; i < count; i++)
	{
		if (privilegeloc == -1)
		{
			if (jobs[i].reach_time <= current_time && jobs[i].visited == 0)
			{
				privilege = jobs[i].privilege;
				privilegejob = jobs[i].need_time;
				privilegeloc = i;
			}
		}
		else if (privilege < jobs[i].privilege&&jobs[i].visited == 0 && jobs[i].reach_time <= current_time)
		{
			privilege = jobs[i].privilege;
			privilegejob = jobs[i].need_time;
			privilegeloc = i;
		}
		else if (privilege == jobs[i].privilege&&jobs[i].visited == 0 && jobs[i].reach_time <= current_time && privilegejob > jobs[i].need_time)
		{
			privilegejob = jobs[i].need_time;
			privilegeloc = i;
		}
	}
	if (privilegeloc == -1)
		privilegeloc = findrearlyjob(jobs, quantity);
	return privilegeloc;
}
int findhrrfjob(job jobs[], int count, int current_time)
{
	int hrrfjob = -1;
	int hrrfloc = -1;
	float responsejob = -1.0;
	for (int i = 0; i < count; i++)
	{
		if (hrrfloc == -1)
		{
			if (jobs[i].reach_time <= current_time && jobs[i].visited == 0)
			{
				hrrfjob = jobs[i].need_time;
				responsejob = (float)(current_time - jobs[i].reach_time + jobs[i].need_time) / jobs[i].need_time;
				hrrfloc = i;
			}
		}
		else if (responsejob < ((float)(current_time - jobs[i].reach_time + jobs[i].need_time) / jobs[i].need_time)&&jobs[i].visited == 0 && jobs[i].reach_time <= current_time)
		{
			responsejob = (float)(current_time - jobs[i].reach_time + jobs[i].need_time) / jobs[i].need_time;
			hrrfjob = jobs[i].need_time;
			hrrfloc = i;
		}
		else if (responsejob == ((float)(current_time - jobs[i].reach_time + jobs[i].need_time) / jobs[i].need_time) &&jobs[i].visited == 0 && jobs[i].reach_time <= current_time && hrrfjob > jobs[i].need_time)
		{
			hrrfjob = jobs[i].need_time;
			hrrfloc = i;
		}
	}
	if (hrrfloc == -1)
		hrrfloc = findrearlyjob(jobs, quantity);
	return hrrfloc;
}
void FCFS()
{
	int i;
	int current_time = 0;
	int loc;
	int total_waitime = 0;
	int total_roundtime = 0;
	loc = findrearlyjob(jobs, quantity);
	printf("\n\nFCFS算法作业流\n");
	printf("------------------------------------------------------------------------\n");
	printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
	current_time = jobs[loc].reach_time;

	for (i = 0; i < quantity; i++)
	{
		if (jobs[loc].reach_time > current_time)
		{
			jobs[loc].start_time = jobs[loc].reach_time;
			current_time = jobs[loc].reach_time;
		}
		else
		{
			jobs[loc].start_time = current_time;
		}
		jobs[loc].wait_time = current_time - jobs[loc].reach_time;
		printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time,
			jobs[loc].wait_time + jobs[loc].need_time);
		jobs[loc].visited = 1;
		current_time += jobs[loc].need_time;
		total_waitime += jobs[loc].wait_time;
		total_roundtime = total_roundtime + jobs[loc].wait_time + jobs[loc].need_time;
		loc = findrearlyjob(jobs, quantity);
	}
	printf("总等待时间:%-8d 总周转时间:%-8d\n", total_waitime, total_roundtime);
	printf("平均等待时间: %4.2f 平均周转时间: %4.2f\n", (float)total_waitime / (quantity), (float)total_roundtime / (quantity));
}
void SFJschdulejob(job jobs[], int count)
{
	int i;
	int current_time = 0;
	int loc;
	int total_waitime = 0;
	int total_roundtime = 0;
	loc = findrearlyjob(jobs, quantity);
	printf("\n\nSFJ算法作业流\n");
	printf("------------------------------------------------------------------------\n");
	printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
	current_time = jobs[loc].reach_time;
	jobs[loc].start_time = jobs[loc].reach_time;
	jobs[loc].wait_time = 0;
	printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time,jobs[loc].wait_time + jobs[loc].need_time);
	jobs[loc].visited = 1;
	current_time += jobs[loc].need_time;
	total_waitime = 0;
	total_roundtime = jobs[loc].need_time;
	loc = findminjob(jobs, quantity, current_time);
	for (i = 1; i < quantity; i++)
	{
		if (jobs[loc].reach_time > current_time)
		{
			jobs[loc].start_time = jobs[loc].reach_time;
			current_time = jobs[loc].reach_time;
		}
		else
		{
			jobs[loc].start_time = current_time;
		}
		jobs[loc].wait_time = current_time - jobs[loc].reach_time;
		printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time,
			jobs[loc].wait_time + jobs[loc].need_time);
		jobs[loc].visited = 1;
		current_time += jobs[loc].need_time;
		total_waitime += jobs[loc].wait_time;
		total_roundtime = total_roundtime + jobs[loc].wait_time + jobs[loc].need_time;
		loc = findminjob(jobs, quantity, current_time);
	}
	printf("总等待时间:%-8d 总周转时间:%-8d\n", total_waitime, total_roundtime);
	printf("平均等待时间: %4.2f 平均周转时间: %4.2f\n", (float)total_waitime / (quantity), (float)total_roundtime / (quantity));
}
void HPF(job jobs[], int count)
{
	int i;
	int current_time = 0;
	int loc;
	int total_waitime = 0;
	int total_roundtime = 0;
	loc = findrearlyjob(jobs, quantity);
	printf("\n\nHPF算法作业流\n");
	printf("------------------------------------------------------------------------\n");
	printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
	current_time = jobs[loc].reach_time;
	jobs[loc].start_time = jobs[loc].reach_time;
	jobs[loc].wait_time = 0;
	printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time, jobs[loc].wait_time + jobs[loc].need_time);
	jobs[loc].visited = 1;
	current_time += jobs[loc].need_time;
	total_waitime = 0;
	total_roundtime = jobs[loc].need_time;
	loc = findhighprivilegejob(jobs, quantity, current_time);
	for (i = 1; i < quantity; i++)
	{
		if (jobs[loc].reach_time > current_time)
		{
			jobs[loc].start_time = jobs[loc].reach_time;
			current_time = jobs[loc].reach_time;
		}
		else
		{
			jobs[loc].start_time = current_time;
		}
		jobs[loc].wait_time = current_time - jobs[loc].reach_time;
		printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time,
			jobs[loc].wait_time + jobs[loc].need_time);
		jobs[loc].visited = 1;
		current_time += jobs[loc].need_time;
		total_waitime += jobs[loc].wait_time;
		total_roundtime = total_roundtime + jobs[loc].wait_time + jobs[loc].need_time;
		loc = findhighprivilegejob(jobs, quantity, current_time);
	}
	printf("总等待时间:%-8d 总周转时间:%-8d\n", total_waitime, total_roundtime);
	printf("平均等待时间: %4.2f 平均周转时间: %4.2f\n", (float)total_waitime / (quantity), (float)total_roundtime / (quantity));
}
void HRRF(job jobs[], int count)
{
	int i;
	int current_time = 0;
	int loc;
	int total_waitime = 0;
	int total_roundtime = 0;
	loc = findrearlyjob(jobs, quantity);
	printf("\n\nHRRF算法作业流\n");
	printf("------------------------------------------------------------------------\n");
	printf("\tjobID\treachtime\tstarttime\twaittime\troundtime\n");
	current_time = jobs[loc].reach_time;
	jobs[loc].start_time = jobs[loc].reach_time;
	jobs[loc].wait_time = 0;
	printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time, jobs[loc].wait_time + jobs[loc].need_time);
	jobs[loc].visited = 1;
	current_time += jobs[loc].need_time;
	total_waitime = 0;
	total_roundtime = jobs[loc].need_time;
	loc = findhrrfjob(jobs, quantity, current_time);
	for (i = 1; i < quantity; i++)
	{
		if (jobs[loc].reach_time > current_time)
		{
			jobs[loc].start_time = jobs[loc].reach_time;
			current_time = jobs[loc].reach_time;
		}
		else
		{
			jobs[loc].start_time = current_time;
		}
		jobs[loc].wait_time = current_time - jobs[loc].reach_time;
		printf("\t%-8d\t%-8d\t%-8d\t%-8d\t%-8d\n", loc + 1, jobs[loc].reach_time, jobs[loc].start_time, jobs[loc].wait_time,
			jobs[loc].wait_time + jobs[loc].need_time);
		jobs[loc].visited = 1;
		current_time += jobs[loc].need_time;
		total_waitime += jobs[loc].wait_time;
		total_roundtime = total_roundtime + jobs[loc].wait_time + jobs[loc].need_time;

		loc = findhrrfjob(jobs, quantity, current_time);
	}
	printf("总等待时间:%-8d 总周转时间:%-8d\n", total_waitime, total_roundtime);
	printf("平均等待时间: %4.2f 平均周转时间: %4.2f\n", (float)total_waitime / (quantity), (float)total_roundtime / (quantity));
}
int main()
{
	initial_jobs();
	readJobdata();
	FCFS();
	reset_jinfo();
	SFJschdulejob(jobs, quantity);
	reset_jinfo();
	HRRF(jobs, quantity);
	reset_jinfo();
	HPF(jobs, quantity);
	system("pause");
	return 0;
}

在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值