操作系统上机测试作业调度算法算法一、实验目的和要求(供参考)1.掌握作业调度功能和调度程序常用算法。
2.掌握利用C语言设计实现不同调度策略的作业调度算法。
3.验证不同作业调度算法对性能的影响。
二、实验环境(供参考)1.知识准备:学过进程管理、作业管理、处理机调度等章节的内容。
2.开发环境与工具:硬件平台——个人计算机。
软件平台——C语言开发环境。
三、实验内容用“先来先服务(FCFS)”算法和“最短作业优先(SJF)”算法模拟作业调度。
要求:按作业的到达顺序输入各作业需要的运行时间,按算法调度输出平均周转时间。
例如(FCFS),输入:8(到达时间0),5(到达时间2),7(到达时间3),1(到达时间6)J1 J2 J3 J40 8 13 20 21输出:aver=(8+(13-2)+(20-3)+(21-6))/4=51/4例如(SJF),输入:8(到达时间0),5(到达时间2),7(到达时间3),1(到达时间6)J1 J4 J2 J30 8 9 14 21输出:aver=(8+(9-6)+(14-2)+(21-3))/4=42/4注:输入的格式任意,只要输出平均周转时间即可。
四、代码(带注释)1、先来先服务实验结果(截图呈现)代码:#include <iostream>using namespace std;class Fcfs{private:int num[10]; //作业编号double arriveTime[10]; //到达时间double startTime[10]; //开始时间,进内存时间double workTime[10]; //工作时间double finishTime[10]; //完成时间double cirTime[10]; //存放每一个作业的周转时间//double freeTime[10]; //上一个作业已结束,但下一个作业还未到,存放这一段空闲时间public:Fcfs(int n) //n为作业数目{cout<<"默认第一个作业的到达时间为0。
"<<endl;for(int i=0;i<n;i++){num[i]=i+1; //给作业编号cout<<"第"<<num[i]<<"个作业:"<<endl;cout<<"请输入该作业的到达时间:";cin>>arriveTime[i];if(i==0)arriveTime[i]=0; //默认第一个作业的到达时间为0cout<<"请输入该作业的执行时间:";cin>>workTime[i];if(i==0){startTime[i]=0;finishTime[i]=workTime[i];//freeTime[i]=0;}else if(arriveTime[i]<=finishTime[i-1]) //如果后一个作业已到,而前一个作业未结束{startTime[i]=finishTime[i-1]; //则后一个作业的开始时间为上一个作业的结束时间finishTime[i]=startTime[i]+workTime[i];//freeTime[i]=0; //前一个一结束就开始工作,没有空闲时间}else if(arriveTime[i]>finishTime[i-1]){//freeTime[i]=arriveTime[i]-finishTime[i-1];//计算空闲时间,前一个作业已完成,但后一个作业还没到,中间空闲时间startTime[i]=arriveTime[i]; //由于来的时候前一个作业已完成,则该作业的开始时间即为它的到达时间finishTime[i]=startTime[i]+workTime[i];}cirTime[i]=finishTime[i]-arriveTime[i];}}//计算平均周转时间double getAverageCir(int n) //n为作业数{double averageCir,sumCir=0;for(int i=0;i<n;i++)sumCir+=cirTime[i];averageCir=sumCir/n;return averageCir;}//打印输出void print(int n) //n为作业数{cout<<"num\t"<<"arrive\t"<<"start\t"<<"work\t"<<"finish\t"<<"cir\t"<<endl;for(int i=0;i<n;i++){cout<<num[i]<<"\t"<<arriveTime[i]<<"\t"<<startTime[i]<<"\t"<<workTime[i]<<"\t"<<finish Time[i]<<"\t"<<cirTime[i]<<"\t"<<endl;}cout<<endl;cout<<"平均周转时间:"<<getAverageCir(n)<<endl;}};int main(){int n; //n为作业数目cout<<"请输入作业数目:";cin>>n;Fcfs f=Fcfs(n);f.print(n);return 0;}2.短作业优先代码:#include <iostream>using namespace std;class SJF{private:int num[10]; //作业编号double arriveTime[10]; //到达时间double startTime[10]; //开始时间,进内存时间double workTime[10]; //工作时间double finishTime[10]; //完成时间double cirTime[10]; //存放每一个作业的周转时间public:SJF(int n) //n为作业数目{int i;cout<<"默认第一个作业的到达时间为0。
"<<endl;for(i=0;i<n;i++){num[i]=i+1; //给作业编号cout<<"第"<<num[i]<<"个作业:"<<endl;cout<<"请输入该作业的到达时间:";cin>>arriveTime[i];if(i==0)arriveTime[i]=0; //默认第一个作业的到达时间为0cout<<"请输入该作业的执行时间:";cin>>workTime[i];if(i==0){startTime[i]=0;finishTime[i]=workTime[i];cirTime[i]=finishTime[i]-arriveTime[i];}else //排序{for(int j=1;j<i;j++) //i=当前作业数目-1,这里不能用num[i]表示当前作业数起泡排序法{for(int k=1;k<=i-j;k++)if(workTime[k]>workTime[k+1]){double temp;temp=num[k];num[k]=num[k+1];num[k+1]=temp;temp=arriveTime[k];arriveTime[k]=arriveTime[k+1];arriveTime[k+1]=temp;temp=workTime[k];workTime[k]=workTime[k+1];workTime[k+1]=temp;}}}}for(i=1;i<n;i++) //排序后计算各作业的开始、结束、周转时间{startTime[i]=finishTime[i-1];finishTime[i]=startTime[i]+workTime[i];cirTime[i]=finishTime[i]-arriveTime[i];}}//计算平均周转时间double getAverageCir(int n) //n为作业数{double averageCir,sumCir=0;for(int i=0;i<n;i++)sumCir+=cirTime[i];averageCir=sumCir/n;return averageCir;}//打印输出void print(int n) //n为作业数{cout<<"num\t"<<"arrive\t"<<"start\t"<<"work\t"<<"finish\t"<<"cir\t"<<endl;for(int i=0;i<n;i++){cout<<num[i]<<"\t"<<arriveTime[i]<<"\t"<<startTime[i]<<"\t"<<workTime[i]<<"\t"<<finish Time[i]<<"\t"<<cirTime[i]<<"\t"<<endl;}cout<<endl;cout<<"平均周转时间:"<<getAverageCir(n)<<endl;}};int main(){cout<<"-----短作业优先-----"<<endl;int n; //n为作业数目cout<<"请输入作业数目:";cin>>n;SJF f=SJF(n);f.print(n);return 0;}。