操作系统实验 四种调度算法
调度算法实验计算机科学与技术学院计0810813022026 高宁实验目的:1. 掌握进程控制块的概念,理解基本的进程调度算法。实验内容:1. FCFS2. 短作业优先算法3. 优先级调度算法4最高响应比调度算法实验源程序:#include<iostream> #include<iomanip> #include<fstream> using namespace std;class JOB /定义作业数据结构体public:int number; /作业个数int reach_time; /作业到达时间int reach_hour; int reach_minite; int need_time; /作业运行时间int privilege; /优先级float excellent; int start_time; /开始时间int wait_time; /等待时间int visited; /已读取次数public:JOB()number=0;reach_time=0;reach_hour=0;reach_minite=0;need_time=0;privilege=0;excellent=0.0;start_time=0;wait_time=0;visited=0;JOB& Copy(JOB js)int i=0;while(jsi.number&&jsi.number>0)i+;JOB *js2=new JOBi;for(int j=0;j<i;j+)js2j.number=jsj.number;js2j.reach_time=jsj.reach_time;js2j.reach_hour=jsj.reach_hour;js2j.reach_minite=jsj.reach_minite;js2j.need_time=jsj.need_time;js2j.privilege=jsj.privilege;js2j.excellent=jsj.excellent;js2j.start_time=jsj.start_time;js2j.wait_time=jsj.wait_time;return *js2; /FIFO算法 void FIFO(JOB job,int quantity) JOB *jobs;jobs=(&jobs->Copy (job);int current_hour; int current_minute; int total_time=0; /输出作业流 cout<<endl; cout<<endl<<"FIFO调度算法:"<<endl; cout.setf(2); cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(12)<<"开始时间:"<<setw(14)<<"周转时间(分):"<<endl; current_hour=jobs0.reach_hour; current_minute=jobs0.reach_minite; for(int i=0;i<quantity;i+) jobsi.start_time=current_hour*100+current_minute; jobsi.wait_time=(current_hour-jobsi.reach_hour)*60+(current_minute-jobsi.reach_minite)+jobsi .need_time; cout<<setw(10)<<jobsi.number<<setw(12)<<jobsi.reach_time<<setw(12)<<jobsi.start_time<<setw(14)<<jobsi.wait_time<<endl; current_hour=current_hour+(jobsi.need_time+current_minute)/60; current_minute=(jobsi.need_time+current_minute)%60; total_time+=jobsi.wait_time; cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; /运算时间短的作业优先算法 void Shorter(JOB job,int quantity) JOB *jobs;jobs=(&jobs->Copy (job);int i,j,p; int current_hour; int current_minute; int current_need_time; int total_time=0; /输出作业流 cout<<endl; cout<<endl<<"时间短作业优先算法:"<<endl; cout.setf(2); cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(14)<<"所需时间(分):"<<setw(12)<<"开始时间:"<<setw(14)<<"周转时间(分):"<<endl; current_hour=jobsquantity-1.reach_hour; current_minute=jobsquantity-1.reach_minite; for(i=0;i<quantity;i+) current_need_time=30000; for(j=0;j<quantity;j+) if(jobsj.visited=0)&&(jobsj.need_time<current_need_time) p=j; current_need_time=jobsj.need_time; jobsp.start_time=current_hour*100+current_minute; jobsp.wait_time=(current_hour-jobsp.reach_hour)*60+(current_minute-jobsp.reach_minite)+jobsp .need_time; cout<<setw(10)<<jobsp.number<<setw(12)<<jobsp.reach_time<<setw(14)<<jobsp.need_time<<setw(12)<<jobsp.start_time<<setw(14)<<jobsp.wait_time<<endl; current_hour=current_hour+(jobsp.need_time+current_minute)/60; current_minute=(jobsp.need_time+current_minute)%60; jobsp.visited=1; total_time+=jobsp.wait_time; cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; /优先数调度算法 void Privilege(JOB job,int quantity) JOB *jobs;jobs=(&jobs->Copy (job);int i,j,p; int current_hour; int current_minute; int current_privilege; int total_time=0; /输出作业流 cout<<endl; cout<<endl<<"优先数调度算法:"<<endl; cout.setf(2); cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(14)<<"优先级:(0>1):"<<setw(12)<<"开始时间:"<<setw(14)<<"周转时间(分):"<<endl; current_hour=jobsquantity-1.reach_hour; current_minute=jobsquantity-1.reach_minite; for(i=0;i<quantity;i+) current_privilege=30000; for(j=0;j<quantity;j+) if(jobsj.visited=0)&&(jobsj.privilege<current_privilege) p=j; current_privilege=jobsj.privilege; jobsp.start_time=current_hour*100+current_minute; jobsp.wait_time=(current_hour-jobsp.reach_hour)*60+(current_minute-jobsp.reach_minite)+jobsp .need_time; cout<<setw(10)<<jobsp.number<<setw(12)<<jobsp.reach_time<<setw(14)<<jobsp.privilege<<setw(12)<<jobsp.start_time<<setw(14)<<jobsp.wait_time<<endl; current_hour=current_hour+(jobsp.need_time+current_minute)/60; current_minute=(jobsp.need_time+current_minute)%60; jobsp.visited=1; total_time+=jobsp.wait_time; cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; /响应比最高者优先调度算法 void Excellent(JOB job,int quantity) JOB *jobs;jobs=(&jobs->Copy (job);int i,j,p; int current_hour; int current_minute; float current_excellent; int total_time=0; /输出作业流 cout<<endl; cout<<endl<<"响应比高者优先调度算法:"<<endl; cout.setf(2); cout<<setw(10)<<"作业号"<<setw(12)<<"到达时间"<<setw(12)<<"开始时间"<<setw(14)<<"周转时间(分)"<<endl; current_hour=jobsquantity-1.reach_hour; current_minute=jobsquantity-1.reach_minite; for(i=0;i<quantity;i+) current_excellent=-1; for(j=0;j<quantity;j+) if(jobsj.visited=0) jobsj.wait_time=(current_hour-jobsj.reach_hour)*60+(current_minute-jobsj.reach_minite); jobsj.excellent=(float)(jobsj.wait_time/jobsj.need_time); for(j=0;j<quantity;j+) if(jobsj.visited=0)&&(jobsj.excellent>current_excellent) p=j; current_excellent=jobsj.excellent; jobsp.start_time=current_hour*100+current_minute; jobsp.wait_time=(current_hour-jobsp.reach_hour)*60+(current_minute-jobsp.reach_minite)+jobsp .need_time; cout<<setw(10)<<jobsp.number<<setw(12)<<jobsp.reach_time<<setw(12)<<jobsp.start_time<<setw(14)<<jobsp.wait_time<<endl; current_hour=current_hour+(jobsp.need_time+current_minute)/60; current_minute=(jobsp.need_time+current_minute)%60; jobsp.visited=1; total_time+=jobsp.wait_time; cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; int main(void) cout<<"*调度模拟*nnn"<<endl;int quantity=0; /数量JOB jobsMAXJOB; cout<<"请输入作业数据文件名:n" FILE *fp; char fname20; cin>>fname; fp=fopen(fname,"r");/以只读方式打开文件if(!fp) cout<<"打开文件错误!)"<<endl; elsewhile(!feof(fp) fscanf(fp,"%d %d %d %d",&jobsquantity.number,&jobsquantity.reach_time,&jobsquantity.need_time,&jobsquantity.privilege);jobsquantity.reach_hour=jobsquantity.reach_time/100; jobsquantity.reach_minite=jobsquantity.reach_time%100; quantity+; /输出初始作业数据 cout<<"初始作业数据:"<<endl; cout.setf(2); cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(14)<<"所需时间(分):"<<setw(14)<<"优先级:(0>1)"<<endl; for(int i=0;i<quantity;i+) cout<<setw(10)<<jobsi.number<<setw(12)<<jobsi.reach_time<<setw(14)<<jobsi.need_time<<setw(14)<<jobsi.privilege<<endl; lb:cout<<"请选择调度算法:n"cout<<"tt1-先进先出调度算法n"cout<<"tt2-短作业优先n"cout<<"tt3-优先级调度算法n"cout<<"tt4-响应比最高调度算法"<<endl;int flag=0;la:cin>>flag;switch (flag)case 1:FIFO(jobs,quantity); break;/先进先出调度算法case 2:Shorter(jobs,quantity);break;/短作业优先case 3:Privilege(jobs,quantity);break; /优先级调度算法case 4:Excellent(jobs,quantity);break; /响应比最高调度算法default:cout<<"请输入1-4之间的数"<<endl;goto lb;goto la;return 0;数据文件:data.txt1 700 40 12 723 32 23 821 25 34 823 21 45 900 15 66 912 10 47 930 51 5总结及程序简介:1 首先将数据存在data.txt文件中,在主函数中读入数据存入数组jobs中2定义类JOB包含属性:int number; /作业个数int reach_time; /作业到达时间int reach_hour; int reach_minite; int need_time; /作业运行时间int privilege; /优先级float excellent; int start_time; /开始时间int wait_time; /等待时间int visited; /已读取次数方法:构造函数JOB() 复制函数Copy()实现一个对象2 分别实现调度算法,然后在主函数中依次调用调试结果: