当前位置:文档之家› CPU调度算法

CPU调度算法

一、设计目的通过CPU调度相关算法的实现,了解CPU调度的相关知识,通过实现CPU调度算法,理解CPU的管理,以及不同的CPU调度算法实现过程。

体会算法的重要性。

二、设计要求1、编写算法,实现FCFS、非抢占SJF、可抢占优先权调度2、针对模拟进程,利用CPU调度算法进行调度3、进行算法评估,计算平均周转时间和平均等待时间4、调度所需的进程参数由输入产生(手工输入或者随机数产生)5、输出调度结果6、输出算法评价指标三、设计说明1、采用数组、指针2、FCFS先来先服务调度算法是一种最简单的调度算法,当作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个最先进入该队列的作业3、非抢占SJF短作业优先调度算法,是指对短作业有限调度算法。

是从后备队列中选择一个估计运行时间最短的作业将他们调入内存。

4、可抢占优先权调度在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。

但在其执行期间,只要出现另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理及分配给新到的优先权最高的进程。

四、程序流程图。

1、可抢占优先权调度算法2、FCFS3、非抢占SJF五、程序部分1、FCFS#include<stdio.h>#include<stdlib.h>typedef struct PCB{char name[10];char state;int arrivetime;int starttime;int finishtime;int servicetime;float turnaroundtime;float weightedturnaroundtime;struct PCB *next;}pcb;int time;int n;pcb *head=NULL,*p,*q;void run_fcfs(pcb *p1){time=p1->arrivetime>time?p1->arrivetime:time;p1->starttime=time;printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);time+=p1->servicetime;p1->state="T";p1->finishtime=time;p1->turnaroundtime=p1->finishtime-p1->arrivetime;p1->weightedturnaroundtime=p1->turnaroundtime/p1->servicetime;printf(" 到达时间开始时间服务时间完成时间周转时间带权周转时间\n ");printf("%6d%10d%10d%8d%10.1f%10.2f\n",p1->arrivetime,p1->starttime,p1->servicetime,p1->finishtime,p1->turnaroundtime,p1->weightedtu rnaroundtime);}void fcfs(){int i,j;p=head;for(i=0;i<n;i++){if(p->state=='F'){q=p;run_fcfs(q);}p=p->next;}}void getInfo(){int num;printf("\n作业个数:");scanf("%d",&n);for(num=0;num<n;num++){p=(pcb*)malloc(sizeof(pcb));printf("依次输入:进程名到达时间服务时间\n");scanf("%s%d%d",&p->name,&p->arrivetime,&p->servicetime);if(head==NULL){head=p;q=p;time=p->arrivetime;}if(p->arrivetime<time)time=p->arrivetime;q->next=p;p->starttime=0;p->finishtime=0;p->turnaroundtime=0;p->weightedturnaroundtime=0;p->next=NULL;p->state='F';q=p;}}void main(){ system("graftabl 936");printf("先来先服务算法模拟");getInfo();p=head;fcfs();getch();}2、非抢占SJF#include<stdio.h>#include<conio.h>#define MAX 100struct jcb{char name[10];float arrivetime;float starttime;float finishtime;float servicetime;float zztime;float avezztime;};struct jcb a[MAX];void input(jcb *p,int N){ int i;printf("请分别输入\n\t进程名到达时间服务时间\n\n");for(i=0;i<=N-1;i++){printf("请输入第%d个进程信息:",i+1);scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);printf("\n");}}void Print(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float avezztime,int N){int k;printf("调度顺序:");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->%s",p[k].name);}printf("\n\n");printf("\t\t\t进程信息:\n");printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n");for(k=0;k<=N-1;k++){printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].serviceti me,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].avezztime);}}void sort(jcb *p,int N){int i,j;for(i=0;i<=N-1;i++)for(j=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){jcb temp;temp=p[i];p[i]=p[j];p[j]=temp;}}void deal(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &avezztime,int N){int k;for(k=0;k<=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k<=N-1;k++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].avezztime=p[k].zztime/p[k].servicetime;}}void jcbf(jcb *p,int N){ float arrivetime=0, servicetime=0, starttime=0, finishtime=0, zztime=0, avezztime=0; int m,n,next,k,i=0;float min;sort(p,N);for(m=0;m<N-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[m].finishtime=p[m-1].finishtime+p[m].servicetime;for( n=m+1;n<=N-1;n++){if(p[n].arrivetime<=p[m].finishtime)i++;}min=p[m+1].servicetime;next=m+1;for(k=0;k<m+i;k++){if(p[k+1].servicetime<min){min=p[k+1].servicetime;next=k+1;}}{jcb temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);}}int main(){int N,*b; char ch;while(1){system("CLS");system("graftabl 936");printf("\t\t\t------短作业优先调度算法------\n");printf("输入进程个数:");scanf("%d",&N);if(N>MAX){printf("\t!!输入的作业数目太大,请输入不大于%d的整数\n",MAX);printf("按Q或者q退出程序,按其他任意键继续测试...");ch=getch();if(ch=='Q'||ch=='q'){break;}else continue;}input(a,N);jcb *b=a;jcbf(b,N);printf("按Q或者q退出程序,按其他任意键继续测试...");ch=getch();if(ch=='Q'||ch=='q'){}}return 0;getch();}3、可抢占优先权调度算法#include<dos.h>#include<time.h>#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<string.h>typedef char string[10];struct task{string name;int arrTime;int serTime;int waiTime;int begTime;int finTime;int turTime;int wTuTime;int priority;int finish;}JCB[10];int num;void input(){int i;system("cls");printf("\n请输入作业数量:");scanf("%d",&num);for(i=0;i<num;i++){printf("\n请输入作业NO.%d:\n",i);printf("作业名称:");scanf("%s",JCB[i].name);printf("到达时间:");scanf("%d",&JCB[i].arrTime);printf("服务时间:");scanf("%d",&JCB[i].serTime);JCB[i].priority=0;JCB[i].finish=0;}}int HRN(int pre){int current=1,i,j;for(i=0;i<num;i++){JCB[i].waiTime=JCB[pre].finTime-JCB[i].arrTime;JCB[i].priority=(JCB[i].waiTime+JCB[i].serTime)/JCB[i].serTime; }for(i=0;i<num;i++){if(!JCB[i].finish)current=i;break;}}for(j=i;j<num;j++){if(!JCB[j].finish){if(JCB[current].arrTime<=JCB[pre].finTime){if(JCB[j].arrTime<=JCB[pre].finTime&&JCB[j].priority>JCB[current].priority)current=j;}else{if(JCB[j].arrTime<JCB[current].arrTime)current=j;if(JCB[j].arrTime==JCB[current].arrTime)if(JCB[j].priority>JCB[current].priority)current=j;}}}return current;}void runing(int i,int times,int pre,int staTime,int endTime){if(times=0){JCB[i].begTime=JCB[i].arrTime;JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;JCB[i].turTime=JCB[i].serTime;JCB[i].wTuTime=1.0;staTime=JCB[i].begTime;}else{if(JCB[i].arrTime>JCB[pre].finTime)JCB[i].begTime=JCB[i].arrTime;elseJCB[i].begTime=JCB[pre].finTime;JCB[i].finTime=JCB[i].begTime+JCB[i].serTime;JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime;JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime;}if(times==num-1)endTime=JCB[i].finTime;JCB[i].finish=1;}void print(int i,int times){if(times==0){printf("名称到达时间服务时间开始时间完成时间周转时间带权周转时间\n");}printf("%3s%9d%9d%9d%9d%9d%9d\n",JCB[i].name,JCB[i].arrTime,JCB[i].serTime,JCB[i].be gTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime);}void check(){int i;int staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime;int current=0,times=0,pre=0;JCB[pre].finTime=0;for(i=0;i<num;i++){JCB[i].finish=0;}staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime;current=0;times=0;pre=0;printf("-------------------------------------------\n");for(i=0;i<num;i++){JCB[i].finish=0;}staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime;current=0;times=0;pre=0;printf("-------HRRN-------------------------------------\n");for(times=0;times<num;times++){current=HRN(pre);runing(current,times,pre,staTime,endTime);print(current,times);pre=current;}for(i=0;i<num;i++){sumTurTime+=JCB[i].turTime;sumWTuTime+=JCB[i].wTuTime;}aveturTime=sumTurTime/num;aveWTuTime=sumWTuTime/num;printf("<计与平均值>%9d%9d%9d%9d\n",NULL,sumTurTime,aveturTime,aveWTuTime);printf("-------------------------------------------------------\n");}void main(){char again;system("graftabl 936");do{system("cls");printf("请输入4组数据:");input();check();printf("Continue...(Y/N):");do{again=getch();}while(again!='Y'&&again!='y'&&again!='N'&&again!='n');}while(again=='Y'||again=='y');getch();}六、运行结果七、实验总结1、FCFS算法,即先来先服务,就是每次从就绪队列中选择一个最先进入队列的进程,把CPU分配给它,令它运行。

相关主题