高响应比优先调度算法 java_操作系统高响应比优先模拟算法

本文介绍了如何模拟实现操作系统的高响应比优先(HRRN)调度算法,结合了FCFS和SJF算法的特点,考虑作业的执行时间和等待时间。通过Java代码展示了数据生成和调度过程,包括周转时间、带权周转时间等概念,并提供了数据生成的C++代码示例。
摘要由CSDN通过智能技术生成

这学期刚开始学习操作系统,收到一个作业,百度关于高响应比优先(HRRN,Highest Response Ratio Next)的CPU进程调度模拟算法,基本思想:短作业优先调度算法 + 动态优先权机制;既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务(FCFS,First Come First Served)和最短作业优先(SJF,Shortest Job First)两种算法的特点。

之后经过多番揣摩... ...决定界面用命令行算了,反正啥也不会...

关于响应比:

RR =  (预计运行时间 + 等待时间) / 预计运行时间 = 1 + 等待时间/预计运行时间;

响应比高者优先进行调度;

关于要求中的周转时间、带权周转时间、平均周转时间和平均带权周转时间:

周转时间 =(作业完成的时间 - 作业提交时间);

带权周转时间 = 作业周转时间 / 作业运行时间;

平均周转时间 = (周转时间1+周转时间2+...+周转时间n)/ n;

平均带权周转时间 = (带权周转时间1+带权周转时间2+...+带权周转时间n)/ n;

开始,用vector存储提交的作业结构体指针,自己设置一个系统时间,毕竟模拟不可能时间流速一毛一样,接下来就是毫无技术含量的选择了,关于测试数据,想了想好难输,还得自己编,于是用随机函数产生数据;再在主函数参数中提供一个传递生成数据数量的参数。

说到这里得说一下,关于java老师(没错,java老师)说的关于main()的一些情况:

1 int main(int argc, char** argv){ argc为参数个数, argv为接下来传的参数

2 ...3 return 0;4 }

比如在命令行中调用该函数,***.exe 100,此时有两个参数,一个为"***.exe", 另一个就是"100"了,分别在argv[0]和argv[1]中。

首先是数据生成,用为要求格式,所以要小处理一下,感觉这种方法可以在刷ACM题被题目玄学时使用,一个为标准代码,一个为自己的代码,目前未试过:

1 #include "bits/stdc++.h"

2 using namespacestd;3

4 int ch_to_int(char*s){5 int ans = 0, len =strlen(s);6 for(int i = 0; i < len; i++) ans = ans*10 + s[i]-'0';7 returnans;8 }9 int main(int argc, char**argv){10 int k, N, tj/*0~23*/, ys/*0~59*/, tmp;11 freopen("test.txt", "w", stdout);12 srand(time(NULL)); //以系统时间为种子生成真正的随机数

13 N = k = ch_to_int(argv[1]);14 while(k--){15 tmp = (rand() + 24)%24 * 100 + (rand() + 6)%6*10 + (rand() + 10)%10;16 printf("%04d %d\n", tmp, (rand() + N)%N + 1);17 }18 return 0;19 }

调度算法:

1 #include "bits/stdc++.h"

2 #include "windows.h"

3 using namespacestd;4 typedef long longll;5

6 //(所有时间以分钟为单位存储,需要时转化)

7

8 ll systemTime; //自定义系统当前时间

9

10 structTask{11 int Tij; //提交时间

12 int Ysi; //预计运行时间

13 ll waitingTime; //等待时间

14 int id; //作业号

15

16 ll prior(){17 return 1 + waitingTime*1.0/Ysi;18 }19

20 Task(int T, intY){21 Tij =T;22 Ysi =Y;23 waitingTime = 0;24 }25 ll aroundTime(){26 return systemTime - Tij +Ysi;27 }28

29 doublepriorTime(){30 return aroundTime()*1.0/Ysi;31 }32 void disp(intord){33 printf("--调度次序: %d --作业号: %04d --调度时间:%02d%02d --周转时间: %d min(s) --带权周转时间%.2f ...\n",34 ord, id, (systemTime/100 + systemTime/60)%24, systemTime%60, aroundTime(), priorTime());35 }36 };37

38 int cmp1(const Task* a, const Task*b){39 return (a->Tij) < (b->Tij);40 }41

42 intmain(){43 vector taskArr; ///以不定长数组存储作业队列

44

45 intTij, Ysi, order;46 ll ave_aroundTime = 0;47 double ave_prior_aroundTime = 0;48

49 freopen("test.txt", "r", stdin);50 system(".\\生成测试数据.exe 1024"); //调用测试数据生成程序

51

52 while(cin>>Tij>>Ysi) taskArr.push_back(new Task(Tij%100 + Tij/100*60, Ysi));53

54 按提交时间进行排序并编号

55 sort(taskArr.begin(), taskArr.end(), cmp1);56 std::vector::iterator pos;57 for(pos = taskArr.begin(); pos != taskArr.end(); pos++){58 (*pos)->id = pos -taskArr.begin();59 }60

61 std::vector::iterator willRun; //指向即将运行程序

62 systemTime = (*taskArr.begin())->Tij; ///将系统当前时间设置为最早提交的作业时间

63 order = -1;64 while(!taskArr.empty()){65 bool flag = false; ///判定是否有新的程序提交

66 willRun =taskArr.begin();67 for(pos = taskArr.begin(); pos != taskArr.end(); pos++){68 if((*pos)->Tij > systemTime) break;69 willRun = (*willRun)->prior() < (*pos)->prior() ?pos : willRun;70 flag = true;71 }72 if(!flag){73 willRun =taskArr.begin();74 systemTime = (*willRun)->Tij;75 }76

77 (*willRun)->disp(++order);78

79 ave_aroundTime += (*willRun)->aroundTime(); //总周转

80 ave_prior_aroundTime += (*willRun)->priorTime(); //总带权周转

81

82 for(pos = taskArr.begin(); pos != taskArr.end(); pos++){ //更新等待时间

83 if((*pos)->Tij waitingTime += (*willRun)->Ysi;85 }86 }87

88 systemTime += (*willRun)->Ysi; //系统时间增加

89

90 taskArr.erase(willRun); //结束则删除91

92 //Sleep(10);

93 }94 cout<

97 return 0;98 }

加油( ̄▽ ̄)"

高响应比优先算法是一种常用的进程调度算法,它可以使得响应时间更短,提高系统的性能。在Java中,可以通过实现一个优先级队列来实现最高响应比优先算法。具体实现可以参考以下代码: ``` import java.util.*; public class HRRN { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入进程数:"); int n = sc.nextInt(); int[] pid = new int[n]; int[] at = new int[n]; int[] bt = new int[n]; int[] ct = new int[n]; int[] tat = new int[n]; int[] wt = new int[n]; double[] rr = new double[n]; boolean[] vis = new boolean[n]; PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { if (rr[o1] > rr[o2]) { return -1; } else if (rr[o1] < rr[o2]) { return 1; } else { return 0; } } }); for (int i = 0; i < n; i++) { System.out.print("请输入第" + (i + 1) + "个进程的到达时间和服务时间:"); at[i] = sc.nextInt(); bt[i] = sc.nextInt(); pid[i] = i + 1; vis[i] = false; } int time = 0; int cnt = 0; while (cnt < n) { for (int i = 0; i < n; i++) { if (at[i] <= time && !vis[i]) { rr[i] = (time - at[i] + bt[i]) * 1.0 / bt[i]; pq.add(i); } } if (pq.isEmpty()) { time++; continue; } int cur = pq.poll(); vis[cur] = true; ct[cur] = time + bt[cur]; tat[cur] = ct[cur] - at[cur]; wt[cur] = tat[cur] - bt[cur]; cnt++; time = ct[cur]; } System.out.println("进程\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间"); for (int i = 0; i < n; i++) { System.out.println(pid[i] + "\t" + at[i] + "\t\t" + bt[i] + "\t\t" + ct[i] + "\t\t" + tat[i] + "\t\t" + String.format("%.2f", (wt[i] * 1.0 / tat[i]))); } } } ``` 这段代码实现了最高响应比优先算法,通过输入进程的到达时间和服务时间,计算出每个进程的完成时间、周转时间和带权周转时间,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值