c語言課程設(shè)計處理機低級調(diào)度模擬系統(tǒng)_第1頁
c語言課程設(shè)計處理機低級調(diào)度模擬系統(tǒng)_第2頁
c語言課程設(shè)計處理機低級調(diào)度模擬系統(tǒng)_第3頁
c語言課程設(shè)計處理機低級調(diào)度模擬系統(tǒng)_第4頁
c語言課程設(shè)計處理機低級調(diào)度模擬系統(tǒng)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、高級程序設(shè)計語言課程設(shè)計報告題目: 處理機低級調(diào)度模擬系統(tǒng) 專業(yè): 網(wǎng)絡(luò)工程 班級: 10. 學(xué)號: 00000000000 姓名: * 指導(dǎo)教師: * 完成日期: 2013 年 3 月 30 日一、課程設(shè)計的目的1、掌握C語言數(shù)組、函數(shù)、指針、結(jié)構(gòu)體的綜合應(yīng)用。2、掌握使用C語言,進行應(yīng)用性的開發(fā)。3、掌握系統(tǒng)數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計。二、課程設(shè)計的內(nèi)容課程設(shè)計題目:處理機低級調(diào)度模擬系統(tǒng)課程設(shè)計內(nèi)容:根據(jù)操作系統(tǒng)處理機不同的調(diào)度算法,使用C語言模擬實現(xiàn)處理機調(diào)度過程。1、系統(tǒng)數(shù)據(jù)結(jié)構(gòu) (1)進程控制塊(pcb):進程名稱、到達時間、進程要求運行時間、進程已運行時間、指針、進程狀態(tài)等等(要根據(jù)不

2、同算法的需要定義全面的數(shù)據(jù)結(jié)構(gòu)) (2)進程隊列(PQueue):鏈表2、調(diào)度算法(1)先來先服務(wù)調(diào)度(FCFS):按照進程提交給系統(tǒng)的先后順序來挑選進程,先提交的先被挑選。(2)多級反饋隊列調(diào)度(FB,第i級隊列的時間片=2i-1):(a)應(yīng)設(shè)置多個就緒隊列,并為各個隊列賦予不同的優(yōu)先級。(b)當(dāng)一個新進程進入內(nèi)存后,首先將它放入第一隊列的末尾,按FCFS的原則排隊等待調(diào)度。當(dāng)輪到該進程執(zhí)行時,如他能在該時間片內(nèi)完成,便可準備撤離系統(tǒng);如果它在一個時間片結(jié)束時尚未完成,調(diào)度程序便將該進程轉(zhuǎn)入第二隊列的末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行;如果它在第二隊列中運行一個時間片后仍未完成,再依次

3、將它放入第三隊列,如此下去,當(dāng)一個長作業(yè)進程從第一隊列依次降到第N隊列后,在第N隊列中便采取時間片輪轉(zhuǎn)的方式運行。(c)僅當(dāng)?shù)谝魂犃锌臻e時,調(diào)度程序才調(diào)度第二隊列中的進程運行。三、課程設(shè)計的要求1、按照給出的題目內(nèi)容(1)完成系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設(shè)計與實現(xiàn)、系統(tǒng)算法設(shè)計與實現(xiàn)、系統(tǒng)模塊設(shè)計與實現(xiàn)、系統(tǒng)總體的設(shè)計與實現(xiàn)。(2)系統(tǒng)需要一個簡單操作界面,例如: = 1. 先來先服務(wù)調(diào)度 2. 多級反饋隊列調(diào)度 3. 退出 (按數(shù)字1、2、3、,選擇操作) =(3)對每種調(diào)度算法都要求輸出每個進程(進程數(shù)不少于5)開始運行時刻、完成時刻、周轉(zhuǎn)時間,以及這組進程的平均周轉(zhuǎn)時間。(4)畫出每種調(diào)度算法流程圖。

4、1.先來先服務(wù)調(diào)度:開 始輸入進程個數(shù),進程詳細信息進程按到達時間排序令P為隊首的進程計算P的開始運行時間、結(jié)束運行時間、周轉(zhuǎn)時間、帶權(quán)周轉(zhuǎn)時間輸出進程相關(guān)信息P=P>nextP!=null計算平均周轉(zhuǎn)時間、平均帶權(quán)周轉(zhuǎn)時間輸出平均周轉(zhuǎn)時間、平均帶權(quán)周轉(zhuǎn)時間結(jié) 束YesNOOo2.多級反饋隊列調(diào)度:四:課程設(shè)計過程:1. 系統(tǒng)中所使用的數(shù)據(jù)結(jié)構(gòu)及說明 .數(shù)據(jù)結(jié)構(gòu)的定義. 定義進程控制塊PCBstruct PCBchar name10; /進程名字float arrivetime; /進程到達時間float servicetime;/進程服務(wù)時間float super; /響應(yīng)比float

5、 starttime; /開始運行時間float finishtime; /完成時間float TurnaroundTime; /周轉(zhuǎn)時間char state; /進程的狀態(tài),W就緒態(tài),R執(zhí)行態(tài),F(xiàn)完成態(tài) int prio; /優(yōu)先級int round; /時間片int cputime; /cpu時間int needtime; /進程運行時間int count; /計數(shù)器struct PCB *next;*ready=NULL,*p,*q;定義就緒隊列:typedef struct Queue /多級就緒隊列節(jié)點信息 PCB *LinkPCB; /就緒隊列中的進程隊列指針 int prio;

6、/本就緒隊列的優(yōu)先級 int round; /本就緒隊列所分配的時間片struct Queue *next; /指向下一個就緒隊列的鏈表指針 ReadyQueue;2. 系統(tǒng)功能結(jié)構(gòu)本系統(tǒng)是處理機低級調(diào)度模擬系統(tǒng),主要通過模擬來實現(xiàn)處理機調(diào)度,調(diào)度方式有先來先服務(wù)調(diào)度(FCFS)、短進程優(yōu)先調(diào)度(SJF)、高響應(yīng)比優(yōu)先調(diào)度(HRN)、多級反饋隊列調(diào)度 (FB)四種調(diào)度方式。系統(tǒng)運行過程如下:輸入進程個數(shù),輸入進程詳細信息,通過簡單操作界面來選擇調(diào)度方式,調(diào)度的過程和結(jié)果,重新選擇調(diào)度方式或者選擇結(jié)束。3. 程序清單及描述#define NULL 0#include <stdio.h>

7、;#include <stdlib.h> #include <conio.h> #include <string.h>#include <windows.h>struct PCBchar name10; /進程名字float arrivetime; /進程到達時間float servicetime;/進程服務(wù)時間float super; /響應(yīng)比float starttime; /開始運行時間float finishtime; /完成時間float TurnaroundTime; /周轉(zhuǎn)時間char state; /進程的狀態(tài),W就緒態(tài),R執(zhí)行態(tài)

8、,F(xiàn)完成態(tài) int prio; /優(yōu)先級int round; /時間片int cputime; /cpu時間int needtime; /進程運行時間int count; /計數(shù)器struct PCB *next;*ready=NULL,*p,*q;typedef struct Queue /多級就緒隊列節(jié)點信息 PCB *LinkPCB; /就緒隊列中的進程隊列指針 int prio; /本就緒隊列的優(yōu)先級 int round; /本就緒隊列所分配的時間片struct Queue *next; /指向下一個就緒隊列的鏈表指針 ReadyQueue; PCB a100;int N;void c

9、reateProcess(PCB *p)/創(chuàng)建進程函數(shù)int i;printf("輸入進程名 & 到達時間 & 服務(wù)時間:n例如: a 0 100n");for(i=0;i<=N-1;i+)printf("輸入第%d個進程的信息:n",i+1);scanf("%s%f%f",&,&pi.arrivetime,&pi.servicetime);void sort(PCB *p,int N)/到達時間排序 for(int i=0;i<=N-1;i+) for(int j=0

10、;j<=i;j+) if(pi.arrivetime<pj.arrivetime) PCB temp; temp=pi; pi=pj; pj=temp; void running(PCB *p, float arrivetime,float servicetime,float starttime,float finishtime,float &TurnaroundTime,int N)/計算進程時間int k; for(k=0;k<=N-1;k+) if(k=0) pk.starttime=pk.arrivetime; pk.finishtime=pk.arrivet

11、ime+pk.servicetime; elsepk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+pk.servicetime; for(k=0;k<=N-1;k+) pk.TurnaroundTime=pk.finishtime-pk.arrivetime; void print(PCB *p,float arrivetime,float servicetime,float starttime,float finishtime,float TurnaroundTime,int N)/進程輸出各種時間 int k; p

12、rintf("運行次序:"); printf("%s",);for(k=1;k<N;k+)printf("->%s",);printf("n進程的信息:n");printf("n進程名t到達t服務(wù)t開始t完成t周轉(zhuǎn)n"); for(k=0;k<=N-1;k+) printf("%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ftn",,pk.arrivetime,pk.servicetime,pk.st

13、arttime,pk.finishtime,pk.TurnaroundTime); void fcfs(PCB *p)/先來先服務(wù)調(diào)度算法 system("cls"); printf("請輸入作業(yè)數(shù):"); scanf("%d",&N); while( N < 5) /進程小于5的話,重新選擇輸入 system("cls");printf("n77作業(yè)數(shù)小于5,重新輸入:n");printf("請輸入作業(yè)數(shù):");scanf("%d",&am

14、p;N); createProcess(a); float arrivetime=0,servicetime=0,starttime=0,finishtime=0,TurnaroundTime=0; sort(p,N); /排序 running(p,arrivetime,servicetime,starttime,finishtime,TurnaroundTime,N);/模擬運行 print(p,arrivetime,servicetime,starttime,finishtime,TurnaroundTime,N);/打印輸入結(jié)果 PCB *run=NULL,*finish=NULL; /

15、定義三個隊列,就緒隊列,執(zhí)行隊列和完成隊列 ReadyQueue *Head = NULL; /定義第一個就緒隊列 int num; /進程個數(shù) int ReadyNum; /就緒隊列個數(shù) void Output(); /進程信息輸出函數(shù) void InsertFinish(PCB *in); /將進程插入到完成隊列尾部 void InsertPrio(ReadyQueue *in); /創(chuàng)建就緒隊列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級越低 void PrioCreate(); /創(chuàng)建就緒隊列輸入函數(shù) void GetFirst(ReadyQueue *queue); /取得某一個就緒隊列中的隊頭進程 v

16、oid InsertLast(PCB *in,ReadyQueue *queue); /將進程插入到就緒隊列尾部 void ProcessCreate(); /進程創(chuàng)建函數(shù)void RoundRun(ReadyQueue *timechip); /時間片輪轉(zhuǎn)調(diào)度算法 void MultiDispatch(); /多級調(diào)度算法,每次執(zhí)行一個時間片 void Output() /進程信息輸出函數(shù) ReadyQueue *print = Head; PCB *p; printf("進程名t優(yōu)先級t輪數(shù)tcpu時間t需要時間t進程狀態(tài)t計數(shù)器n"); while(print) if

17、(print ->LinkPCB != NULL) p=print ->LinkPCB; while(p) 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; print = print->next; p = finish; while(p!=NULL) printf("%st%dt%dt%dt%dtt%ctt%dn"

18、;,p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count); p = p->next; p = run; 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 = p->next; void InsertFinish(PCB

19、 *in) /將進程插入到完成隊列尾部 PCB *fst; fst = finish; if(finish = NULL) in->next = finish; finish = in; else while(fst->next != NULL) fst = fst->next; in ->next = fst ->next; fst ->next = in; void InsertPrio(ReadyQueue *in) /創(chuàng)建就緒隊列,規(guī)定優(yōu)先數(shù)越小,優(yōu)先級越低 ReadyQueue *fst,*nxt; fst = nxt = Head; if(Hea

20、d = NULL) /沒有隊列,則為第一個元素 in->next = Head; Head = in; else /查到合適的位置進行插入 if(in ->prio >= fst ->prio) /比第一個還要大,則插入到隊頭 in->next = Head; Head = in; else while(fst->next != NULL) /移動指針查找第一個別它小的元素的位置進行插入 nxt = fst; fst = fst->next; if(fst ->next = NULL) /已經(jīng)搜索到隊尾,則其優(yōu)先級數(shù)最小,將其插入到隊尾即可 in

21、 ->next = fst ->next; fst ->next = in; else /入到隊列中 nxt = in; in ->next = fst; void PrioCreate() /創(chuàng)建就緒隊列輸入函數(shù) ReadyQueue *tmp; int i; printf("輸入就緒隊列的個數(shù):"); scanf("%d",&ReadyNum); printf("輸入每個就緒隊列的CPU時間片:(一次行輸完所有,再按回車結(jié)束,如:1 2 3 )n"); for(i = 0;i < ReadyN

22、um; i+) if(tmp = (ReadyQueue *)malloc(sizeof(ReadyQueue)=NULL) perror("malloc"); exit(1); scanf("%d",&(tmp->round); /輸入此就緒隊列中給每個進程所分配的CPU時間片 tmp ->prio = 50 - tmp->round; /置其優(yōu)先級,時間片越高,其優(yōu)先級越低 tmp ->LinkPCB = NULL; /初始化其連接的進程隊列為空 tmp ->next = NULL; InsertPrio(tmp

23、); /照優(yōu)先級從高到低,建立多個就緒隊列 void GetFirst(ReadyQueue *queue) /取得某一個就緒隊列中的隊頭進程 run = queue ->LinkPCB; if(queue ->LinkPCB != NULL) run ->state = 'R' queue ->LinkPCB = queue ->LinkPCB ->next; run ->next = NULL; void InsertLast(PCB *in,ReadyQueue *queue) /將進程插入到就緒隊列尾部 PCB *fst; fs

24、t = queue->LinkPCB; if( queue->LinkPCB = NULL) in->next = queue->LinkPCB; queue->LinkPCB = in; else while(fst->next != NULL) fst = fst->next; in ->next = fst ->next; fst ->next = in; void ProcessCreate() /針對多級反饋隊列算法的進程創(chuàng)建函數(shù) PCB *tmp; int i; printf("請輸入作業(yè)數(shù):"); s

25、canf("%d",&num); if( num < 5) system("cls");printf("n77作業(yè)數(shù)小于5,重新輸入:n");ProcessCreate();printf("輸入進程名字和進程所需時間:(一次性輸完,再按回車結(jié)束如:a 1 b 2 c 3 d 4 e 5)n"); for(i = 0;i < num; i+) if(tmp = (PCB *)malloc(sizeof(PCB)=NULL) perror("malloc"); exit(1);

26、scanf("%s",tmp->name); getchar(); scanf("%d",&(tmp->needtime); tmp ->cputime = 0; tmp ->state ='W' tmp ->prio = 50 - tmp->needtime; /置其優(yōu)先級,需要的時間越多,優(yōu)先級越低 tmp ->round = Head ->round; tmp ->count = 0; InsertLast(tmp,Head); /照優(yōu)先級從高到低,插入到就緒隊列 voi

27、d RoundRun(ReadyQueue *timechip) /時間片輪轉(zhuǎn)調(diào)度算法 int flag = 1; GetFirst(timechip); while(run != NULL) while(flag) run->count+; run->cputime+; run->needtime-; if(run->needtime = 0) run ->state = 'F' InsertFinish(run); flag = 0; else if(run->count = timechip ->round)/間片用完 run-&

28、gt;state = 'W' run->count = 0; /數(shù)器清零,為下次做準備 InsertLast(run,timechip); flag = 0; flag = 1; GetFirst(timechip); void MultiDispatch() /多級調(diào)度算法,每次執(zhí)行一個時間片 int flag = 1; int k = 0; system("cls");printf("您選擇的是多級反饋隊列算法n"); PrioCreate(); /建就緒隊列 ProcessCreate();/創(chuàng)建就緒進程隊列 ReadyQue

29、ue *point; point = Head; GetFirst(point); while(run != NULL) Output(); if(Head ->LinkPCB!=NULL) point = Head; while(flag) run->count+; run->cputime+; run->needtime-; if(run->needtime = 0) /程執(zhí)行完畢 run ->state = 'F' InsertFinish(run); flag = 0; else if(run->count = run->

30、round)/間片用完 run->state = 'W' run->count = 0; /數(shù)器清零,為下次做準備 if(point ->next!=NULL) run ->round = point->next ->round;/置其時間片是下一個就緒隊列的時間片 InsertLast(run,point->next); /進程插入到下一個就緒隊列中 flag = 0; else RoundRun(point); /果為最后一個就緒隊列就調(diào)用時間片輪轉(zhuǎn)算法 break; +k; if(k = 3) ProcessCreate(); flag = 1; if(point ->LinkPCB = NULL)/緒隊列指針下移 point =point->next; if(point ->next =NULL) RoundRun(point); break; GetFirst(point); Output(); void opration()int select;system("

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論