高响应比优先调度算法的模拟(非抢占式C++)
生活随笔
收集整理的這篇文章主要介紹了
高响应比优先调度算法的模拟(非抢占式C++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
設置參數
設置了四個作業進行實驗,可以在init()函數中動態修改
根據計算,根據高響應比優先調度算法,得出作業的調度流程圖
運行程序,得出程序運行結果
通過對比可以發現,程序運行正確,并且程序還可以輸出,每一秒運行的狀態,參數包括正在運行的進程名,開始運行時間,及當前就緒隊列中的進程名以及它的響應時間
流程圖
?源程序
#include<iostream>using namespace std;const int N = 20; int h[N], hh, tt = -1;//用數組模擬隊列,就緒隊列, 存放的是進程的下標 struct Process {string name;//作業名int arriveTime;//到達時間int runTime;//運行時間bool st = false;//是否已經運行完畢, false為沒運行完int startTime = 0x3f3f3f3f;//開始運行時間int endTime = 0x3f3f3f3f;//結束運行時間 double rP = 1;//響應比 }process[N];//N個作業 void init() {//初始化四個作業 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一下有沒有新進程來 {for(int i = 1; i <= 4; i ++)if(!process[i].st && process[i].arriveTime <= syTime)//當作業到達,進入就緒隊列{h[++ tt] = i; process[i].st = true;//標記已經到達 } }void print(int i, int t)//打印每秒的輸出 {cout << "當前時間是 " << i << " 正在運行的進程是 " << process[t].name << " 開始運行時間為 " << process[t].startTime << endl;if(tt >= hh){cout << "當前就緒隊列中的進程為 ";for(int j = hh; j <= tt; j ++)cout << process[h[j]].name << " " << "它的響應比為" << process[h[j]].rP << " ";cout << endl << endl;}else cout << "當前就緒隊列為空" << endl << endl; } void printResult()//打印最終結果 {cout << "高響應比優先調度算法已經全部運行完畢" << endl;cout << "作業名 " << "到達時間 " << "開始運行時間 " << "結束運行時間 " << "周轉時間 " << endl;double sum = 0;//計算平均周轉時間 for(int i = 1; i <= 4; i ++){int t = process[i].endTime - process[i].arriveTime;//周轉時間sum += t; cout << process[i].name << " " << process[i].arriveTime << " " << process[i].startTime << " " << process[i].endTime << " " << t << endl;}cout << "平均周轉時間為 " << sum / 4 << endl; }void update_Rp(int syTime)//每秒鐘都更新一次響應比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;//系統時間 int t = 0;//當前正在運行的進程int n = 4;//總作業數 while(n){arriveCheck(syTime);if(!t)//初始化,第一個進入的作業 {t = h[hh ++];process[t].startTime = syTime;//開始運行時間 process[t].st = true;} update_Rp(syTime);print(syTime, t);//顯示信息 if(process[t].runTime <= 0)//當前進程做完,調入就緒序列的下一個{process[t].endTime = syTime;//上個作業結束運行時間if(tt > hh)//就緒隊列中有兩個以上的作業,排序后,調用高響應比的那個 {int i = hh;//響應比最高的作業的下標for(int j = hh + 1; j <= tt; j ++)//找到響應比最高的作業的下標 響應比計算公式 = 1 + 等待時間/運行時間 {double Ri = 1 + (syTime - process[h[i]].arriveTime) / (double)process[h[i]].runTime;//當前作業的響應比 = 1 + 等待時間/運行時間 double Rj = 1 + (syTime - process[h[j]].arriveTime) / (double)process[h[j]].runTime;//當前作業的響應比 = 1 + 等待時間/運行時間 process[h[i]].rP = Ri;process[h[j]].rP = Rj;if(Ri < Rj) i = j;}t = h[i];//當前作業在process中的下標 if(i == tt) tt --;//利用覆蓋法,把該作業從就緒隊列中刪除,因為它已經在做了 else{for(int j = i + 1; j <= tt; j ++) h[j - 1] = h[j];tt --;}}else t = h[hh ++];//后備隊列中只有一個作業時直接調度 process[t].startTime = syTime;//該作業開始運行時間 n --; }syTime ++;process[t].runTime --;}printResult();return 0; }總結
以上是生活随笔為你收集整理的高响应比优先调度算法的模拟(非抢占式C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机本地用户删除后怎么恢复,Defau
- 下一篇: mysql的student是什么意思_复