进程调度(优先级调度)-----编程模拟实现HRRN调度算法。

实验目的:

深入理解进程及作业的调度原理,掌握FCFS调度算法、SJF调度算法、PSA调度算法、HRRN调度算法。

 编写C语言程序,实现高响应比优先调度算法。

要求输入作业号、提交时刻及运行时间,输出调度顺序。

作业号

提交时刻(时)

运行时间(小时)

1

8:00

2.0

2

8:50

0.5

3

9:00

0.1

4

9:50

0.2

编程模拟实现HRRN调度算法。

代码如下:

#include<bits/stdc++.h>
using namespace std;


const int N = 1111;
int n, cnt = 1;
float s;	//当前时间
struct work
{
	int name;	//作业号
	float sumit_time;	//提交时刻
	float run_time;	//运行时间
	float s_time;	//开始时间
	float e_time;	//结束时间

	int st;	//标记运行顺序;
	float R;	//响应比

}w[N];

bool cmp1(work a, work b)
{
	return a.R < b.R;
}
bool cmp2(work a, work b)
{
	return a.st < b.st;
}


void RR()
{
	for (int i = 0; i <= n; i++)
	{
		if (!w[i].st && s >= w[i].sumit_time)
			w[i].R = (s - w[i].sumit_time + w[i].run_time) / w[i].run_time;
	}
}

void HRRN()
{
	for (int i = 1; i < n; i++)
	{
		RR();
		sort(w + 1, w + n + 1, cmp1);
		for (int j = n; j > 0; j--)
		{
			if (!w[j].st)
			{
				w[j].st = cnt++;
				w[j].s_time = s;
				w[j].e_time = s + w[n].run_time;
				s = w[j].e_time;
				break;
			}
		}
	}

	sort(w + 1, w + n + 1, cmp2);
	printf("调度顺序为:"); 
	for (int i = 1; i <= n; i++)
		printf("%d  ", w[i].name);

}

int  main()
{
	int mintime = 111, f;
	printf("请问共有几个作业:");
	scanf("%d", &n);
	printf("作业号	提交时刻(时)	运行时间(小时)\n");
	for (int i = 1; i <= n; i++)
	{
		w[i].st = 0;
		int h, m;
		scanf("%d%d:%d%f", &w[i].name, &h, &m, &w[i].run_time);		
		w[i].sumit_time =  h + 0.01 * m * 5 / 3;    //时间转换
        //找出第一个作业
		if (w[i].sumit_time < mintime)	f = i, mintime = w[i].sumit_time;
		else if (w[i].sumit_time == mintime && w[i].run_time < w[f].run_time)	f = i;
	}

	//第一个作业
	w[f].st = cnt++;
	w[f].s_time = w[f].sumit_time;
	w[f].e_time = w[f].sumit_time + w[f].run_time;
	s = w[f].e_time;
	HRRN();
	
	return 0;
}

结果截图:

在此代基础上进行修改,也可输出每个作业的周转时间

若有错误,大佬们请指出,谢谢

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您编写一个简单的C程序模拟优先级调度法进行进程调度。以下是代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_PROCESSES 10 // 最大进程数 // 进程结构体 typedef struct { int pid; // 进程ID int burst_time; // 进程的CPU执行时间 int priority; // 进程的优先级 } process; int main() { int i, j, time = 0, num_processes; process p[MAX_PROCESSES], *queue[MAX_PROCESSES]; printf("请输入进程数:"); scanf("%d", &num_processes); // 输入每个进程的burst_time和priority for (i = 0; i < num_processes; i++) { printf("请输入进程 %d 的CPU执行时间和优先级(数字越小优先级越高):", i + 1); scanf("%d%d", &p[i].burst_time, &p[i].priority); p[i].pid = i + 1; queue[i] = &p[i]; } // 优先级调度算法 for (i = 0; i < num_processes; i++) { int max_priority = 1000, max_priority_index = -1; for (j = 0; j < num_processes; j++) { if (queue[j] != NULL && queue[j]->priority < max_priority) { max_priority = queue[j]->priority; max_priority_index = j; } } // 执行优先级最高的进程 printf("当前时间:%d,进程 %d 开始执行\n", time, queue[max_priority_index]->pid); time += queue[max_priority_index]->burst_time; printf("当前时间:%d,进程 %d 执行完毕\n", time, queue[max_priority_index]->pid); queue[max_priority_index] = NULL; } return 0; } ``` 在该程序中,同样使用了一个进程结构体来存储每个进程的信息,包括进程ID、CPU执行时间和优先级。使用一个指针队列来模拟就绪队列,将每个进程的指针存入队列中。在优先级调度算法中,每次从队列中找到优先级最高的进程执行,执行完毕后将该进程从队列中移除。在本程序中,优先级越小表示优先级越高。 希望这个程序能够帮助您理解优先级调度算法实现过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码不会敲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值