1、struct PCB *next;pcb;int time;int n;pcb *head=NULL,*p,*q;void run_fcfs(pcb *p1)time=p1-arrivetimetime?p1-arrivetime:time;starttime=time;printf(n现在时间是%d,开始运行作业%sn,time,p1-name);time+=p1-servicetime;state=T;finishtime=time;turnaroundtime=p1-finishtime-p1-arrivetime;weightedturnaroundtime=p1-turnaround
2、time/p1- 到达时间 开始时间 服务时间 完成时间 周转时间 带权周转时间n );%6d%10d%10d%8d%10.1f%10.2fn,arrivetime,p1-starttime,p1-servicetime,p1-finishtime,p1-turnaroundtime,p1-weightedturnaroundtime);void fcfs()int i,j;p=head;for(i=0;istate=F)q=p;run_fcfs(q);p=p-next;void getInfo()int num;n作业个数:scanf(%d,&n);for(num=0;numname,&ar
3、rivetime,&servicetime);if(head=NULL)head=p;q=p;time=p-if(p-arrivetimeq-next=p;starttime=0;finishtime=0;turnaroundtime=0;weightedturnaroundtime=0;next=NULL;state=void main() system(graftabl 936先来先服务算法模拟getInfo();fcfs();getch();2、非抢占SJFconio.h#define MAX 100struct jcb float arrivetime;float starttime;
4、float finishtime;float servicetime;float zztime;float avezztime;struct jcb aMAX;void input(jcb *p,int N) int i;请分别输入nt进程名 到达时间 服务时间nn=N-1;printf(请输入第%d个进程信息:,i+1);%s%f%fpi.name,&pi.arrivetime,&pi.servicetime);n void Print(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,fl
5、oat zztime,float avezztime,int N)int k; printf(调度顺序:%s,p0.name); for(k=1;k,pk.name);nnttt进程信息:nnametarrivetservicetstarttfinishtzztavezzn for(k=0;%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft%-.2ftn,pk.name,pk.arrivetime,pk.servicetime,pk.starttime,pk.finishtime,pk.zztime,pk.avezztime); void sort(jcb *p,int N)
6、int i,j; for(i=0; for(j=0;j=i;j+) if(pi.arrivetimepj.arrivetime) jcb temp; temp=pi; pi=pj; pj=temp; void deal(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &avezztime,int N)for(k=0;if(k=0)pk.starttime=pk.arrivetime;pk.finishtime=pk.arrivetime+pk.serv
7、icetime;elsepk.starttime=pk-1.finishtime;pk.finishtime=pk-1.finishtime+pk.servicetime;pk.zztime=pk.finishtime-pk.arrivetime;pk.avezztime=pk.zztime/pk.servicetime;void jcbf(jcb *p,int N) float arrivetime=0, servicetime=0, starttime=0, finishtime=0, zztime=0, avezztime=0;int m,n,next,k,i=0;float min;s
8、ort(p,N);for(m=0;mN-1;m+)if(m=0)pm.finishtime=pm.arrivetime+pm.servicetime;pm.finishtime=pm-1.finishtime+pm.servicetime;for( n=m+1;nn+)if(pn.arrivetime=pm.finishtime)i+; min=pm+1.servicetime; next=m+1;m+i;if(pk+1.servicetimeMAX)t!输入的作业数目太大,请输入不大于%d的整数n,MAX);按Q或者q退出程序,按其他任意键继续测试. ch=getch(); if(ch=Q|
9、ch=q) break;else continue;input(a,N);jcb *b=a;jcbf(b,N); return 0; getch();3、可抢占优先权调度算法dos.htime.hstring.htypedef char string10;struct taskstring name;int arrTime;int serTime;int waiTime;int begTime;int finTime;int turTime;int wTuTime;int priority;int finish;JCB10;int num;void input()int i;clsn请输入作业
10、数量:num);num;n请输入作业NO.%d:,i);作业名称:,JCBi.name);到达时间:JCBi.arrTime);服务时间:JCBi.serTime);JCBi.priority=0;JCBi.finish=0;int HRN(int pre) int current=1,i,j; JCBi.waiTime=JCBpre.finTime-JCBi.arrTime; JCBi.priority=(JCBi.waiTime+JCBi.serTime)/JCBi.serTime; if(!JCBi.finish) current=i; for(j=i;JCBj.finish) if(J
11、CBcurrent.arrTime=JCBpre.finTime) if(JCBj.arrTimeJCBcurrent.priority) current=j; elseJCBcurrent.arrTime) if(JCBj.arrTime=JCBcurrent.arrTime) if(JCBj.priority return current; void runing(int i,int times,int pre,int staTime,int endTime) if(times=0) JCBi.begTime=JCBi.arrTime; JCBi.finTime=JCBi.begTime+
12、JCBi.serTime; JCBi.turTime=JCBi.serTime; JCBi.wTuTime=1.0; staTime=JCBi.begTime; if(JCBi.arrTimeJCBpre.finTime) JCBi.begTime=JCBpre.finTime; JCBi.turTime=JCBi.finTime-JCBi.arrTime; JCBi.wTuTime=JCBi.turTime/JCBi.serTime; if(times=num-1) endTime=JCBi.finTime; JCBi.finish=1; void print(int i,int times
13、) if(times=0)名称 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间n%3s%9d%9d%9d%9d%9d%9dn,JCBi.name,JCBi.arrTime,JCBi.serTime,JCBi.begTime,JCBi.finTime,JCBi.turTime,JCBi.wTuTime); void check() int i; int staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime; int current=0,times=0,pre=0; JCBpre.finTime=0;
14、 JCBi.finish=0; staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime; current=0;times=0;pre=0;-n-HRRN-n for(times=0;timestimes+) current=HRN(pre); runing(current,times,pre,staTime,endTime); print(current,times); pre=current; sumTurTime+=JCBi.turTime; sumWTuTime+=JCBi.wTuTime; aveturTi
15、me=sumTurTime/num; aveWTuTime=sumWTuTime/num;%9d%9d%9d%9dn,NULL,sumTurTime,aveturTime,aveWTuTime);-n void main() char again; system( do请输入4组数据: input(); check();Continue.(Y/N): again=getch(); while(again!=Yagain!yNn while(again=|again=六、运行结果七、实验总结1、FCFS算法,即先来先服务,就是每次从就绪队列中选择一个最先进入队列的进程,把CPU分配给它,令它运行
16、。该进程一直运行下去,直到完成,或者由于某种原因而阻塞,才会放弃CPU。FCFS算法比较有利于长作业,而不利于短作业。另外,FCFS调度算法对CPU繁忙型作业较有利,而不利于I/O繁忙型作业。2、短作业优先法(SJF),是指分派CPU时,把CPU优先分给最短的作业。SJF算法在作业调度上用的很多。它的缺点是对长作业不利,并且不能保证及时处理紧迫性作业。3、优先权算法指后备作业中选择一批优先权相对高的调入存。4、最高响应比优先法(HRN)是对FCFS方式和SJF方式的一种综合平衡。HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。响应比R定义如下:R=(W+T)/T=1+W/T。5、作业调度的实现主要有两个问题:一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。6、为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如,作业名作业执行时间、指向下一个作业控制块的指针等信息。这个记录作业相关信息的数据块称为作业控制块JCB,并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1