操作系統 HRRN高響應比優先級調度算法(C++實現)


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM