1. 算法性質
HRRN算法既考慮了作業的等待時間,又考慮作業的運行時間,因此既照顧了短作業,又不致使長作業的等待時間過長,從而改善了處理機調度的性能。
2. 實現方法
我們為每個作業引入一個動態優先級,即優先級會隨着時間的增加而動態增加,這樣使得長作業的優先級在等待期間不斷地增加,等到足夠時間后,必然有機會獲得處理機。
優先級算法描述為: 優先權(Rp) = (等待時間 + 要求服務時間)/ 要求服務時間
周轉時間:周轉時間(WT) = 作業完成時間 - 作業到達時間
帶權周轉時間:帶權周轉時間(WWT) = 周轉時間 / 服務時間
平均周轉時間:平均周轉時間(AWT) = 作業周轉總時間 / 作業個數
平均帶權周轉時間:平均帶權周轉時間(AWWT) = 帶權周轉總時間 / 作業個數
3. 算法優點
- 如果作業的等待時間相同,則要求服務的時間越短,其優先級越高,因而類似於SJF算法,有利於短作業。
- 當要求服務的時間相同時,作業的優先權又決定於其等待時間,因而有類似於FCFS算法。
- 對於長作業的優先級,可以隨等待時間增加而提高,當其等待時間足夠長時,也可以獲得處理機。
4. 實現代碼
4.1 HRRN實現函數
1 //HRRN高相應比優先級調度算法 2 void HRRN( vector<int> T, vector<double> S, vector<int> &FT, vector<int> &WT 3 , vector<double> &WWT){ 4 int CurTime = 0, temp = 0, length = T.size(); 5 vector<bool> Finished(length, 1); 6 vector<double> Rp(length, 0); //優先級 7 for(int i = 0; i < length; i ++){ 8 //迭代計算未進行進程的全部優先級 9 for( int i = 0; i < length; i ++){ 10 if( Finished[i] ){ 11 Rp[i] = ( abs(T[i] - CurTime) + S[i] ) / S[i]; 12 if(Rp[i] > Rp[temp]) 13 temp = i; //尋找最高優先級 14 } 15 } 16 //輸出當前時間進程狀態 17 while( CurTime < T[temp] ){ 18 printf( "Time %d : No Program is Running.\n", CurTime ); 19 CurTime ++; 20 } 21 for(int t = 1; t <= S[temp]; t ++){ 22 CurTime += 1; 23 printf( "Time %d : Program %d is Running.\n",CurTime,temp ); 24 } 25 printf( "Time %d : Program %d is already done.\n",CurTime + 1,temp ); 26 FT[temp] = CurTime; WT[temp] = CurTime - T[temp]; WWT[temp] = WT[temp] / S[temp]; 27 //完成該進程后使其初始化。 28 Finished[temp] = 0; Rp[temp] = 0; 29 } 30 }
4.2 主函數
1 int main() 2 { 3 vector<int> ArrivalTime; 4 vector<double> ServiceTime; 5 vector<int> PServiceTime; 6 vector<int> FinishTime(N,0); 7 vector<int> WholeTime(N,0); 8 vector<double> WeightWholeTime(N,0); 9 10 _init_project(ArrivalTime, ServiceTime); //初始化函數 11 HRRN(ArrivalTime, ServiceTime, FinishTime, WholeTime, WeightWholeTime); 12 }