您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > FCFS和SJF进程调度算法实验报告
xx大学操作系统实验报告姓名:学号:班级:实验日期:实验名称:先来先服务FCFS和短作业优先SJF进程调度算法实验一先来先服务FCFS和短作业优先SJF进程调度算法1.实验目的:通过这次实验,理解FCFS和SJF进程调度算法的运行原理,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。:2.需求分析(1)输入的形式和输入值的范围;输入:进程个数N范围:0N=100依次输入(进程名进程到达时间范围:0time=100进程服务时间)范围:0time=100选择一种算法:1—FCFS,2—SJF范围:1或2或00—退出(2)输出的形式进程名字到达时间运行时间开始运行时间结束时间执行顺序周转时间带权周转时间时刻*:进程*开始运行************************时刻*:进程*开始运行************************。。。。平均周转时间:平均带权周转时间:(3)程序所能达到的功能输入进程的个数N,以及每个进程的到达时间和运行时间。通过选择FCFS或是SJF进程调度算法进行调度,计算出每个进程的开始运行时间、结束时间、执行顺序、周转时间、带权周转时间,并最终求得平均周转时间和平均带权周转时间。(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。正确一(FCFS)正确二(SJF)输入参数错误3、概要设计所有抽象数据类型的定义:staticintMaxNum=100;intArrivalTime[MaxNum];//到达时间intServiceTime[MaxNum];//服务时间intFinishTime[MaxNum];//结束时间intWholeTime[MaxNum];//周转时间doubleWeightWholeTime[MaxNum];//带权周转时间doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间doubleAverageWWT_FCFS,AverageWWT_SJF;//平均带权周转时间主程序的流程:变量初始化接受用户输入的N,T1…..Tn,S1….Sn;选择算法进行进程调度,计算进程的开始运行时间、结束时间、执行顺序、周转时间、带权周转时间;计算所有进程的平均周转时间、平均带权周转时间;按照格式输出调度结果。各程序模块之间的层次(调用)关系Main函数通过对Pinput函数进行调用,对函数的成员变量进行赋值,再通过算法的选择对算法函数进行选择调用,求出题目要求的各个数据结果,最后通过Poutput函数对结果进行格式输出。4、详细设计实现程序模块的具体算法。intFCFS(){//先来先服务算法inti;inttemp_time=0;temp_time=Process[0].ArrivalTime;for(i=0;iN;i++){Process[i].ServiceTime=temp_time;Process[i].FinishTime=Process[i].ServiceTime+Process[i].WholeTime;Process[i].run_flag=1;temp_time=Process[i].FinishTime;Process[i].order=i+1;}return0;}intSJF()//短作业优先算法{inttemp_time=0;inti=0,j;intnumber_schedul,temp_counter;doublerun_time;run_time=Process[i].WholeTime;j=1;while((jN)&&(Process[i].ArrivalTime==Process[j].ArrivalTime)){if(Process[j].WholeTimeProcess[i].WholeTime){run_time=Process[i].WholeTime;i=j;}j++;}number_schedul=i;Process[number_schedul].ServiceTime=Process[number_schedul].ArrivalTime;Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime+Process[number_schedul].WholeTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;Process[number_schedul].order=1;temp_counter=1;while(temp_counterN){for(j=0;jN;j++){if((Process[j].ArrivalTime=temp_time)&&(!Process[j].run_flag)){run_time=Process[j].WholeTime;number_schedul=j;break;}}for(j=0;jN;j++){if((Process[j].ArrivalTime=temp_time)&&(!Process[j].run_flag))if(Process[j].WholeTimerun_time){run_time=Process[j].WholeTime;number_schedul=j;}}Process[number_schedul].ServiceTime=temp_time;Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime+Process[number_schedul].WholeTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;temp_counter++;Process[number_schedul].order=temp_counter;}return0;}5、调试分析(1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析在调试的过程中,所出现问题最集中的地方在于算法的设计和编译,FCFS算法相对简单一些,只要根据进程到达的时间按照顺序依次执行计算即可,而SJF算法由于要涉及每个进程的到达时间和服务时间,并且要进行比较和排序,所以在算法上有一定难度,开始时没有判断进程是否到达,导致短进程优先算法结果错误,后来加上判断语句后就解决了该问题。(2)算法的性能分析即使用户输入的进程到达时间没有先后顺序到达也能准确计算出结果。(加循环判断各个进程的到达时间先后,组成一个有序的序列)(3)经验体会通过本次实验,深入理解了先来先服务和短作业优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。6、用户使用说明程序的使用说明,列出每一步的操作步骤。输入作业个数、作业号、提交时间、运行时间输入选择数来选择调度算法其他数退出程序012FCFS算法SJF算法报错继续输入提交已知时间提交已知时间进行算法运算进行算法运算按格式输出结果按格式输出结果.7、附录带注释的源程序,注释应清楚具体*************头文件***********#includeiostream#defineMaxNum100structProcess_struct{intNumber;//进程编号charName[MaxNum];//进程名字intArrivalTime;//到达时间intStartTime;//开始时间intorder;//运行次序intServiceTime;//服务时间intFinishTime;//结束时间intWholeTime;//周转时间intrun_flag;//调度标志doubleWeightWholeTime;//带权周转时间doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间doubleAverageWWT_FCFS,AverageWWT_SJF;//平均带权周转时间}Process[MaxNum];intN;//实际进程个数intFCFS();//先来先服务intSJF();//短作业优先intFCFS(){//先来先服务算法inti;inttemp_time=0;//当前时间temp_time=Process[0].ArrivalTime;for(i=0;iN;i++){Process[i].StartTime=temp_time;Process[i].FinishTime=Process[i].StartTime+Process[i].ServiceTime;Process[i].run_flag=1;temp_time=Process[i].FinishTime;Process[i].order=i+1;}return0;}intSJF()//短作业优先算法{inttemp_time=0;inti=0,j;intnumber_schedul,temp_counter;//进程编号,当前已执行进程个数doublerun_time;run_time=Process[i].ServiceTime;j=1;while((jN)&&(Process[i].ArrivalTime==Process[j].ArrivalTime))//判断是否有两个进程是否同时到达{if(Process[j].ServiceTimeProcess[i].ServiceTime){run_time=Process[i].ServiceTime;i=j;}j++;}//查找下一个被调度的进程//对找到的下一个被调度的进程求相应的参数number_schedul=i;Process[number_schedul].StartTime=Process[number_schedul].ArrivalTimeProcess[number_schedul].FinishTime=Process[number_schedul].StartTime+Process[number_schedul].ServiceTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;Process[number_schedul].order=1;temp_counter=1;while(temp_counterN){for(j=0;jN;j++){if((Process[j].ArrivalTime=temp_time)&&(!Process[j].run_flag)){run_time=Process[j].ServiceTime;number_schedul=j;break;}}for(j=0;jN;j++){if((Process[j].ArrivalTime=temp_time)&&(!Process[j].run_flag))if(Process[j].ServiceTimerun_time){run_time=Process[j].ServiceTime;number_schedul=j;}}Process[number_schedul].StartTime=temp_time;Process[number_schedul].FinishTime=Process[number_schedul].StartTime+Process[number_schedul].ServiceTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTi
本文标题:FCFS和SJF进程调度算法实验报告
链接地址:https://www.777doc.com/doc-6208099 .html