多優先級隊列調度算法

 

一、

多優先級隊列調度算法的描述

該算法有多個隊列,同一個隊列中的進程優先級相同,不同隊列中進程優先級不同;最高優先級上的進程運行1個時間片,次高優先級上的進程運行2個時間片,再下一級運行4個時間片,依此類推;每次從隊列頭開始運行進程,每當一個進程在一個優先級隊列中用完它的時間片後,就移到隊列的尾部;只有當高優先級隊列爲空時纔會從不爲空的低優先級隊列中選擇進程運行;在低優先級隊列中等待時間過長的進程,將移入高優先級隊列。

二、多優先級隊列數據結構的定義

多優先級隊列數據結構的定義

進程數據結構的定義

class MultiPriorityQueueSchedule{

private:

       MYPROCESS MultiPriorityQueue[QUEUESIZE];

private:

       void        MPQSFreeProcess(MYPROCESS);

       MYPROCESS MPQSSelectProcess();

       void        MPQSRunProcess(MYPROCESS);

       void        MPQSGoAfter(MYPROCESS);//到隊列尾

       void        MPQSPriorityScheduling();//優先級調度

public:

       MultiPriorityQueueSchedule();

       bool        MPQSAppendProcess(MYPROCESS);

       void        MPQSExecute();

       void        MPQSDisplayQueue(ofstream&);

};

typedef struct MyProcess

{

       char*      MyProcessname;

       int           CreateTime;

       int           LastExecTime;

       int           JobWeight;

       int           EstimateUsedTime;

       int           Priority;

       MyProcess *next;

}* MYPROCESS;

其他函數:

MYPROCESS CreateMyProcess(char* name, int JW, int Prio);  //創建進程

int EstimateRunTime(int JW);                            //估計進程運行時間

void BurstTime(int st);                                  //SYSTIME增加

void PriorityScheduling(MYPROCESS);                   //調整進程優先級

三、Select方法

1)  從高優先級隊列到低優先級隊列,當高優先級隊列爲空時才進入低優先級隊列,否則跳到2)。當所有隊列爲空時,跳到4)。

2)  選擇此優先級隊列的頭一個進程運行,進程運行完它的時間片後,把此進程放到此優先級隊列的尾部,跳到3)。

3)  調整所有進程的優先級,跳到1)。

4)  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

四、編程測試

根據上述內容進行編程,運行程序截圖如下:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

1:動態多優先級調度的過程圖

 

2:靜態多優先級隊列和動態多優先級隊列的比較

       附錄中展示了程序中的類、函數和一些變量的定義。

 

附錄

  1. /*MultiPriorityQueue.h*/
  2. /*Power by Keamou@CS@CITS@NKU*/
  3. #include <string.h>
  4. #include <math.h>
  5. #define QUEUESIZE 32  //隊列大小
  6. #define SLICETIME 5   //時間片
  7. static int SYSTIME = 0;  //假設系統時間
  8. int EstimateRunTime(int JobWeight)
  9. {
  10.     return JobWeight;
  11. }  /*估計進程運行時間*/
  12. typedef struct MyProcess
  13. {
  14.     char*   MyProcessname;
  15.     int     CreateTime;
  16.     int     LastExecTime;
  17.     int     JobWeight;
  18.     int     EstimateUsedTime;
  19.     int     Priority;
  20.     MyProcess *next;
  21. }* MYPROCESS;   /*進程定義*/
  22. MYPROCESS CreateMyProcess(char* name, int JW, int Prio)
  23. {
  24.     MYPROCESS myproc;
  25.     myproc = new MyProcess;
  26.     myproc->MyProcessname = new char [10];
  27.     strcpy(myproc->MyProcessname,name);
  28.     myproc->CreateTime = SYSTIME ;
  29.     myproc->LastExecTime = SYSTIME;
  30.     myproc->JobWeight = JW ;
  31.     myproc->EstimateUsedTime = EstimateRunTime(JW) ;
  32.     myproc->Priority = Prio;
  33.     myproc->next=NULL;
  34.     return myproc;
  35. }  /*創建進程*/
  36. void BurstTime(int st)
  37. {
  38.     SYSTIME += st ;
  39. }  /*改變系統時間*/
  40. void PriorityScheduling(MYPROCESS myproc)
  41. {
  42.     if ((SYSTIME-myproc->LastExecTime) > myproc->EstimateUsedTime)
  43.     {
  44.         myproc->Priority--;
  45.         if (myproc->Priority<0)
  46.         {
  47.             myproc->Priority=0;
  48.         }
  49.     }
  50. }   /*優先級調度*/
  51. class MultiPriorityQueueSchedule
  52. {
  53. private:
  54.     MYPROCESS MultiPriorityQueue[QUEUESIZE];
  55. private:
  56.     void        MPQSFreeProcess(MYPROCESS);
  57.     MYPROCESS   MPQSSelectProcess();
  58.     void        MPQSRunProcess(MYPROCESS);
  59.     void        MPQSGoAfter(MYPROCESS);
  60.     void        MPQSPriorityScheduling();
  61. public:
  62.     MultiPriorityQueueSchedule();
  63.     bool        MPQSAppendProcess(MYPROCESS);
  64.     void        MPQSExecute();
  65.     void        MPQSDisplayQueue(ofstream&);
  66. };   /*多優先級調度隊列的定義*/
  67. MultiPriorityQueueSchedule::MultiPriorityQueueSchedule(){
  68.     for(int i=0;i<QUEUESIZE;i++)
  69.     {
  70.         MultiPriorityQueue[i] = NULL;
  71.     }
  72. }   /*構造函數*/
  73. bool MultiPriorityQueueSchedule::MPQSAppendProcess(MYPROCESS myproc)
  74. {
  75.     if (myproc->Priority >= QUEUESIZE)
  76.     {
  77.         return false;
  78.     }
  79.     myproc->next = MultiPriorityQueue[myproc->Priority];
  80.     MultiPriorityQueue[myproc->Priority] = myproc;
  81.     return true;
  82. }   /*在多優先級隊列中加入進程*/
  83. void MultiPriorityQueueSchedule::MPQSFreeProcess(MYPROCESS myproc)
  84. {
  85.     MultiPriorityQueue[myproc->Priority] = myproc->next ;
  86.     delete myproc;
  87. }    /*釋放進程*/
  88. MYPROCESS MultiPriorityQueueSchedule::MPQSSelectProcess()
  89. {
  90.     int SearchNum ;
  91.     for(SearchNum = 0; SearchNum < QUEUESIZE; SearchNum++ )
  92.     {
  93.         if (MultiPriorityQueue[SearchNum] != NULL)
  94.         {
  95.             return MultiPriorityQueue[SearchNum];
  96.         }
  97.     }
  98.     return NULL;
  99. }   /*選擇運行進程*/
  100. void MultiPriorityQueueSchedule::MPQSGoAfter(MYPROCESS myproc)
  101. {
  102.     int QueueNum;
  103.     QueueNum = myproc->Priority ;
  104.     MultiPriorityQueue[QueueNum] = myproc->next;
  105.     MYPROCESS proctemp;
  106.     proctemp= MultiPriorityQueue[QueueNum];
  107.     if (proctemp == NULL)
  108.     {
  109.         MultiPriorityQueue[QueueNum] = myproc;
  110.         return;
  111.     }
  112.     while (proctemp->next != NULL)
  113.     {
  114.         proctemp = proctemp->next ;
  115.     }
  116.     proctemp->next = myproc ;
  117.     myproc->next=NULL;
  118. }   /*將運行後的進程放到隊列尾部*/
  119. void MultiPriorityQueueSchedule::MPQSPriorityScheduling()
  120. {
  121.     int PriorityNum ;
  122.     MYPROCESS myproc;
  123.     MYPROCESS proctemp;
  124.     for(PriorityNum = 0; PriorityNum < QUEUESIZE; PriorityNum++ )
  125.     {
  126.         myproc = MultiPriorityQueue[PriorityNum];
  127.         while (myproc!=NULL)
  128.         {
  129.             PriorityScheduling(myproc);
  130.             if (myproc->Priority != PriorityNum)
  131.             {
  132.                 MultiPriorityQueue[PriorityNum]=myproc->next;
  133.                 MPQSAppendProcess(myproc);
  134.                 myproc=MultiPriorityQueue[PriorityNum];
  135.             }
  136.             else
  137.                 break;
  138.         }
  139.         while (myproc!=NULL&&myproc->next!=NULL)
  140.         {
  141.             PriorityScheduling(myproc->next);
  142.             if (myproc->next->Priority!=PriorityNum)
  143.             {
  144.                 proctemp=myproc->next;
  145.                 myproc->next=myproc->next->next;
  146.                 MPQSAppendProcess(proctemp);
  147.             }
  148.             else
  149.                 myproc=myproc->next;
  150.         }
  151.     }
  152. }
  153. void MultiPriorityQueueSchedule::MPQSRunProcess(MYPROCESS myproc)
  154. {
  155.     if(myproc == NULL)
  156.         return;
  157.     int Runtime;
  158.     Runtime = (pow(2,myproc->Priority))*SLICETIME ;
  159.     myproc->EstimateUsedTime -= Runtime;
  160.     if (myproc->EstimateUsedTime <= 0)
  161.     {
  162.         BurstTime(Runtime+myproc->EstimateUsedTime);
  163.         cout<<SYSTIME<<" /t"<<myproc->MyProcessname<<" /t"<<myproc->Priority<<"  /tFree"<<endl;
  164.         MPQSFreeProcess(myproc);
  165.     }
  166.     else
  167.     {
  168.         BurstTime(Runtime);
  169.         cout<<SYSTIME<<" /t"<<myproc->MyProcessname<<" /t"<<myproc->Priority<<"  /tSwitch"<<endl;
  170.         MPQSGoAfter(myproc);
  171.     }
  172. }   /*多優先級隊列中的優先級調整調度*/
  173. void MultiPriorityQueueSchedule::MPQSExecute()
  174. {
  175.     MYPROCESS myproc;
  176.     do {
  177.         myproc=MPQSSelectProcess();
  178.         MPQSRunProcess(myproc);
  179.         MPQSPriorityScheduling();
  180.     } while(myproc!=NULL);
  181. }   /*運行進程*/
  182. void MultiPriorityQueueSchedule::MPQSDisplayQueue(ofstream& fout)
  183. {
  184.     int SearchNum ;
  185.     MYPROCESS myproc;
  186.     for(SearchNum = 0; SearchNum < QUEUESIZE; SearchNum++ )
  187.     {
  188.         myproc = MultiPriorityQueue[SearchNum];
  189.         while (myproc != NULL)
  190.         {
  191.             fout<<myproc->MyProcessname<<"  /t"<<myproc->Priority<<"  /t"<<myproc->EstimateUsedTime<<endl;
  192.             myproc = myproc->next ;
  193.         }
  194.     }
  195. }   /*顯示多優先級隊列的狀態*/
發佈了27 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章