操作系统_处理器管理_高响应比优先(HRRF)

操作系统_处理器管理_高响应比优先(HRRF)

问题描述:

输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照高响应比优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数)。

输入格式:
第一行输入作业数目,第二行输入作业的名字,第三行输入到达时间,第四行输入服务时间。

输出格式:
按照到达时间从小到大排序,第一行输出作业的名字,第二行输出到达时间,第三行输出服务时间,第四行输出完成时间,第五行输出完成时间,第六行输出带权周转时间。

输入样例:
在这里给出一组输入。
例如:
5
A B C D E
0 1 2 3 4
4 3 4 2 4
输出样例:
在这里给出相应的输出。
例如:
作 业 名:A B C D E
到达时间:0 1 2 3 4
服务时间:4 3 4 2 4
完成时间:4 7 13 9 17
周转时间:4 6 11 6 13
带权周转时间:1.00 2.00 2.75 3.00 3.25

HRRF算法

高相应比优先算法在每次调度作业/进程运行时,都要计算后备作业队列中每个作业的相应比Rp,然后选择Rp_max(选择最大的响应比的作业/进程)
核心在于Rp的计算和比较。

Rp = 响应时间 / 运行时间 = (运行时间 + 等待时间) / 运行时间

代码展示:

由于需要和后备作业/进程比较,因此代码思想和SJF代码有些类型
参照操作系统_进程调度算法(SJF)

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

struct  process{
    char name[16];//名字 
    double come_time; //到达时间 
    double run_time;//运行时间 
    double finish_time;//完成时间 
    double circle_time;//周转时间 
    double weight_circletime;//带权周转时间 
    int  finished;//程序是否被执行(0)为未被执行,反之已经执行 
}P[1024];

int n; // 输入进去n个进程 
//输入 
void Input(){ 
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>P[i].name;
		P[i].finished = 0;//输入进去的程序都是未被执行的 
    }
    for(int i=0;i<n;i++){
        cin>>P[i].come_time;
    }
    for(int i=0;i<n;i++){
        cin>>P[i].run_time;
    }
}
//输出 
void Output(){
    printf("作 业 名:");
    for(int i=0;i<n;i++){
        
		cout<<P[i].name;
		if(i<n-1){
			printf(" "); 
		}
    }
    printf("\n");
    printf("到达时间:");
    for(int i=0;i<n;i++){
        cout<<P[i].come_time;
        	if(i<n-1){
			printf(" "); 
		}
	}
		
    
    printf("\n");
    printf("服务时间:");
    for(int i=0;i<n;i++){
        cout<<P[i].run_time;
        	if(i<n-1){
			printf(" "); 
		}
	}

    printf("\n");
    printf("完成时间:");
    for(int i=0;i<n;i++){
        cout<<P[i].finish_time; 
        	if(i<n-1){
			printf(" "); 
		}
		}
    
    printf("\n");
    printf("周转时间:");
    for(int i=0;i<n;i++){
        cout<<P[i].circle_time;
        	if(i<n-1){
			printf(" "); 
		}
		}
    
    printf("\n");
    printf("带权周转时间:");
    for(int i=0;i<n;i++){
       printf("%.2f",P[i].weight_circletime);
	    if(i < n-1) {
			printf(" ");
			}
    }
    
}
bool cmp(process p1,process p2){     //将到达的进程按照到达时间进行排序 
	    return p1.come_time<p2.come_time;
}
int main(){
	Input();
	sort(P,P+n,cmp);
	double now_time = 0;
	int finished_count = 0;
	int unfinish_pos = 0;
	while(finished_count < n){
		if(now_time<P[unfinish_pos].come_time){ // 对在上一个程序完成前到达的新的程序的到达时间更新给now_time 
			now_time = P[unfinish_pos].come_time; 
		}
		double Max_RP = INT_MIN;
		int pos;
		for(int i= unfinish_pos;(i<n && now_time>= P[i].come_time);i++){
			if(P[i].finished == 1) continue ;
			double RP;
			RP = (now_time - P[i].come_time) / P[i].run_time;
			if(RP > Max_RP){
				Max_RP = RP;
				pos = i;
			}
		}
		 if(pos == unfinish_pos) unfinish_pos = pos + 1;
			now_time +=P[pos].run_time;
			P[pos].finish_time = now_time;
			P[pos].circle_time = now_time - P[pos].come_time;
			P[pos].weight_circletime = P[pos].circle_time / P[pos].run_time;
			P[pos].finished = 1;
			finished_count++;
			
		
	}
	Output();
	return 0;
}

代码中double Max_RP = INT_MIN; 目的是设置一个足够小的数初始化Max_RP,因为RP有可能会计算为0,因此将0赋值给Max_RP会产生错误

测试结果如下:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值