操作系統(tǒng)時間片輪轉算法與優(yōu)先級調度算法_第1頁
操作系統(tǒng)時間片輪轉算法與優(yōu)先級調度算法_第2頁
操作系統(tǒng)時間片輪轉算法與優(yōu)先級調度算法_第3頁
操作系統(tǒng)時間片輪轉算法與優(yōu)先級調度算法_第4頁
操作系統(tǒng)時間片輪轉算法與優(yōu)先級調度算法_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、#include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct node char name10; /*進程標識符*/ int prio; /*進程優(yōu)先數*/ int round; /*進程時間輪轉時間片*/ int cputime; /*進程占用CPU時間*/ int needtime; /*進程到完成還要的時間*/ int count; /*計數器*/ char state; /*進程的狀態(tài)*/ struct node *next; /*鏈指針*/PCB

2、;PCB *finish,*ready,*tail,*run; /*隊列指針*/int N; /*進程數*/*將就緒隊列中的第一個進程投入運行*/firstin() run=ready; /*就緒隊列頭指針賦值給運行頭指針*/ run->state='R' /*進程狀態(tài)變?yōu)檫\行態(tài)*/ ready=ready->next; /*就緒對列頭指針后移到下一進程*/*標題輸出函數*/void prt1(char a) if(toupper(a)='P') /*優(yōu)先數法*/ printf(" name cputime needtime priorit

3、y staten"); else printf(" name cputime needtime count round staten");/*進程PCB輸出*/void prt2(char a,PCB *q) if(toupper(a)='P') /*優(yōu)先數法的輸出*/ printf(" %-10s%-10d%-10d%-10d %cn",q->name, q->cputime,q->needtime,q->prio,q->state); else/*輪轉法的輸出*/ printf(" %

4、-10s%-10d%-10d%-10d%-10d %-cn",q->name, q->cputime,q->needtime,q->count,q->round,q->state);/*輸出函數*/void prt(char algo) PCB *p; prt1(algo); /*輸出標題*/ if(run!=NULL) /*如果運行指針不空*/ prt2(algo,run); /*輸出當前正在運行的PCB*/ p=ready; /*輸出就緒隊列PCB*/ while(p!=NULL) prt2(algo,p); p=p->next; p=f

5、inish; /*輸出完成隊列的PCB*/ while(p!=NULL) prt2(algo,p); p=p->next; p=ready; printf("就緒隊列:"); while(p!=NULL) printf("%st",p->name); p=p->next; printf("n");p=finish; printf("完成隊列:"); while(p!=NULL) printf("%st",p->name); p=p->next; printf(&qu

6、ot;n"); getch(); /*壓任意鍵繼續(xù)*/*優(yōu)先數的插入算法*/insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /*待插入的PCB指針*/ p1=ready; /*就緒隊列頭指針*/ r=p1; /*r做p1的前驅指針*/ b=1; while(p1!=NULL)&&b) /*根據優(yōu)先數確定插入位置*/ if(p1->prio>=s->prio) r=p1; p1=p1->next; else b=0; if(r!=p1) /*如果條件成立說明插入在r與p1之間*/ r->next=s;

7、s->next=p1; else s->next=p1; /*否則插入在就緒隊列的頭*/ ready=s; /*輪轉法插入函數*/insert2(PCB *p2) tail->next=p2; /*將新的PCB插入在當前就緒隊列的尾*/ tail=p2; p2->next=NULL;/*優(yōu)先數創(chuàng)建初始PCB信息*/void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /*就緒隊列頭指針*/ finish=NULL; /*完成隊列頭指針*/ run=NULL; /*運行隊列指針*/ printf

8、("Enter name and time of processn"); /*輸入進程標識和所需時間創(chuàng)建PCB*/ for(i=1;i<=N;i+) p=malloc(sizeof(PCB); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W' p->prio=50-time; if(ready!=NULL) /*就緒隊列不空調用

9、插入函數插入*/ insert1(p); else p->next=ready; /*創(chuàng)建就緒隊列的第一個PCB*/ ready=p; / clrscr(); system("CLS"); printf(" output of priority:n"); printf("*n"); prt(alg); /*輸出進程PCB信息*/ run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=ready->next; run->state='R'/*輪轉法創(chuàng)建進程PCB*/void crea

10、te2(char alg) PCB *p; int i,time; char na10; ready=NULL; finish=NULL; run=NULL; printf("Enter name and time of round processn"); for(i=1;i<=N;i+) p=malloc(sizeof(PCB); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time;

11、 p->count=0; /*計數器*/ p->state='W' p->round=2; /*時間片*/ if(ready!=NULL) insert2(p); else p->next=ready; ready=p; tail=p; /clrscr(); system("CLS"); printf(" output of roundn"); printf("*n"); prt(alg); /*輸出進程PCB信息*/ run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=r

12、eady->next; run->state='R'/*優(yōu)先數調度算法*/priority(char alg) while(run!=NULL) /*當運行隊列不空時,有進程正在運行*/ run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->prio=run->prio-3; /*每運行一次優(yōu)先數降低3個單位*/ if(run->needtime=0) /*如所需時間為0將其插入完成隊列*/ run->next=finish; finish=r

13、un; run->state='F' /*置狀態(tài)為完成態(tài)*/ run=NULL; /*運行隊列頭指針為空*/ if(ready!=NULL) /*如就緒隊列不空*/ firstin(); /*將就緒對列的第一個進程投入運行*/ else /*沒有運行完同時優(yōu)先數不是最大,則將其變?yōu)榫途w態(tài)插入到就緒隊列*/ if(ready!=NULL)&&(run->prio<ready->prio) run->state='W' insert1(run); firstin(); /*將就緒隊列的第一個進程投入運行*/ prt(al

14、g); /*輸出進程PCB信息*/ /*時間片輪轉法*/roundrun(char alg) while(run!=NULL) run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->count=run->count+1; if(run->needtime=0)/*運行完將其變?yōu)橥瓿蓱B(tài),插入完成隊列*/ run->next=finish; finish=run; run->state='F' run=NULL; if(ready!=NULL) firs

15、tin(); /*就緒對列不空,將第一個進程投入運行*/ else if(run->count=run->round) /*如果時間片到*/ run->count=0; /*計數器置0*/ if(ready!=NULL) /*如就緒隊列不空*/ run->state='W' /*將進程插入到就緒隊列中等待輪轉*/ insert2(run); firstin(); /*將就緒對列的第一個進程投入運行*/ prt(alg); /*輸出進程信息*/ /*主函數*/main() char algo; /*算法標記*/ /clrscr(); system("CLS"); printf("type the algorithm:P/R(priority/roundrobin)n"); scanf("%c",&algo); /*輸入字符確定算法*/

溫馨提示

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

評論

0/150

提交評論