您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 理学 > 基于优先数和轮转时间片的进程调度算法
#includestdio.h#includestdlib.h#includestring.h#includectype.h/*进程控制块数据结构*/typedefstructnode{charname[10];/*进程名*/intprio;/*进程优先级*/intround;/*进程分配的时间片*/intcputime;/*进程消耗的CUP时间*/intneedtime;/*进程需要的CUP时间*/intcount;/*进程运行时间*/charstate;/*进程的状态:'R':运行,'W':等待,'F':结束*/structnode*next;/*指向下一个进程的指针*/}PCB;PCB*finish,*ready,*tail,*run;/*指向三个队列的队首的指针,tail为就绪队列的队尾指针*/intN;/*定义进程的数目*//*函数功能:将进程就绪队列中第一个放进就绪队列函数原型:voidfirstin(void)函数参数:void函数返回值:void*/voidfirstin(void){if(ready!=NULL){run=ready;ready=ready-next;run-state='R';run-next=NULL;}else{run=NULL;}}/*函数功能:输出进程信息的标题函数函数原型:voidprt1(chara)函数参数:chara:a=='p'为优先级,=='r'为时间片轮转函数返回值:void*/voidprt1(chara){if(toupper(a)=='P'){printf(namecputimeneedtimeprioritystate\n);}else{printf(namecputimeneedtimecountroundstate\n);}}/*函数功能:输出单个进程信息的函数函数原型:voidprt2(chara,PCB*p)函数参数:chara:a=='p'为优先级,=='r'为时间片轮转PCB*p为指向待输出的进程控制块的指针函数返回值:void*/voidprt2(chara,PCB*p){if(toupper(a)=='P'){printf(%-10s,%-10d,%-10d,%-10d,%-5c\n,p-name,p-cputime,p-needtime,p-prio,p-state);}else{printf(%-10s,%-10d,%-10d,%-10d,%-10d,%-5c\n,p-name,p-cputime,p-needtime,p-count,p-round,p-state);}}/*函数功能:输出所有进程信息的函数函数原型:voidprt(charalgo)函数参数:chara:a=='p'为优先级,=='r'为时间片轮转函数返回值:void*/voidprt(charalgo){PCB*p;prt1(algo);if(run!=NULL){prt2(algo,run);}p=ready;while(p!=NULL){prt2(algo,p);p=p-next;}p=finish;while(p!=NULL){prt2(algo,p);p=p-next;}getchar();}/*函数功能:优先级法调度将进程插入到就绪队列算法函数原型:voidinsert1(PCB*q)函数参数:PCB*q待插入的队列进程控制块优先级越高,插入越靠前函数返回值:void*/voidinsert1(PCB*q){PCB*p,*s,*r;/*p,r用来控制就绪队列滚动,S指向插入的队列*/intb;/*b作为插入控制标志的*/s=q;p=ready;r=p;b=1;if(s-prio=ready-prio){s-next=ready;ready=s;}else{while((p!=NULL)&&b){if(p-prio=s-prio){r=p;p=p-next;}else{b=0;}}s-next=p;r-next=s;}}/*函数功能:时间片轮转算法调度将进程插入到就绪队列算法函数原型:voidinsert2(PCB*q)函数参数:PCB*q待插入的队列进程控制块函数返回值:void*/voidinsert2(PCB*q){tail-next=q;tail=q;q-next=NULL;}/*函数功能:采用优先级进程调度法时,进程初始化函数函数原型:voidpcreate_task(charalgo)函数参数:charalgo:函数返回值:void*/voidpcreate_task(charalgo){PCB*p;inti,time;charna[10];ready=NULL;finish=NULL;run=NULL;for(i=0;iN;i++){p=(PCB*)malloc(sizeof(PCB));printf(Enterthenameofprocess\n);scanf(%s,na);printf(Enterthetimeofprocess\n);scanf(%d,&time);strcpy(p-name,na);p-cputime=0;p-needtime=time;p-state='W';p-prio=time;if(ready==NULL){ready=p;ready-next=NULL;}else{insert1(p);}printf(Outputthewaitingprocessesinformation\n);prt(algo);}firstin();}/*函数功能:采用时间片轮转法进程调度法时,进程初始化函数函数原型:voidrcreate_task(charalgo)函数参数:charalgo:R函数返回值:void*/voidrcreate_task(charalgo){PCB*p;inti,time;charna[10];ready=NULL;finish=NULL;run=NULL;for(i=0;iN;i++){p=(PCB*)malloc(sizeof(PCB));printf(Enterthenameofprocess\n);scanf(%s,na);printf(Enterthetimeofprocess\n);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;}printf(Outputthewaitingprocessesinformation\n);prt(algo);}run=ready;ready=ready-next;run-state='R';}/*函数功能:采用优先级进程调度法时,进程调度函数函数原型:voidpriority(charalgo)函数参数:charalgo:进程调度类别标志:'P'优先级'R'时间片轮转函数返回值:void*/priority(charalgo){while(run!=NULL){run-cputime+=1;run-needtime-=1;run-prio-=3;if(run-needtime==0){run-next=finish;finish=run;run-state='F';run=NULL;firstin();}else{if((ready!=NULL)&&(run-prioready-prio)){run-state='W';insert1(run);run=NULL;firstin();}}prt(algo);}}/*函数功能:采用时间片轮转法进程调度法时,进程调度函数函数原型:voidroundrun(charalgo)函数参数:charalgo:R函数返回值:void*/voidroundrun(charalgo){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;if(ready!=NULL){run-state='W';insert2(run);firstin();}}}prt(algo);}}/*main函数*/intmain(){charalgo;printf(ChoosethetypeofattemperP:priorityR:timeround\n);scanf(%c,&algo);printf(PleaseenterthenumberofprocessesN:\n);scanf(%d,&N);if((algo=='P')||(algo=='p')){pcreate_task(algo);priority(algo);}elseif((algo=='r')||(algo=='R')){rcreate_task(algo);roundrun(algo);}}
本文标题:基于优先数和轮转时间片的进程调度算法
链接地址:https://www.777doc.com/doc-1206631 .html