日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

高响应比优先调度算法的模拟(非抢占式C++)

發(fā)布時(shí)間:2023/12/10 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高响应比优先调度算法的模拟(非抢占式C++) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

設(shè)置參數(shù)

設(shè)置了四個(gè)作業(yè)進(jìn)行實(shí)驗(yàn),可以在init()函數(shù)中動(dòng)態(tài)修改

根據(jù)計(jì)算,根據(jù)高響應(yīng)比優(yōu)先調(diào)度算法,得出作業(yè)的調(diào)度流程圖

運(yùn)行程序,得出程序運(yùn)行結(jié)果

通過對比可以發(fā)現(xiàn),程序運(yùn)行正確,并且程序還可以輸出,每一秒運(yùn)行的狀態(tài),參數(shù)包括正在運(yùn)行的進(jìn)程名,開始運(yùn)行時(shí)間,及當(dāng)前就緒隊(duì)列中的進(jìn)程名以及它的響應(yīng)時(shí)間

流程圖

?源程序

#include<iostream>using namespace std;const int N = 20; int h[N], hh, tt = -1;//用數(shù)組模擬隊(duì)列,就緒隊(duì)列, 存放的是進(jìn)程的下標(biāo) struct Process {string name;//作業(yè)名int arriveTime;//到達(dá)時(shí)間int runTime;//運(yùn)行時(shí)間bool st = false;//是否已經(jīng)運(yùn)行完畢, false為沒運(yùn)行完int startTime = 0x3f3f3f3f;//開始運(yùn)行時(shí)間int endTime = 0x3f3f3f3f;//結(jié)束運(yùn)行時(shí)間 double rP = 1;//響應(yīng)比 }process[N];//N個(gè)作業(yè) void init() {//初始化四個(gè)作業(yè) process[1].arriveTime = 0, process[1].runTime = 4, process[1].name = "process 1";process[2].arriveTime = 2, process[2].runTime = 2, process[2].name = "process 2";process[3].arriveTime = 1, process[3].runTime = 3, process[3].name = "process 3";process[4].arriveTime = 4, process[4].runTime = 1, process[4].name = "process 4"; }void arriveCheck(int syTime)//每秒鐘都check一下有沒有新進(jìn)程來 {for(int i = 1; i <= 4; i ++)if(!process[i].st && process[i].arriveTime <= syTime)//當(dāng)作業(yè)到達(dá),進(jìn)入就緒隊(duì)列{h[++ tt] = i; process[i].st = true;//標(biāo)記已經(jīng)到達(dá) } }void print(int i, int t)//打印每秒的輸出 {cout << "當(dāng)前時(shí)間是 " << i << " 正在運(yùn)行的進(jìn)程是 " << process[t].name << " 開始運(yùn)行時(shí)間為 " << process[t].startTime << endl;if(tt >= hh){cout << "當(dāng)前就緒隊(duì)列中的進(jìn)程為 ";for(int j = hh; j <= tt; j ++)cout << process[h[j]].name << " " << "它的響應(yīng)比為" << process[h[j]].rP << " ";cout << endl << endl;}else cout << "當(dāng)前就緒隊(duì)列為空" << endl << endl; } void printResult()//打印最終結(jié)果 {cout << "高響應(yīng)比優(yōu)先調(diào)度算法已經(jīng)全部運(yùn)行完畢" << endl;cout << "作業(yè)名 " << "到達(dá)時(shí)間 " << "開始運(yùn)行時(shí)間 " << "結(jié)束運(yùn)行時(shí)間 " << "周轉(zhuǎn)時(shí)間 " << endl;double sum = 0;//計(jì)算平均周轉(zhuǎn)時(shí)間 for(int i = 1; i <= 4; i ++){int t = process[i].endTime - process[i].arriveTime;//周轉(zhuǎn)時(shí)間sum += t; cout << process[i].name << " " << process[i].arriveTime << " " << process[i].startTime << " " << process[i].endTime << " " << t << endl;}cout << "平均周轉(zhuǎn)時(shí)間為 " << sum / 4 << endl; }void update_Rp(int syTime)//每秒鐘都更新一次響應(yīng)比Rp {for(int j = hh; j <= tt; j ++) {double Rj = 1 + (syTime - process[h[j]].arriveTime) / (double)process[h[j]].runTime;process[h[j]].rP = Rj; } }int main() {init();int syTime = 0;//系統(tǒng)時(shí)間 int t = 0;//當(dāng)前正在運(yùn)行的進(jìn)程int n = 4;//總作業(yè)數(shù) while(n){arriveCheck(syTime);if(!t)//初始化,第一個(gè)進(jìn)入的作業(yè) {t = h[hh ++];process[t].startTime = syTime;//開始運(yùn)行時(shí)間 process[t].st = true;} update_Rp(syTime);print(syTime, t);//顯示信息 if(process[t].runTime <= 0)//當(dāng)前進(jìn)程做完,調(diào)入就緒序列的下一個(gè){process[t].endTime = syTime;//上個(gè)作業(yè)結(jié)束運(yùn)行時(shí)間if(tt > hh)//就緒隊(duì)列中有兩個(gè)以上的作業(yè),排序后,調(diào)用高響應(yīng)比的那個(gè) {int i = hh;//響應(yīng)比最高的作業(yè)的下標(biāo)for(int j = hh + 1; j <= tt; j ++)//找到響應(yīng)比最高的作業(yè)的下標(biāo) 響應(yīng)比計(jì)算公式 = 1 + 等待時(shí)間/運(yùn)行時(shí)間 {double Ri = 1 + (syTime - process[h[i]].arriveTime) / (double)process[h[i]].runTime;//當(dāng)前作業(yè)的響應(yīng)比 = 1 + 等待時(shí)間/運(yùn)行時(shí)間 double Rj = 1 + (syTime - process[h[j]].arriveTime) / (double)process[h[j]].runTime;//當(dāng)前作業(yè)的響應(yīng)比 = 1 + 等待時(shí)間/運(yùn)行時(shí)間 process[h[i]].rP = Ri;process[h[j]].rP = Rj;if(Ri < Rj) i = j;}t = h[i];//當(dāng)前作業(yè)在process中的下標(biāo) if(i == tt) tt --;//利用覆蓋法,把該作業(yè)從就緒隊(duì)列中刪除,因?yàn)樗呀?jīng)在做了 else{for(int j = i + 1; j <= tt; j ++) h[j - 1] = h[j];tt --;}}else t = h[hh ++];//后備隊(duì)列中只有一個(gè)作業(yè)時(shí)直接調(diào)度 process[t].startTime = syTime;//該作業(yè)開始運(yùn)行時(shí)間 n --; }syTime ++;process[t].runTime --;}printResult();return 0; }

總結(jié)

以上是生活随笔為你收集整理的高响应比优先调度算法的模拟(非抢占式C++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。