時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法 C語言模擬實現(xiàn) 收藏_第1頁
時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法 C語言模擬實現(xiàn) 收藏_第2頁
時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法 C語言模擬實現(xiàn) 收藏_第3頁
時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法 C語言模擬實現(xiàn) 收藏_第4頁
時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法 C語言模擬實現(xiàn) 收藏_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選文檔時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法 C語言模擬實現(xiàn) 收藏 一、目的和要求進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。本實驗要求用高級語言編寫模擬進(jìn)程調(diào)度程序,以便加深理解有關(guān)進(jìn)程控制快、進(jìn)程隊列等概念,并體會和了解優(yōu)先數(shù)算法和時間片輪轉(zhuǎn)算法的具體實施辦法。二、實驗內(nèi)容1.設(shè)計進(jìn)程控制塊PCB的結(jié)構(gòu),通常應(yīng)包括如下信息:進(jìn)程名、進(jìn)程優(yōu)先數(shù)(或輪轉(zhuǎn)時間片數(shù))、進(jìn)程已占用的CPU時間、進(jìn)程到完成還需要的時間、進(jìn)程的狀態(tài)、當(dāng)前隊列指針等。  2.編寫兩種調(diào)度算法程序:優(yōu)先數(shù)調(diào)度算法程序循環(huán)輪轉(zhuǎn)調(diào)度算法程序3.按要求輸出結(jié)果。三、提示和說明分別用兩種調(diào)度算法對伍個進(jìn)程進(jìn)行調(diào)度。每個進(jìn)程可有三

2、種狀態(tài);執(zhí)行狀態(tài)(RUN)、就緒狀態(tài)(READY,包括等待狀態(tài))和完成狀態(tài)(FINISH),并假定初始狀態(tài)為就緒狀態(tài)。(一)進(jìn)程控制塊結(jié)構(gòu)如下:      NAME進(jìn)程標(biāo)示符      PRIO/ROUND進(jìn)程優(yōu)先數(shù)/進(jìn)程每次輪轉(zhuǎn)的時間片數(shù)(設(shè)為常數(shù)2)      CPUTIME進(jìn)程累計占用CPU的時間片數(shù)      NEEDTIME進(jìn)程到完成還需要的時間片

3、數(shù)      STATE進(jìn)程狀態(tài)      NEXT鏈指針注:    1.為了便于處理,程序中進(jìn)程的的運行時間以時間片為單位進(jìn)行計算;    2.各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù),以及進(jìn)程運行時間片數(shù)的初值,均由用戶在程序運行時給定。(二)進(jìn)程的就緒態(tài)和等待態(tài)均為鏈表結(jié)構(gòu),共有四個指針如下:      RUN當(dāng)前運行進(jìn)程指針 

4、60;    READY就需隊列頭指針      TAIL就需隊列尾指針      FINISH完成隊列頭指針(三)程序說明    1. 在優(yōu)先數(shù)算法中,進(jìn)程優(yōu)先數(shù)的初值設(shè)為:      50-NEEDTIME每執(zhí)行一次,優(yōu)先數(shù)減1,CPU時間片數(shù)加1,進(jìn)程還需要的時間片數(shù)減1。在輪轉(zhuǎn)法中,采用固定時間片單位(兩個時間片為一個單位),進(jìn)程

5、每輪轉(zhuǎn)一次,CPU時間片數(shù)加2,進(jìn)程還需要的時間片數(shù)減2,并退出CPU,排到就緒隊列尾,等待下一次調(diào)度。    2. 程序的模塊結(jié)構(gòu)提示如下:整個程序可由主程序和如下7個過程組成:(1)INSERT1在優(yōu)先數(shù)算法中,將尚未完成的PCB按優(yōu)先數(shù)順序插入到就緒隊列中;(2)INSERT2在輪轉(zhuǎn)法中,將執(zhí)行了一個時間片單位(為2),但尚未完成的進(jìn)程的PCB,插到就緒隊列的隊尾;(3)FIRSTIN調(diào)度就緒隊列的第一個進(jìn)程投入運行;(4)PRINT顯示每執(zhí)行一次后所有進(jìn)程的狀態(tài)及有關(guān)信息。(5)CREATE創(chuàng)建新進(jìn)程,并將它的PCB插入就緒隊列;(6)PRISC

6、H按優(yōu)先數(shù)算法調(diào)度進(jìn)程;(7)ROUNDSCH按時間片輪轉(zhuǎn)法調(diào)度進(jìn)程。主程序定義PCB結(jié)構(gòu)和其他有關(guān)變量。(四)運行和顯示程序開始運行后,首先提示:請用戶選擇算法,輸入進(jìn)程名和相應(yīng)的NEEDTIME值。每次顯示結(jié)果均為如下5個字段:      name   cputime   needtime   priority   state注:    1在state字段中,"R"代表執(zhí)行態(tài),"W&

7、quot;代表就緒(等待)態(tài),"F"代表完成態(tài)。2應(yīng)先顯示"R"態(tài)的,再顯示"W"態(tài)的,再顯示"F"態(tài)的。  3在"W"態(tài)中,以優(yōu)先數(shù)高低或輪轉(zhuǎn)順序排隊;在"F"態(tài)中,以完成先后順序排隊。view plaincopy to clipboardprint?1. /*   2. 操作系統(tǒng)實驗之時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)度算法   3. By Visual C+ 6.0   

8、4. */    #include <stdio.h>    #include <stdlib.h>    #include <string.h>    typedef struct node          char name20;    /*進(jìn)程的名字*/&

9、#160;     int prio;     /*進(jìn)程的優(yōu)先級*/      int round;     /*分配CPU的時間片*/      int cputime;    /*CPU執(zhí)行時間*/      int need

10、time;    /*進(jìn)程執(zhí)行所需要的時間*/      char state;     /*進(jìn)程的狀態(tài),W就緒態(tài),R執(zhí)行態(tài),F(xiàn)完成態(tài)*/      int count;     /*記錄執(zhí)行的次數(shù)*/      struct node *next; 

11、0; /*鏈表指針*/    PCB;    PCB *ready=NULL,*run=NULL,*finish=NULL; /*定義三個隊列,就緒隊列,執(zhí)行隊列和完成隊列*/    int num;    void GetFirst();    /*從就緒隊列取得第一個節(jié)點*/    void Output();   

12、;  /*輸出隊列信息*/    void InsertPrio(PCB *in);  /*創(chuàng)建優(yōu)先級隊列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級越高*/    void InsertTime(PCB *in);  /*時間片隊列*/    void InsertFinish(PCB *in);  /*時間片隊列*/    void PrioC

13、reate();    /*優(yōu)先級輸入函數(shù)*/    void TimeCreate();    /*時間片輸入函數(shù)*/    void Priority();    /*按照優(yōu)先級調(diào)度*/    void RoundRun();    /*時間片輪轉(zhuǎn)調(diào)度*/    int ma

14、in(void)          char chose;      printf("請輸入要創(chuàng)建的進(jìn)程數(shù)目:n");      scanf("%d",&num);      getchar();      printf("輸入進(jìn)程的調(diào)度方法:(P/R

15、)n");      scanf("%c",&chose);      switch(chose)            case 'P':      case 'p':        Pr

16、ioCreate();        Priority();            break;      case 'R':      case 'r':        TimeCreate();

17、        RoundRun();        break;      default:break;            Output();      return 0;       

18、0;void GetFirst()  /*取得第一個就緒隊列節(jié)點*/          run = ready;            if(ready!=NULL)              run ->state =&#

19、160;'R'        ready = ready ->next;        run ->next = NULL;              void Output()    /*輸出隊列信息*/

20、60;         PCB *p;      p = ready;      printf("進(jìn)程名t優(yōu)先級t輪數(shù)tcpu時間t需要時間t進(jìn)程狀態(tài)t計數(shù)器n");      while(p!=NULL)            

21、  printf("%st%dt%dt%dt%dtt%ctt%dn",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);        p = p->next;            p = finish; 

22、     while(p!=NULL)              printf("%st%dt%dt%dt%dtt%ctt%dn",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);        p = 

23、;p->next;            p = run;      while(p!=NULL)              printf("%st%dt%dt%dt%dtt%ctt%dn",p->name,p->prio,p->round,p->cputim

24、e,p->needtime,p->state,p->count);        p = p->next;              void InsertPrio(PCB *in) /*創(chuàng)建優(yōu)先級隊列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級越低*/          PCB

25、60;*fst,*nxt;      fst = nxt = ready;            if(ready = NULL)  /*如果隊列為空,則為第一個元素*/              in->next = re

26、ady;        ready = in;            else     /*查到合適的位置進(jìn)行插入*/              if(in ->prio >= fst -

27、>prio)  /*比第一個還要大,則插入到隊頭*/                  in->next = ready;          ready = in;           &

28、#160;    else                  while(fst->next != NULL)  /*移動指針查找第一個別它小的元素的位置進(jìn)行插入*/                 &#

29、160;    nxt = fst;            fst = fst->next;                            

30、60; if(fst ->next = NULL) /*已經(jīng)搜索到隊尾,則其優(yōu)先級數(shù)最小,將其插入到隊尾即可*/                      in ->next = fst ->next;        &#

31、160;   fst ->next = in;                    else     /*插入到隊列中*/                

32、0;     nxt = in;            in ->next = fst;                            

33、    void InsertTime(PCB *in)  /*將進(jìn)程插入到就緒隊列尾部*/          PCB *fst;      fst = ready;            if(ready = NULL)   &

34、#160;          in->next = ready;        ready = in;            else              while(

35、fst->next != NULL)                  fst = fst->next;                in ->next = fst ->next; 

36、      fst ->next = in;              void InsertFinish(PCB *in)  /*將進(jìn)程插入到完成隊列尾部*/          PCB *fst;      fs

37、t = finish;            if(finish = NULL)              in->next = finish;        finish = in;    &

38、#160;       else              while(fst->next != NULL)                  fst = fst->next;   

39、60;            in ->next = fst ->next;        fst ->next = in;              void PrioCreate() /*優(yōu)先級調(diào)度

40、輸入函數(shù)*/          PCB *tmp;      int i;            printf("輸入進(jìn)程名字和進(jìn)程所需時間:n");      for(i = 0;i < num; i+)  &#

41、160;           if(tmp = (PCB *)malloc(sizeof(PCB)=NULL)                  perror("malloc");          

42、exit(1);                scanf("%s",tmp->name);        getchar();    /*吸收回車符號*/        scanf("%d",&(tmp->needti

43、me);        tmp ->cputime = 0;        tmp ->state ='W'        tmp ->prio = 50 - tmp->needtime;  /*設(shè)置其優(yōu)先級,需要的時間越多,優(yōu)先

44、級越低*/        tmp ->round = 0;        tmp ->count = 0;        InsertPrio(tmp);      /*按照優(yōu)先級從高到低,插入到就緒隊列*/     

45、         void TimeCreate() /*時間片輸入函數(shù)*/          PCB *tmp;      int i;            printf("輸入進(jìn)程名字和進(jìn)程時間片所需時間:n");  

46、60;   for(i = 0;i < num; i+)              if(tmp = (PCB *)malloc(sizeof(PCB)=NULL)                  pe

47、rror("malloc");          exit(1);                scanf("%s",tmp->name);        getchar();       &

48、#160;scanf("%d",&(tmp->needtime);        tmp ->cputime = 0;        tmp ->state ='W'        tmp ->prio = 0;   &#

49、160;    tmp ->round = 2;  /*假設(shè)每個進(jìn)程所分配的時間片是2*/        tmp ->count = 0;        InsertTime(tmp);              vo

50、id Priority()   /*按照優(yōu)先級調(diào)度,每次執(zhí)行一個時間片*/          int flag = 1;            GetFirst();      while(run != NULL)  /*當(dāng)就緒隊列不為空時,則調(diào)度進(jìn)程如執(zhí)行隊

51、列執(zhí)行*/              Output();  /*輸出每次調(diào)度過程中各個節(jié)點的狀態(tài)*/        while(flag)                  run->prio -= 3;

52、 /*優(yōu)先級減去三*/          run->cputime+; /*CPU時間片加一*/          run->needtime-;/*進(jìn)程執(zhí)行完成的剩余時間減一*/          if(run->needtime = 0)/*如果進(jìn)程執(zhí)行完畢,將進(jìn)程狀

53、態(tài)置為F,將其插入到完成隊列*/                      run ->state = 'F'            run->count+; /*進(jìn)程執(zhí)行的次數(shù)加一*/    

54、;        InsertFinish(run);            flag = 0;                    else   /*將進(jìn)程狀態(tài)置為W,入就緒隊

55、列*/                      run->state = 'W'            run->count+; /*進(jìn)程執(zhí)行的次數(shù)加一*/       

56、     InsertTime(run);            flag = 0;                          flag = 1;        GetFirst();    /*繼續(xù)取就緒隊列隊頭進(jìn)程進(jìn)入執(zhí)行隊列*/              void RoundRun()    /*時間片輪轉(zhuǎn)調(diào)度算法*/                

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論