#include "stdio.h" #include "stdlib.h" #include "string.h" typedef struct node { char name[10]; /*進程標識符*/ int prio; /*進程優先數*/ int round; /*進程時間輪轉時間片*/ int cputime; /*進程占用CPU時間*/ int needtime; /*進程到完成還要的時間*/ int count; /*計數器*/ char state; /*進程的狀態*/ struct node *next; /*鏈指針*/ }PCB; PCB *finish,*ready,*tail,*run; /*隊列指針*/ int N; /*進程數*/ /*將就緒隊列中的第一個進程投入運行*/ firstin() { run=ready; /*就緒隊列頭指針賦值給運行頭指針*/ run->state='R'; /*進程狀態變為運行態*/ ready=ready->next; /*就緒對列頭指針后移到下一進程*/ } /*標題輸出函數*/ void prt1(char a) { if(toupper(a)=='P') /*優先數法*/ printf(" name cputime needtime priority state\n"); else printf(" name cputime needtime count round state\n"); } /*進程PCB輸出*/ void prt2(char a,PCB *q) { if(toupper(a)=='P') /*優先數法的輸出*/ printf(" %-10s%-10d%-10d%-10d %c\n",q->name, q->cputime,q->needtime,q->prio,q->state); else/*輪轉法的輸出*/ printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",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=finish; /*輸出完成隊列的PCB*/ while(p!=NULL) { prt2(algo,p); p=p->next; } getch(); /*壓任意鍵繼續*/ } /*優先數的插入算法*/ insert1(PCB *q) { PCB *p1,*s,*r; int b; s=q; /*待插入的PCB指針*/ p1=ready; /*就緒隊列頭指針*/ r=p1; /*r做p1的前驅指針*/ b=1; while((p1!=NULL)&&b) /*根據優先數確定插入位置*/ if(p1->prio>=s->prio) { r=p1; p1=p1->next; } else b=0; if(r!=p1) /*如果條件成立說明插入在r與p1之間*/ { r->next=s; s->next=p1; } else { s->next=p1; /*否則插入在就緒隊列的頭*/ ready=s; } } /*輪轉法插入函數*/ insert2(PCB *p2) { tail->next=p2; /*將新的PCB插入在當前就緒隊列的尾*/ tail=p2; p2->next=NULL; } /*優先數創建初始PCB信息*/ void create1(char alg) { PCB *p; int i,time; char na[10]; ready=NULL; /*就緒隊列頭指針*/ finish=NULL; /*完成隊列頭指針*/ run=NULL; /*運行隊列指針*/ printf("Enter name and time of process\n"); /*輸入進程標識和所需時間創建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) /*就緒隊列不空調用插入函數插入*/ insert1(p); else { p->next=ready; /*創建就緒隊列的第一個PCB*/ ready=p; } } clrscr(); printf(" output of priority:\n"); printf("************************************************\n"); prt(alg); /*輸出進程PCB信息*/ run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=ready->next; run->state='R'; } /*輪轉法創建進程PCB*/ void create2(char alg) { PCB *p; int i,time; char na[10]; ready=NULL; finish=NULL; run=NULL; printf("Enter name and time of round process\n"); 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->count=0; /*計數器*/ p->state='w'; p->round=2; /*時間片*/ if(ready!=NULL) insert2(p); else { p->next=ready; ready=p; tail=p; } } clrscr(); printf(" output of round\n"); printf("************************************************\n"); prt(alg); /*輸出進程PCB信息*/ run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=ready->next; run->state='R'; } /*優先數調度算法*/ priority(char alg) { while(run!=NULL) /*當運行隊列不空時,有進程正在運行*/ { run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->prio=run->prio-3; /*每運行一次優先數降低3個單位*/ if(run->needtime==0) /*如所需時間為0將其插入完成隊列*/ { run->next=finish; finish=run; run->state='F'; /*置狀態為完成態*/ run=NULL; /*運行隊列頭指針為空*/ if(ready!=NULL) /*如就緒隊列不空*/ firstin(); /*將就緒對列的第一個進程投入運行*/ } else /*沒有運行完同時優先數不是最大,則將其變為就緒態插入到就緒隊列*/ if((ready!=NULL)&&(run->prio<ready->prio)) { run->state='W'; insert1(run); firstin(); /*將就緒隊列的第一個進程投入運行*/ } prt(alg); /*輸出進程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)/*運行完將其變為完成態,插入完成隊列*/ { run->next=finish; finish=run; run->state='F'; run=NULL; if(ready!=NULL) firstin(); /*就緒對列不空,將第一個進程投入運行*/ } 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(); printf("type the algorithm:P/R(priority/roundrobin)\n"); scanf("%c",&algo); /*輸入字符確定算法*/ printf("Enter process number\n"); scanf("%d",&N); /*輸入進程數*/ if(algo=='P'||algo=='p') { create1(algo); /*優先數法*/ priority(algo); } else if(algo=='R'||algo=='r') { create2(algo); /*輪轉法*/ roundrun(algo); } }