《C语言模拟进程管理(共19页).doc》由会员分享,可在线阅读,更多相关《C语言模拟进程管理(共19页).doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上操作系統課程設計報告目 錄一 需求分析在多道處理程序運行環境下,進程數目一般多於處理機數目,使得進程要通過競爭來使用處理機。這就要求系統能按照某種算法,動態地把處理機分配給就緒隊列中一個進程,使之運行,分配處理機任務是由金城調度程序完成。一個進程被創建後,系統為了便於對進程進行管理,將系統中所有進程按照其狀態,將其組成不同進程隊列。於是系統中有運行進程隊列、就緒隊列和各種事件進程等待隊列。進程調度功能就是從就緒隊列中挑選一個進程到處理機上運行。進程調度算法有多種,常用有優先級調度算法、先來先服務算法、時間片輪轉算法。二 概要設計最高優先級優先調度算法動態優先數是指在進
2、程創建時先確定一個初始優先數, 以後在進程運行中隨著進程特性改變不斷修改優先數,這樣,由於開始優先數很低而得不到CPU進程,就能因為等待時間增長而優先數變為最高而得到CPU運行。例如:在進程獲得一次CPU後就將其優先數減少3。或者,進程等待時間超過某一時限時增加其優先數值,等等。簡單輪轉法調度算法 所有就緒進程按 FCFS排成一個隊列,總是把處理機分配給隊首進程,各進程占用CPU時間片相同。即將CPU處理時間劃分成一個個相同時間片,就緒隊列諸進程輪流運行一個時間片。當一個時間片結束時,如果運行進程用完它時間片後還未完成,就強迫運行機制進程讓出CPU,就把它送回到就緒隊列末尾,等待下一次調度。同
3、時,進程調度又去選擇就緒隊列中隊首進程,分配給它一時間片,以投入運行。直至所有進程運行完畢。短作業優先調度算法 所有就緒進程按所需時間由少到多排成一個隊列,依次運行隊列中進程,並列表顯示出來,每個進程開始運行時間減去進入內存時間就是該進程等待時間,每個進程結束運行時間減去進入內存時間就是該進程周轉時間,每個進程周轉時間除於服務時間就是帶權周轉時間。三 詳細設計一優先權調度算法:1、用戶可以自行輸入進程數量,每一個進程由進程控制塊( PCB)表示,各種隊列均采用鏈表數據結構。2、 進程控制塊包含如下信息:進程號、cpu時間、所需要時間、優先數、狀態 等等。3、 在每次運行程序時都要輸入“進程數量
4、”、“進程名稱及占用時間”。4、 按照優先數高低進行排列5、 處理機調度隊首元素運行。采用動態優先數辦法,進程每運行一次優先數減“3”,同時將已運行時間加“1”。6、 進程運行一次後,若要求運行時間不等於已運行時間,則再將它加入就緒隊列;否則將其狀態置為“F”,且退出就緒隊列。7、 “R”狀態進程隊列不為空,則重複上面步驟,直到所有進程都成為“F”狀態。流程圖: 开始初始化PCB,输入各进程信息按优先级加入就绪队列就绪队列空结束就绪队列中首进程运行标为Cpu时间+1,进入下一个进程进程运行时间满足所需时间进程运行完成。进程优先数减3,插入就绪队列中。NYN 圖.最高優先級優先調度算法流程圖主要
5、代碼:void priority(char algo)PCB q;prt1(algo);for(int i = 0; i0)q.needtime-;if(q.needtime = 0)q.state = 3;if(q.state!=3)q.prio-=3;pp.push(q);while(!pq.empty()q = pq.top();pq.pop(); if(q.needtime = 0)q.state = 3;prt2(algo , q);prt1(algo);pp.push(q);pq = pp;pp = pqempty; printf(*n); printf( 輸出結束n);getch
6、ar();二時間片輪轉算法:1、 用戶可以自行輸入進程數量,每一個進程由進程控制塊( PCB)表示,各種隊列均采用鏈表數據結構。2、 按照進程輸入先後順序排成一個隊列。再設一個隊首指針指向第一個到達進程首址。3、 執行處理機調度時,開始選擇隊首第一個進程運行。另外,再設一個當前運行進程指針,指向當前正在運行進程。4、 考慮到代碼可重用性, 輪轉法調度程序和最高優先級優先調度是調用同一個模快進行輸出5、 在規定時間片內進程是根據先來先服務方式配列,每個進程只運行時間片大小時間然後轉到下一個進程運行。直到所有進程運行完為止。流程圖初始化PCB、输入进程信息和时间片大小开始进程按输入顺序插入到队列中
7、就绪队列空结束就绪队列首进程运行运行进程占用cup时间到达 所需时间进程完成把运行进程插入到队尾NYN圖. 簡單輪轉法調度算法流程圖主要代碼:void Roundrun(int timeSlice)while(run != NULL)run-cputime = run-cputime + timeSlice;run-needtime = run-needtime - timeSlice;run-round+=timeSlice;run-count+;if(run-needtime needtime = 0;run-next = finish;finish = run;if(run != tai
8、l)tail-next = ready;elseready = NULL;run-state = F;run = NULL;if(ready != NULL)firstin();elseif(ready != NULL)run-state = W;tail = run;run = ready; /就绪队列头指针赋值给运行run - state = R; /进程状态变为等待状态ready = ready - next; /就绪队列头指针移到下一个进程prt(r);三短作業優先調度算法1,用戶可以自行輸入進程數量,每一個進程由進程控制塊( PCB)表示,各種隊列均采用鏈表數據結構。2,按照進程服務
9、時間由少到多順序排成一個隊列。再按順序依次執行。主要代碼:void short_timefirst(char algo)PC q;int t;prt3();for(int j = 0; j N ; j+)pj.state = R;for(int i=0;iN;i+)if(p1i.state = W) p1i.waittime=Tim;if(strcmp(pj.name,p1i.name)=0) p1i.state = R;prit(i);p1i.state = F;p1i.cputime=p1i.needtime;p1i.needtime=0;elseprit(i);pj.state = F;
10、pj.cputime=pj.needtime;pj.needtime=0;pj.waittime=Tim;Tim+=pj.cputime;printf(*n); for(int i=0;iN;i+) prit(i);printf(*n); printf( 輸出結束n);getchar();四 調試分析、測試結果一進入系統顯示歡迎界面二如果選擇P進行優先數算法則提示輸入進程數:三輸入進程號和運行時間:四輸出優先數算法信息:五可以繼續選擇R進行時間片輪轉算法,並輸入時間片大小:六輸出時間片輪轉算法信息:附錄#include#include#include#includeusing namespac
11、e std;typedef struct nodechar name10;int prio;int round;int needtime;int cputime;int count;int state;struct node *next;bool operator (const node& o)const if(state = o.state) return prio o.state;PCB;priority_queue pq,pqempty,pp,qq;PCB *finish,*ready,*tail,*run;int N , Num;typedef struct nodchar name1
12、0;int needtime;int cputime;int waittime;int state;struct node *next;PC;PC p10;PC p110;int Tim=0;void firstin() run=ready;run-state=R;ready=ready-next;void prt1(char a)if(a=P)printf(* 進程號 cpu時間 所需要時間 優先數 狀態 *n);else printf(* 進程號 cpu時間 所需時間 記數 時間片 狀態 *n); void prt2(char a,PCB q)if(a=P) printf(* %-10s
13、%-10d %-10d %-10d %-10d *n,q.name,q.cputime,q.needtime+Tim,q.prio,q.state);else printf(* %-10s %-10d %-10d %-10d %-10d %-10c *n,q.name,q.cputime,q.needtime+Tim,q.count,q.round,q.state);void prt22(char a,PCB *q)printf(* %-10s %-10d %-10d %-10d %-10d %-10c*n,q-name,q-cputime,q-needtime,q-count,q-round
14、,q-state);void prt(char algo)PCB *q;prt1(algo);if(run!=NULL) prt22(algo,run); q=ready; while(q!=NULL&q!=run)prt22(algo,q);if(q-next = run) break;else q = q-next;q=finish;while(q!=NULL)prt22(algo,q);q=q-next;getchar();void priority(char algo)PCB q;prt1(algo);for(int i = 0; i0)q.needtime-;if(q.needtim
15、e = 0)q.state = 3;if(q.state!=3)q.prio-=3;pp.push(q);while(!pq.empty()q = pq.top();pq.pop(); if(q.needtime = 0)q.state = 3;prt2(algo , q);prt1(algo);pp.push(q);pq = pp;pp = pqempty; printf(*n); printf( 輸出結束n);getchar();void create1(char algo)PCB p;int i,time;char na10;ready=NULL;finish=NULL;run=NULL
16、;printf( 輸入進程號和運行時間:n);printf();for(i=1;inext =q;tail=tail-next;void create2(char algo)PCB *p;int i,time;char na10;ready=NULL;finish=NULL;run=NULL;printf( 輸入進程號和運行時間:nn);printf();for(i=1;iname,na);p-cputime=0; p-needtime=time; p-state=W; p-round =0;p-count =0;if(ready!=NULL) insert2(p);elsep-next=re
17、ady; ready=p;tail=ready;printf( 時間片輪轉法輸出信息:n);printf(*n); run=ready; ready=ready-next;tail-next =run;run-state=R;prt(algo);void Roundrun(int timeSlice)while(run != NULL)run-cputime = run-cputime + timeSlice;run-needtime = run-needtime - timeSlice;run-round+=timeSlice;run-count+;if(run-needtime needt
18、ime = 0;run-next = finish; finish = run;if(run != tail)tail-next = ready;elseready = NULL;run-state = F;run = NULL;if(ready != NULL)firstin();elseif(ready != NULL)run-state = W;tail = run;run = ready; run - state = R; ready = ready - next; prt(r);printf( 輸出結束n);printf(*n); int cmp(const void *a,cons
19、t void *b)return (struct nod*)a)-needtime - (struct nod*)b)-needtime;void create3(char algo)int i,time;char na10;printf( 輸入進程號和運行時間:n);printf();for(i=0;iN;i+)scanf(%s,na);scanf(%d,&time);if(i!=N) printf();strcpy(pi.name,na);pi.cputime=0; pi.needtime=time; pi.waittime=0; pi.state=W;p1i=pi; qsort(p,N,
20、sizeof(p0),cmp);printf(短作業優先算法輸出信息:n);printf(*n);void prt3()printf(* 進程號 cpu時間 所需要時間 已等待時間 狀態 *n); void prit(int i)PC q=p1i;printf(* %-10s %-10d %-10d %-10d %-10c *n,q.name,q.cputime,q.needtime,q.waittime,q.state);void short_timefirst(char algo)PC q;int t;prt3();for(int j = 0; j N ; j+)pj.state = R;
21、for(int i=0;iN;i+)if(p1i.state = W) p1i.waittime=Tim;if(strcmp(pj.name,p1i.name)=0) p1i.state = R;prit(i);p1i.state = F;p1i.cputime=p1i.needtime;p1i.needtime=0;elseprit(i);pj.state = F;pj.cputime=pj.needtime;pj.needtime=0;pj.waittime=Tim;Tim+=pj.cputime;printf(*n); for(int i=0;iN;i+) prit(i);printf(
22、*n); printf( 輸出結束n);getchar();int main()int timeSlice; char algo; while(1)Num = 0;printf(t選擇算法:P 優先數算法n);printf(tt D 短作業優先算法n);printf(tt R 時間片輪轉算法n);printf();scanf(%c,&algo); if(algo!=R&algo!=P&algo!=D)printf(輸入錯誤!n);exit(0);printf( 輸入進程數:);printf();scanf(%d,&N); if(algo=P)create1(algo); priority(algo); else if(algo=R)printf( 請輸入時間片大小:n);printf(); scanf(%d,&timeSlice); create2(algo);Roundrun(timeSlice); else if(algo=D)create3(algo); short_timefirst(algo);return 0;专心-专注-专业