当前位置:文档之家› 作业调度算法C++实现

作业调度算法C++实现

学号: 姓名: 班级: 实验时间: 2011-10-10 实验编号002 实验名称 作业调度算法 实验目的和要求通过对作业调度算法的模拟加深对作业概念和作业调度算法的理解实验内容 (1) 模拟FCFS 算法实现作业调度 (2) 模拟短作业优先算法实现作业调度模拟最高相应比优先算法实现作业调度一、 实验题目输入:作业流文件,其中存储的是一系列要执行的作业,每个作业包括三个数据项:作业号、作业进入系统的时间(用一小数表示,如10:10,表示成10.10)、估计执行时间(单位小时,以十进制表示)参数用空格隔开,下面是示例:1 8.00 0.52 8.15 0.33 8.30 0.254 8.35 0.205 8.45 0.156 9.00 0.107 9.20 0.05其中调度时刻为最后一个作业到达系统的时间!输出:作业号 进入内存的时间,每行输出一个作业信息。

并输出每一种调度算法的平均周转时间和平均带权周转时间。

二、 算法设计思路首先用一个switch 函数做界面选择进入哪一种算法。

用一个内来定义作业float s;//提交时间float j;//执行时间float k;//开始时间float w;//完成时间float z;//周转时间float d;//带权周转时间1, 先来先服务,首先计算第一个作业的完成时间,周转时间,带权周转时间。

再用for 循环来计算剩下每一个作业的完成时间,周转时间,带权周转时间。

然后再算出平均周转时间和平均带权周转时间。

2, 短作业有优先,首先计算第一个作业的完成时间,周转时间,带权周转时间。

再用来计算其他作业的。

其中在for 循环中嵌套while 函数,在每一次计算前判断处于等待状态计算机操作系统 实验报告的作业个数,然后按执行时间,从短到长排序,将排在第一个的作业计算。

以此类推。

3.响应比,与短作业优先类似,只是在排序前,循环计算一次响应比,用一个数组来存放响应比,然后按照优先比从小到大排序,然后计算。

三、算法流程图主要的算法是响应比优先,所以这里只画了响应比优先的流程图,下面为响应比算法函数的代码:void xyb(zuoye a[]){int j=0,k=0,c=0,b=0;float m=0;float n=0;float x=0;float z[N];//存放z[]数组zuoye t;a[0].k=a[0].s;a[0].w=a[0].k+a[0].j;a[0].z=a[0].w-a[0].s;a[0].d=a[0].z/a[0].j;m=a[0].z;n=a[0].d;for(j=1;j<i;j++){k=j;while(a[k].s<=a[j-1].w&&k<i-1)//冒泡算法进行排序{k++;}for(c=j;c<k;c++)//计算响应比用z[]来存放{z[c]=(a[j-1].w-a[c].s)/a[c].j;}for(c=j;c<k;c++)//按响应比进行排序{for(b=c+1;b<k;b++){if(z[c]>z[b]){t=a[c];a[c]=a[b];a[b]=t;x=z[c];z[c]=z[b];z[b]=x;}}}a[j].k=a[j-1].w;a[j].w=a[j].k+a[j].j;a[j].z=a[j].w-a[j].s;a[j].d=a[j].z/a[j].j;m+=a[j].z;n+=a[j].d;}cout<<"响应比的平均周转时间为:"<<m/(float)i<<endl;cout<<"响应比的平均带权周转时间为:"<<n/(float)i<<endl; }根据以上的代码画出流程图如下:三、算法中用到的数据结构class zuoye{public:float s;//输入时间float j;//执行时间float k;//开始时间float w;//完成时间float z;//周转时间float d;//带权周转时间};void fcfs(zuoye a[]);//先来服务void dzy(zuoye a[]);//短作业优先void xyb(zuoye a[]);//响应比void mulu(zuoye a[]);//选择目录void shuchu(zuoye a[]);//输出结果四、算法的主要模块响应比函数是其中比较重要的模块,其中计算的过程:用循环函数for来计算,for(j=1;j<i;j++){k=j;while(a[k].s<=a[j-1].w&&k<i-1){k++;}/*用while函数来判断处于准备状态的工作,即输入时间<最后一个已完作业的完成时间 */for(c=j;c<k;c++){z[c]=(a[j-1].w-a[c].s)/a[c].j;}/*用循环函数来计算处于准备状态作业的响应比,在z[]为储存响应比的数组。

*/ for(c=j;c<k;c++){for(b=c+1;b<k;b++){if(z[c]>z[b]){t=a[c];a[c]=a[b];a[b]=t;x=z[c];z[c]=z[b];z[b]=x;}}/*用冒泡算法按照响应比的大小,从小到大将作业进行排序*/ }a[j].k=a[j-1].w;a[j].w=a[j].k+a[j].j;a[j].z=a[j].w-a[j].s;a[j].d=a[j].z/a[j].j;m+=a[j].z;//计算总的周转时间n+=a[j].d;//计算总的带权周转时间}五、实验代码#include"iostream.h"# define N 30int i=0;class zuoye{public:float s;//输入时间float j;//执行时间float k;//开始时间float w;//完成时间float z;//周转时间float d;//带权周转时间};void fcfs(zuoye a[]);//先来服务void dzy(zuoye a[]);//短作业优先void xyb(zuoye a[]);//响应比void mulu(zuoye a[]);//选择目录void shuchu(zuoye a[]);//输出结果void main(){zuoye a[N];cout<<"输入0,0结束";do{cout<<"请输入第"<<i+1<<"组数据:";cin>>a[i].s>>a[i].j;i++;}while(i<N&&a[i-1].s!=0);//用do...while函数来控制输入mulu(a);shuchu(a);}void mulu(zuoye a[]){int m;cout<<"请选择算法:"<<endl;cout<<"1.先来先服务算法;"<<endl;cout<<"2.短作业优先;"<<endl;cout<<"3.优先比算法;"<<endl;cin>>m;switch(m) //switch函数来选择算法{case 1:fcfs(a);break;case 2:dzy(a);break;case 3:xyb(a);break;default:{cout<<"错误,请重新输入!"<<endl;mulu(a);}}}void shuchu(zuoye a[]){cout<<"提交\t"<<"执行\t"<<"开始\t"<<"完成\t"<<"周转\t"<<"带权周转"<<endl;int j;for(j=0;j<i;j++){cout<<a[j].s<<"\t"<<a[j].j<<"\t"<<a[j].k<<"\t"<<a[j].w<<"\t"<<a[j].z<<"\t"< <a[j].d<<endl;}}void fcfs(zuoye a[]){int j=1;float m=0;//总周转时间float n=0;//总带权周转时间a[0].k=a[0].s;a[0].w=a[0].k+a[0].j;a[0].z=a[0].w-a[0].s;a[0].d=a[0].z/a[0].j;m=a[0].z;n=a[0].d;for(j=1;j<i;j++){a[j].k=a[j-1].w;//开始时间a[j].w=a[j].k+a[j].j;//完成时间a[j].z=a[j].w-a[j].s;//周转时间a[j].d=a[j].z/a[j].j;//带权周转时间m+=a[j].z;n+=a[j].d;}cout<<"fcfs平均周转时间为:"<<m/(float)i<<endl;cout<<"fcfs平均带权周转时间为:"<<n/(float)i<<endl;}void dzy(zuoye a[]){int j=0,k=0,c=0,b=0;float m=0;float n=0;zuoye t;a[0].k=a[0].s;a[0].w=a[0].k+a[0].j;a[0].z=a[0].w-a[0].s;a[0].d=a[0].z/a[0].j;m=a[0].z;n=a[0].d;for(j=1;j<i;j++){k=j;while(a[k].s<=a[j-1].w&&k<i-1)//while函数判断处于准备状态的作业{k++;}for(c=j;c<k;c++)//冒泡算法进行排序{for(b=c+1;b<k;b++){if(a[c].j>a[b].j){t=a[c];a[c]=a[b];a[b]=t;}}}a[j].k=a[j-1].w;a[j].w=a[j].k+a[j].j;a[j].z=a[j].w-a[j].s;a[j].d=a[j].z/a[j].j;m+=a[j].z;n+=a[j].d;}cout<<"短作业优先的平均周转时间为:"<<m/(float)i<<endl;cout<<"短作业优先的平均带权周转时间为:"<<n/(float)i<<endl; }void xyb(zuoye a[]){int j=0,k=0,c=0,b=0;float m=0;float n=0;float x=0;float z[N];//存放z[]数组zuoye t;a[0].k=a[0].s;a[0].w=a[0].k+a[0].j;a[0].z=a[0].w-a[0].s;a[0].d=a[0].z/a[0].j;m=a[0].z;n=a[0].d;for(j=1;j<i;j++){k=j;while(a[k].s<=a[j-1].w&&k<i-1)//冒泡算法进行排序{k++;}for(c=j;c<k;c++)//计算响应比用z[]来存放{z[c]=(a[j-1].w-a[c].s)/a[c].j;}for(c=j;c<k;c++)//按响应比进行排序{for(b=c+1;b<k;b++){if(z[c]>z[b]){t=a[c];a[c]=a[b];a[b]=t;x=z[c];z[c]=z[b];z[b]=x;}}}a[j].k=a[j-1].w;a[j].w=a[j].k+a[j].j;a[j].z=a[j].w-a[j].s;a[j].d=a[j].z/a[j].j;m+=a[j].z;n+=a[j].d;}cout<<"响应比的平均周转时间为:"<<m/(float)i<<endl;cout<<"响应比的平均带权周转时间为:"<<n/(float)i<<endl; }运行结果及结果分析实验数据:1 8.00 0.52 8.15 0.33 8.30 0.254 8.35 0.205 8.45 0.156 9.00 0.107 9.20 0.051.先来先服务算法,输入作业数据,结果如下图:先来先服务算法结果图输入数据,知道0,0结束输入,通过1,2,3选择需要的算法,输出平均的周转时间和平均带权周转时间,下面为具体的每一个作业提交时间,执行时间,开始时间,完成时间,周转时间和带权周转时间。

相关主题