高响应比优先调度算法 java_操作系统高响应比优先模拟算法
這學(xué)期剛開始學(xué)習(xí)操作系統(tǒng),收到一個作業(yè),百度關(guān)于高響應(yīng)比優(yōu)先(HRRN,Highest?Response?Ratio?Next)的CPU進(jìn)程調(diào)度模擬算法,基本思想:短作業(yè)優(yōu)先調(diào)度算法 + 動態(tài)優(yōu)先權(quán)機(jī)制;既考慮作業(yè)的執(zhí)行時間也考慮作業(yè)的等待時間,綜合了先來先服務(wù)(FCFS,First Come First Served)和最短作業(yè)優(yōu)先(SJF,Shortest Job First)兩種算法的特點(diǎn)。
之后經(jīng)過多番揣摩... ...決定界面用命令行算了,反正啥也不會...
關(guān)于響應(yīng)比:
RR =? (預(yù)計運(yùn)行時間 + 等待時間) / 預(yù)計運(yùn)行時間 = 1 + 等待時間/預(yù)計運(yùn)行時間;
響應(yīng)比高者優(yōu)先進(jìn)行調(diào)度;
關(guān)于要求中的周轉(zhuǎn)時間、帶權(quán)周轉(zhuǎn)時間、平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間:
周轉(zhuǎn)時間 =(作業(yè)完成的時間 - 作業(yè)提交時間);
帶權(quán)周轉(zhuǎn)時間 = 作業(yè)周轉(zhuǎn)時間 / 作業(yè)運(yùn)行時間;
平均周轉(zhuǎn)時間 = (周轉(zhuǎn)時間1+周轉(zhuǎn)時間2+...+周轉(zhuǎn)時間n)/ n;
平均帶權(quán)周轉(zhuǎn)時間 =?(帶權(quán)周轉(zhuǎn)時間1+帶權(quán)周轉(zhuǎn)時間2+...+帶權(quán)周轉(zhuǎn)時間n)/ n;
開始,用vector存儲提交的作業(yè)結(jié)構(gòu)體指針,自己設(shè)置一個系統(tǒng)時間,畢竟模擬不可能時間流速一毛一樣,接下來就是毫無技術(shù)含量的選擇了,關(guān)于測試數(shù)據(jù),想了想好難輸,還得自己編,于是用隨機(jī)函數(shù)產(chǎn)生數(shù)據(jù);再在主函數(shù)參數(shù)中提供一個傳遞生成數(shù)據(jù)數(shù)量的參數(shù)。
說到這里得說一下,關(guān)于java老師(沒錯,java老師)說的關(guān)于main()的一些情況:
1 int main(int argc, char** argv){ argc為參數(shù)個數(shù), argv為接下來傳的參數(shù)
2 ...3 return 0;4 }
比如在命令行中調(diào)用該函數(shù),***.exe 100,此時有兩個參數(shù),一個為"***.exe", 另一個就是"100"了,分別在argv[0]和argv[1]中。
首先是數(shù)據(jù)生成,用為要求格式,所以要小處理一下,感覺這種方法可以在刷ACM題被題目玄學(xué)時使用,一個為標(biāo)準(zhǔn)代碼,一個為自己的代碼,目前未試過:
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)); //以系統(tǒng)時間為種子生成真正的隨機(jī)數(shù)
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 }
調(diào)度算法:
1 #include "bits/stdc++.h"
2 #include "windows.h"
3 using namespacestd;4 typedef long longll;5
6 //(所有時間以分鐘為單位存儲,需要時轉(zhuǎn)化)
7
8 ll systemTime; //自定義系統(tǒng)當(dāng)前時間
9
10 structTask{11 int Tij; //提交時間
12 int Ysi; //預(yù)計運(yùn)行時間
13 ll waitingTime; //等待時間
14 int id; //作業(yè)號
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("--調(diào)度次序: %d --作業(yè)號: %04d --調(diào)度時間:%02d%02d --周轉(zhuǎn)時間: %d min(s) --帶權(quán)周轉(zhuǎn)時間%.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; ///以不定長數(shù)組存儲作業(yè)隊(duì)列
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(".\\生成測試數(shù)據(jù).exe 1024"); //調(diào)用測試數(shù)據(jù)生成程序
51
52 while(cin>>Tij>>Ysi) taskArr.push_back(new Task(Tij%100 + Tij/100*60, Ysi));53
54 按提交時間進(jìn)行排序并編號
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; //指向即將運(yùn)行程序
62 systemTime = (*taskArr.begin())->Tij; ///將系統(tǒng)當(dāng)前時間設(shè)置為最早提交的作業(yè)時間
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(); //總周轉(zhuǎn)
80 ave_prior_aroundTime += (*willRun)->priorTime(); //總帶權(quán)周轉(zhuǎn)
81
82 for(pos = taskArr.begin(); pos != taskArr.end(); pos++){ //更新等待時間
83 if((*pos)->Tij waitingTime += (*willRun)->Ysi;85 }86 }87
88 systemTime += (*willRun)->Ysi; //系統(tǒng)時間增加
89
90 taskArr.erase(willRun); //結(jié)束則刪除91
92 //Sleep(10);
93 }94 cout<
97 return 0;98 }
加油( ̄▽ ̄)"
總結(jié)
以上是生活随笔為你收集整理的高响应比优先调度算法 java_操作系统高响应比优先模拟算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1985-2020年全国各省一二三产业就
- 下一篇: Windows 10怎样不利用第三方付费