您好,欢迎访问三七文档
实验一进程调度一、实验目的编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解.二、实验内容1.采用“短进程优先”调度算法对五个进程进行调度。每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等。2.每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。三、实现思路主函数-输入函数-短作业优先调度函数-输出函数。这是一条最基础的思路。输入函数使用文本导入完成数据输入,输出函数输出调度结果,主函数完成各子函数连接,最主要的是短作业优先的调度函数。我想到的方法就是排序,不断选择需要运行时间最短的作业,接着进行数据输入计算输出等,遍历全部数据并完成调度。四、主要的数据结构structProcess_struct{charname[MaxNum];//进程名称intarrivetime;//到达时间intservertime;//开始运行时间intfinishtime;//运行结束时间intruntime;//运行时间intrunflag;//调度标志intorder;//运行次序doubleweightwholetime;//周转时间doubleaveragewt_FCFS,averagewt_SJF;//平均周转时间doubleaveragewwt_FCFS,averagewwt_SJF;//平均带权周转时间}pro[MaxNum];五、算法流程图10是否六、运行与测试用书上数据对程序进行测试,结果如下:运行程序看菜单,选操作0或input()输入导入函数SJF()-第一个先到达先执SJF()-选最短作业调度是否完成printf()输出调度结果运行结束另外随便添加一些数据进行测试,结果如下:代码实现:#includeiostream#includewindows.h#defineMaxNum100usingnamespacestd;structProcess_struct{charname[MaxNum];//进程名称intarrivetime;//到达时间intservertime;//开始运行时间intfinishtime;//运行结束时间intruntime;//运行时间intrunflag;//调度标志intorder;//运行次序doubleweightwholetime;//周转时间doubleaveragewt_FCFS,averagewt_SJF;//平均周转时间doubleaveragewwt_FCFS,averagewwt_SJF;//平均带权周转时间}pro[MaxNum];intN;//实际进程个数intSJF();//短作业优先函数intSJF(){inttemp_time=0;inti=0,j;intnumber,temp_counter;//进程编号,当前已执行进程个数floatrun_time;intmin=0;run_time=pro[i].runtime;j=1;while((jN)&&(pro[i].arrivetime==pro[j].arrivetime))//判断是否有两个进程同时到达{if(pro[j].runtimepro[i].runtime){run_time=pro[i].runtime;i=j;}j++;}for(j;jN;j++){while((jN)&&(pro[i].arrivetimepro[j].arrivetime))//选出第一个到达的进程{min=j;i=j;j++;}}number=min;//对第一个到达的进程赋值,计算pro[number].servertime=pro[number].arrivetime;pro[number].finishtime=pro[number].servertime+pro[number].runtime;pro[number].runflag=1;temp_time=pro[number].finishtime;pro[number].order=1;temp_counter=1;while(temp_counterN){for(j=0;jN;j++){if((pro[j].arrivetime=temp_time)&&(!pro[j].runflag)){run_time=pro[j].runtime;number=j;break;}}for(j=0;jN;j++)//选出最短的运行时间(最短作业){if((pro[j].arrivetime=temp_time)&&(!pro[j].runflag))if(pro[j].runtimerun_time){run_time=pro[j].runtime;number=j;}}pro[number].servertime=temp_time;//对最短作业进行赋值,计算pro[number].finishtime=pro[number].servertime+pro[number].runtime;pro[number].runflag=1;temp_time=pro[number].finishtime;temp_counter++;pro[number].order=temp_counter;}return0;}intinput();//进程参数输入intoutput();//调度结果输出voidmain(){intoption;printf(\n***********************************************\n);printf(主菜单\n);printf(***********************************************\n\n);printf(1使用短作业优先\n\n);printf(0退出\n\n);printf(***********************************************\n\n);printf(输入你想进行的操作:);scanf(%d,&option);printf(\n);switch(option){case0:printf(运行结束。\n);break;case1:printf(对进程用短作业优先调度。\n\n);input();SJF();output();break;}printf(点击任意键键继续...);getchar();}intinput()//进程参数输入{printf(请输入进程个数:\n);scanf(%d,&N);FILE*f;charbuf[100];char*p;if(NULL==(f=fopen(F:\\1111.txt,r)))//打开文件{fprintf(stderr,Cannotopenfile:1111.txt);return1;}inti=0,n=0;while(1)//导入数据{if(n==N)break;if(NULL==fgets(buf,100,f))break;if('\n'==buf[0])continue;//空行继续p=buf;sscanf(p,%c%d%d,&pro[n].name,&pro[n].arrivetime,&pro[n].runtime);n++;pro[n].servertime=0;pro[n].finishtime=0;pro[n].weightwholetime=0;pro[n].order=0;pro[n].runflag=0;}fclose(f);return0;}intoutput()//调度结果输出{inti;floatturn_round_time=0,f1,w=0;printf(进程名称到达运行开始运行结束执行顺序周转带权周转\n);for(i=0;iN;i++){pro[i].weightwholetime=pro[i].finishtime-pro[i].arrivetime;f1=pro[i].weightwholetime/pro[i].runtime;turn_round_time+=pro[i].weightwholetime;w+=f1;printf(%4s%8d%5d%7d%7d%7d%8.2f%7.2f\n,pro[i].name,pro[i].arrivetime,pro[i].runtime,pro[i].servertime,pro[i].finishtime,pro[i].order,pro[i].weightwholetime,f1);}printf(average_turn_round_timer=%1.2f\n,turn_round_time/N);printf(weight_average_turn_round_timer=%1.2f\n,w/N);return0;}
本文标题:短作业优先调度
链接地址:https://www.777doc.com/doc-3366700 .html