最短作业优先调度算法(SJF算法)的C++实现

题目要求:

在作业调度中,该算法每次从后备作业队列中挑选估计服务时间最短的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。与在进程调度中的原理类似。假设有n项作业位于就绪队列中,这些作业的请求时间用数组requestTimes按照提交时间的先后顺序存储,对应的作业服务时间(也称持续时间)用数组durations存储。当每个作业被完成后,接下来优先选择服务时间(持续时间)短的,如果多个服务时间一样,则优先选择请求时间最先的。采用SJF算法,计算n项作业的平均等待时间。所有要执行的任务的请求时间必须在上一个任务完成的时间内。假设0<= n <= 100。


测试用例:

requestTimes = {0, 2, 4, 5};

durations = {7, 4, 1, 4};

可以理解为一定首先执行第一个任务,请求时间为0,执行了7个时间单位;

接下来在服务时间最短的中选择,显然是任务3,请求时间为4,执行1个时间单位;

再接下来发现2和4这两个任务服务时间一样短,则优先选择请求时间最先的,显然是选择任务2,执行4个时间单位

最后是任务4(并且只有任务4了),请求时间为5,执行4个时间单位

等待时间:任务1是0,任务3是3,任务2是5,任务4是7,所以平均等待时间是4。


int findmin_duration(vector<int> &a,int *b,int end_time, int n)
{
	int min = INT_MAX;
	int pos = 0;
	for (int i = 1; i < n; i++)
	{
		if (a[i] < min && b[i] <= end_time)
		{
			min = a[i];
			pos = i;
		}
	}
	a[pos] = INT_MAX;
	return pos;
}

float average_wait_time(int *requestTimes, int *durations, int n)
{
	vector<int> durate(n,0);
	vector<int> startTime(n, 0);
	vector<int> endTime(n, 0);
	vector<int> waitTime(n, 0);
	int i;
	for (i = 0; i < n; i++)
		durate[i] = durations[i];
	startTime[0] = requestTimes[0];
	endTime[0] = durations[0] + startTime[0];
	waitTime[0] = startTime[0] - requestTimes[0];
	int minIndex = 0;
	int lastIndex = minIndex;
	for (i = 1; i < n; i++)
	{
		minIndex = findmin_duration(durate, requestTimes, endTime[lastIndex], n);
		startTime[minIndex] =  endTime[lastIndex];
		endTime[minIndex] = durations[minIndex] + startTime[minIndex];
		waitTime[minIndex] = startTime[minIndex] - requestTimes[minIndex];
		lastIndex = minIndex;
	}

	int s = 0;
	for (i = 0; i < n; i++)
		s += waitTime[i];
	float avageTime = (float)s / (float)n;
	return avageTime;
}
int main(int argc, char* argv[])
{
	int requestTimes[4] = { 0, 1, 3, 9 };
	int durations[4] = { 2, 1, 7, 5 };
	//int requestTimes[] = { 0, 2, 4, 5 };
	//int durations[] = { 7, 4, 1, 4 };
	cout << average_wait_time(requestTimes, durations, 4) << endl;
	getchar();
	return 0;
}


好的,让我向您解释一下如何使用C结构体来实现SJF作业优先调度算法。 首先,我们需要定义一个结构体来表示每个作业的信息,包括作业的名称、到达时间服务时间和等待时间。结构体可以定义如下: ```c struct job { char name[10]; int arrive_time; int service_time; int waiting_time; }; ``` 然后,我们可以创建一个作业数组来存储所有的作业信息,并按照到达时间的顺序对它们进行排序。这可以通过一个输入函数来实现,如下所示: ```c void input_jobs(struct job jobs[], int n) { int i; for (i = 0; i < n; i++) { printf("请输入第 %d 个作业的名称、到达时间服务时间: ", i + 1); scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time); } // 按照到达时间排序 qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time); } ``` 在这个函数中,我们让用户逐个输入每个作业的名称、到达时间服务时间,并按照到达时间进行排序。我们还需要定义一个函数 cmp_by_arrive_time() 来比较两个作业的到达时间: ```c int cmp_by_arrive_time(const void *a, const void *b) { const struct job *j1 = (const struct job *)a; const struct job *j2 = (const struct job *)b; return j1->arrive_time - j2->arrive_time; } ``` 接下来,我们可以实现SJF作业优先调度算法。该算法基于服务时间来决定下一个要执行的作业。我们使用一个指针来指向当前时间点正在执行的作业,并将其初始化为 NULL。然后,我们遍历作业数组,如果遇到了一个到达时间小于等于当前时间并且服务时间比当前作业更短的作业,就将当前指针指向该作业。最后,我们更新当前时间,将等待时间和运行时间都累加到总和中,并输出结果。 完整的代码如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct job { char name[10]; int arrive_time; int service_time; int waiting_time; }; void input_jobs(struct job jobs[], int n); int cmp_by_arrive_time(const void *a, const void *b); int main() { int n, i, current_time = 0, total_waiting_time = 0, total_service_time = 0; struct job *current_job = NULL; struct job *jobs; printf("请输入作业个数: "); scanf("%d", &n); jobs = malloc(n * sizeof(struct job)); input_jobs(jobs, n); for (i = 0; i < n; i++) { if (current_job != NULL && current_time < jobs[i].arrive_time && total_service_time != 0) { // 暂停执行当前作业,更新等待时间和当前时间 current_job->waiting_time += (jobs[i].arrive_time - current_time); total_waiting_time += (jobs[i].arrive_time - current_time); current_time = jobs[i].arrive_time; } if (current_job == NULL || jobs[i].service_time < current_job->service_time) { // 切换到更短的作业 current_job = &jobs[i]; } current_job->service_time--; total_service_time++; if (current_job->service_time == 0) { // 当前作业执行完毕,更新当前时间 current_time += 1; current_job = NULL; } } printf("\n作业执行结果如下:\n"); for (i = 0; i < n; i++) { printf("作业名称:%s,等待时间:%d\n", jobs[i].name, jobs[i].waiting_time); } printf("平均等待时间:%f\n", (float)total_waiting_time / n); free(jobs); return 0; } void input_jobs(struct job jobs[], int n) { int i; for (i = 0; i < n; i++) { printf("请输入第 %d 个作业的名称、到达时间服务时间: ", i + 1); scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time); } // 按照到达时间排序 qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time); } int cmp_by_arrive_time(const void *a, const void *b) { const struct job *j1 = (const struct job *)a; const struct job *j2 = (const struct job *)b; return j1->arrive_time - j2->arrive_time; } ``` 希望这可以帮助您更好地理解如何使用C结构体来实现SJF作业优先调度算法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值