1、输出:进程的完成时间、周转时间、带权周转时间其中对于任意进程有:周转时间=完成时间-到达时间带权周转时间=周转时间/服务时间因此,两个算法的关键是求完成时间l 数据结构及函数说明使用的数据结构是数组,进程的名称、到达时间、服务时间、进程的完成时间、周转时间、带权周转时间分别对应于一个数组,这些数组长度相等.struct fcfs/定义进程的结构体 char name10; /进程名 float arrivetime; /到达时间 float servicetime; /服务时间 float starttime;/开始时间 float finishtime;/完成时间 float zztime;
2、/周转时间 float dqzztime;/带权周转时间;fcfs a100; /结构体数组函数说明void Finput(fcfs *p,int N) ; /输入函数,初始化void Fsort(fcfs *p,int N) ; /按到达时间排序,先到达排在前面void Fsort2(fcfs *p,int N) ; /按进程大小排序,先到达排在前面void F_method(fcfs *p, int N) /先来先服务算法 void F_method2(fcfs *p,int N) /短作业优先程序 void SJF(fcfs *p,int N); / 短作业优先void FCFS(fcf
3、s *p,int N); /先来先服务void SJF(fcfs *p,int N) /短作业优先void FPrint(fcfs *p,int N) /输出函数求完成时间算法1) FCFS算法流程图2) SJF算法流程图l 程序#include float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;/定义先来先服务算法进程的最大数量void Finput(fcfs *p,int N) /输入函数 int i; printf(输入进程的名称、到达时间、服务时间:(例如: x 0 100)n);
4、 for(i=0; i=N-1; i+) printf(输入第%d进程的名称、到达时间、服务时间:n,i+1); scanf(%s%f%f,&pi.name,&pi.arrivetime,&pi.servicetime); /输出函数void FPrint(fcfs *p,int N)/输出函数 int k;n执行顺序:%s,p0.name); for(k=1; kN; k+)-%s,pk.name);n进程名t到达时间t服务时间t开始时间t结束时间t周转时间t带权周转时间nn for(k=0;%st%-.2ftt%-.2ftt%-.2ftt%-.2ftt%-.2ftt%-.2fttnn,pk
5、.name,pk.arrivetime,pk.servicetime,pk.starttime,pk.finishtime,pk.zztime,pk.dqzztime);void Fsort(fcfs *p,int N) /按到达时间排序,先到达排在前面 for(int i=0; for(int j=0; j=i; j+) if(pi.arrivetimepj.arrivetime)/进行排序,如果先到达就排在前面 fcfs temp; temp=pi; pi=pj; pj=temp; /运行结果void F_method(fcfs *p, int N) if(k=0) pk.starttim
6、e=pk.arrivetime;/如果是第一个进程,开始时间等于到达时间 pk.finishtime=pk.arrivetime+pk.servicetime;/结束时间等于到达时间加上服务时间 else pk.starttime=pk-1.finishtime; /开始时间=上一个一个进程的完成时间 pk.finishtime=pk.starttime+pk.servicetime;/结束时间=开始时间加上+现在进程的服务时间 k+) /求每个进程的信息 pk.zztime=pk.finishtime-pk.arrivetime; /周转时间=完成时间-到达时间 pk.dqzztime=pk
7、.zztime/pk.servicetime; /带权周转时间=周转时间/服务时间void F_method2(fcfs *p,int N) /短作业优先核心程序 int num; int arrive=65535; /寻找最早到达的进程 int min_serive=65535; /寻找最小服务时间进程 fcfs b100; /新建一个,进行排序 int state100;/设置100个标志位 for( i=0; statei=0; if(pi.arrivetimebj.finishtime)/如果遇到已排序或者未到达的进程跳过 continue; else if(pi.servicetim
8、emin_serive) min_serive=pi.servicetime; num=i; statenum=1; /找到合适的进程并赋值到B b+j=pnum; bj.starttime=bj-1.finishtime; bj.finishtime=bj-1.finishtime+bj.servicetime; for(j=0; j+) /求每个进程的信息 bj.zztime= bj.finishtime- bj.arrivetime; bj.dqzztime= bj.zztime/ bj.servicetime; pj=bj;/先来先服务void FCFS(fcfs *p,int N)
9、Fsort(p,N);/对每个进程排序 F_method(p,N); FPrint(p,N);void SJF(fcfs *p,int N) F_method2(p,N); int main() /主函数 int N;输入进程数: scanf(%dN); Finput(a,N);先来先服务n FCFS(a,N);nnn短作业优先n SJF(a,N); return 0;【小结或讨论】1.能实现的功能输入进程个数Num,每个进程到达时间ArrivalTimei,服务时间ServiceTimei。采用先来先服务FCFS或者短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权
10、周转时间,并且统计Num个进程的平均周转时间和平均带权周转时间。2、FCFS算法相对于SJF算法来说,比较简单,在FCFS算法中,主要用到的是队列,按照作业的到达时间来进行排序排序算法。3、SJF算法中就需要考虑到很多的因素,因为0时刻到达的作业肯定第一个执行,然后再考虑剩余的作业的服务时间以决定哪一个作业先执行,但是这是在确保所有剩余的作业都处于就绪状态的情况下。如若不然,还要考虑每一个作业执行完后,有哪些作业进入了排队状态。4、SJF算法中还要考虑到如若同一时刻进入了多个作业,还要将这若干个作业按照服务时间进行排序,再考虑执行情况。5、无论是FCFS还是SJF算法,关键都是求完成时间。FCFS算法执行进程的顺序是由到达时间的先后决定的,SJF算法的顺序是由服务时间决定的。6、SJF求完成时间时,应当注意如下情况:A进程完成完成后,依据服务时间,轮到B执行,而A的完成时间B的到达之间,也就是说A完成时,B尚未到达,这种情况下,B的完成时间=B的到达时间+B的服务时间。7、通过本次实验,我对于作业调度的机制,有了进一步的认识,对于相同的作业,不同的调度顺序,会使周转时间以及赋权周转时间产生变化。8、先到先服务算法虽然算法实现较为简便,但是效率上存在一定的问题。短作业优先算法可以大大提高效率方面的问题,但是实现起来较为复杂。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2