基于-優先數時間片輪轉調度算法調度處理器_第1頁
基于-優先數時間片輪轉調度算法調度處理器_第2頁
基于-優先數時間片輪轉調度算法調度處理器_第3頁
基于-優先數時間片輪轉調度算法調度處理器_第4頁
基于-優先數時間片輪轉調度算法調度處理器_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、-. z題目4 基于優先數的時間片輪轉調度算法調度處理器一、實驗目的在采用多道程序設計的系統中,同時處于就緒態的進程往往有多個,當就緒態的進程數大于處理器的個數時,就需按照*種策略進展分配處理器。本次設計模擬在單處理器情況下采用基于優先數的時間片輪轉調度算法進展處理器調度,加深了解處理器調度工作過程。二、實驗容及要求1、設計一個程序實現基于優先數的時間片輪轉調度算法調度處理器。2、假定系統有5個進程,每個進程用一個進程控制塊PCB開代表,進程控制塊的構造如下列圖1.2所示:進程名指針到達時間要求運行時間已運行時間優先數進程狀態圖1其中:進程名:作為進程的標識。指針:進程按順序排成循環鏈表,用指

2、針指出下一個進程的進程控制塊首地址,最后一個進程中的指針指出第一個進程的進程控制塊首地址。要求運行時間:假設進程需要運行的單位時間數。已運行時間:假設進程已經運行的單位時間數,初值為0。狀態:可假設有兩種狀態,就緒狀態和完畢狀態。進程的初始狀態都為就緒狀態。3、每次運行所設計的處理器調度程序調度進程之前,為每個進程任意確定它的要求運行時間。4、此程序是模擬處理器調度,因此,被選中的進程并不實際啟動運行,而是執行已運行時間+1來模擬進程的一次運行,表示進程已經運行過一個單位時間。.5、在所設計的程序中應有顯示或打印語句,能顯示或打印每次被選中的進程名以及運行一次后進程隊列的變化。6、為進程任意確

3、定要求運行時間,運行所設計的處理器調度程序,顯示或打印逐次被選中進程的進程名以及進程控制塊的動態變化過程。7、設有一個就緒隊列,就緒進程按優先數優先數圍0100由小到大排列優先數越小,級別越高。當*一進程運行完一個時間片后,其優先級應下調如優先數加2或3。8、例如一組進程如下表:進程名ABCDEFGHJKLM到達時間012368121212182525效勞時間641051251043158三、實驗報告1、程序中使用的數據構造及符號說明。2、給出主要算法的流程圖3、給出程序清單并附上注釋4、打印程序運行時的初值和運行結果。運行一個進程輸出一次結果三、實驗代碼#include#include#in

4、clude#define getpch(type) (type*)malloc(sizeof(type) /為進程創立一個空間struct worktimefloat Tb; /作業運行時刻float Tc; /作業完成時刻float Ti; /周轉時間float Wi; /帶權周轉時間;struct jcb char name10; /作業名float subtime; /作業到達時間float runtime; /作業所需的運行時間char resource; /所需資源float Rp; /后備作業響應比char state; /作業狀態int worked_time; /已運行時間st

5、ruct worktime wt;int need_time; /要求運行時間int flag; /進程完畢標志struct jcb* link; /鏈指針*ready=NULL,*p;typedefstruct jcb JCB;float T=0;int N;JCB *front,*rear; /時間輪轉法變量void sort() JCB *first, *second;int insert=0; /插入數if(ready=NULL)|(p-subtime)subtime) p-link=ready; ready=p; T=p-subtime; p-Rp=1; else first=rea

6、dy; second=first-link;while(second!=NULL) if(p-subtime)subtime) p-link=second; first-link=p; second=NULL; insert=1; else first=first-link; second=second-link; if (insert=0) first-link=p; void SJFget() JCB *front,*mintime,*rear;int ipmove=0; mintime=ready; rear=mintime-link;while(rear!=NULL) if (rear

7、!=NULL)&(T=rear-subtime)&(mintime-runtime)(rear-runtime) front=mintime; mintime=rear; rear=rear-link; ipmove=1; else rear=rear-link; if (ipmove=1) front-link=mintime-link; mintime-link=ready; ready=mintime;void HRNget() JCB *front,*mintime,*rear;int ipmove=0; mintime=ready; rear=mintime-link;while(r

8、ear!=NULL)if (rear!=NULL)&(T=rear-subtime)&(mintime-Rp)Rp) front=mintime; mintime=rear; rear=rear-link; ipmove=1; else rear=rear-link;if (ipmove=1) front-link=mintime-link; mintime-link=ready; ready=mintime;void creatJCB() /為每個作業創立一個JCB并初始化形成一個循環鏈隊列 JCB *p,*l;int i=0; l = (JCB *)malloc(sizeof(JCB);

9、printf(n 請輸入作業的個數:); scanf(%d,&N); printf(n 作業號No.%d:n,i); printf(n請輸入作業的名字:); scanf(%s,l-name); printf(n請輸入作業的時間:); scanf(%d,&l-need_time); l-state = r; /作業初始狀態為就緒 l-worked_time = 0; l-link=NULL; l-flag=0; front=l;for(i =1;iname); printf(n請輸入作業的時間:); scanf(%d,&p-need_time); p-state=r; p-worked_time

10、=0; p-flag=0; l-link=p; l=l-link; rear=l;rear-link=front; void output()/進程輸出函數int j; printf(name runtime needtime staten);for(j=1;jname,front-worked_time,front-need_time,front-state); front=front-link; printf(n);int judge(JCB *p) /判斷所有進程運行完畢int flag=1,i;for(i=0;istate!=e) flag = 0;break; p=p-link; r

11、eturn flag;void RRget()/時間片輪轉算法 JCB *s;int flag1=0; s=(JCB *)malloc(sizeof(JCB); s=front; printf(n-n); output(); printf(請輸入任意一鍵繼續n); getch(); /按任意鍵繼續 s=front;while(flag1 != 1) if(s-state=r) s-worked_time+; s-need_time-;if(s-need_time=0) s-state=e; output(); printf(請輸入任意一鍵繼續.n); getch(); if(s-state=e

12、&s-flag=0) printf(進程%s已經運行完成!nn,s-name); s-flag=1; s=s-link; flag1=judge(s); printf(-n);void input()int i,num; printf(n 請輸入作業的個數:); scanf(%d,&num);for(i=0;iname); printf(n 輸入作業到達時刻:); scanf(%f,&p-subtime); printf(n 輸入作業運行時間:); scanf(%f,&p-runtime); printf(n); p-state=w; p-link=NULL; sort(); int spac

13、e()int l=0; JCB* jr=ready;while(jr!=NULL) l+; jr=jr-link; return(l);void disp(JCB* jr,int select)if (select=3) printf(n 作業到達時間效勞時間響應比運行時刻完成時刻周轉時間帶權周轉時間n);else printf(n 作業到達時間效勞時間運行時刻完成時刻周轉時間帶權周轉時間n); printf( |%st,jr-name); printf( |%.2ft ,jr-subtime); printf( |%.2ft,jr-runtime);if (select=3&p=jr) pr

14、intf(|%.2f ,jr-Rp);if (p=jr) printf(|%.2ft ,jr-wt.Tb); printf( |%.2f ,jr-wt.Tc); printf( |%.2ft,jr-wt.Ti); printf( |%.2f,jr-wt.Wi); printf(n);int destroy() printf(n 作業%s 已完成.n,p-name); free(p);return(1);void check(int select) JCB* jr; printf(n * 當前正在運行的作業是:%s,p-name); disp(p,select); jr=ready; print

15、f(n *當前就緒隊列狀態為:n);while(jr!=NULL) jr-Rp=(jr-runtime+T-jr-subtime)/jr-runtime; disp(jr,select); jr=jr-link; destroy();void running(JCB* jr)if (T=jr-subtime) jr-wt.Tb=T;else jr-wt.Tb=jr-subtime; jr-wt.Tc=jr-wt.Tb+jr-runtime; jr-wt.Ti=jr-wt.Tc-jr-subtime; jr-wt.Wi=jr-wt.Ti/jr-runtime; T=jr-wt.Tc;int ma

16、in()int select=0,len,h=0;float sumTi=0,sumWi=0; printf(t-*-n); printf(請選擇作業調度算法的方式:n); printf(t1.FCFS 2.SJF 3.HRN 4.RRnn); printf(t-*-n); printf(請輸入作業調度算法序號(1-4):); scanf(%d,&select);if (select=4) creatJCB(); RRget();else input(); len=space();while(len!=0)&(ready!=NULL) h+; printf(n 執行第%d個作業n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; running(p); sumTi+=

溫馨提示

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

評論

0/150

提交評論