操作系统FCFS与FJS算法作业调度算法.docx
操作系统FCFS与FJS算法作业调度算法一 实验项目名称: 作业调度算法 二 实验目的: 加深作业概念的理解模拟先来先服务(FCFS)与短作业优先调度算法(SJF) 三 实验要求: 模拟先来先服务(FCFS)与短作业优先调度算法(SJF)运行 四 实验原理: 作业调度算法 1)先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,每次调度都从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。 2)短作业优先调度算法 短作业优先调度算法(SJF),是指对短作业优先调度的算法。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。 五 算法分析: #include"stdio.h" #define N 50 void main void fcfs; void sjf; int a; while(true) printf("nn"); printf("tt/*/"); printf("ntt/* 1、fcfs 调 度 */"); printf("ntt/* 2、sjf 调 度 */"); printf("ntt/* 0、 退 出 */n"); printf("tt/*/"); printf("nnt请选择菜单项:t"); scanf("%d",&a); printf("n"); switch(a) case 1: fcfs;break; case 2: sjf;break; default: break; if(a!=1&&a!=2) break; void fcfs int i,j,n,min,px; float sum1,sum2; printf("t请输入有n个进程(0<n<=50):t"); scanf("%d",&n); while(n>50|n<=0) printf("nt请重新输入: "); scanf("%d",&n); printf("nn"); struct Gzuo int id; /进程名字 int dt; /到达时刻 int st; /服务时间 int wct; /完成时刻 float zt; /周转时间 float dczt; /带权周转时间 ; Gzuo aN; for(i=0;i<n;i+) ai.id=i+1; printf("t到达时间: "); scanf("%d",&ai.dt); printf("t服务时间: "); scanf("%d",&ai.st); printf("n"); for(j=n-1;j>=0;j-) for(i=0;i<j;i+) if(ai.dt>ai+1.dt) min=ai.dt; ai.dt=ai+1.dt; ai+1.dt=min; min=ai.st; ai.st=ai+1.st; ai+1.st=min; min=ai.id; ai.id=ai+1.id; ai+1.id=min; a0.wct=a0.st+a0.dt; a0.zt=(float)a0.st; a0.dczt=a0.zt/a0.st; for(i=1;i<n;i+) if(ai.dt>ai-1.wct) ai.wct=ai.dt+ai.st; ai.zt=(float)ai.st; ai.dczt=ai.zt/ai.st; else ai.wct=ai-1.wct+ai.st; ai.zt=(float)(ai.wct-ai.dt); ai.dczt=ai.zt/ai.st; printf("t1、按id号依次输出n"); printf("t2、按完成顺序依次输出n"); printf("nt请选择输出顺序:t"); scanf("%d",&px); printf("nid:到达时间t服务时间t完成时间t周转时间t带权周转时间n"); sum1=0; sum2=0; switch(px) case 2: for(i=0;i<n;i+) printf("%d: %dtt%dtt%dtt%.0ftt%.2fn",ai.id,ai.dt,ai.st,ai.wct,ai.zt,ai.dczt); sum1+=ai.zt; sum2+=ai.dczt; printf("n平均周转时间:%.2fn",sum1/n); printf("n平均带权周转时间:%.2fnn",sum2/n); break; case 1: for(j=0;j<n;j+) for(i=0;i<n;i+) if(ai.id=j+1) printf("%d: %dtt%dtt%dtt%.0ftt%.2fn",ai.id,ai.dt,ai.st,ai.wct,ai.zt,ai.dczt); sum1+=ai.zt; sum2+=ai.dczt; printf("n平均周转时间:%.2fn",sum1/n); printf("n平均带权周转时间:%.2fnn",sum2/n); break; default: break; void sjf int i,j,n,min,px; int b=0,z; float sum1,sum2; printf("ntt请输入有n个进程(0<n<=50):t"); scanf("%d/n",&n); while(n>50|n<=0) printf("nt请重新输入: "); scanf("%d",&n); printf("n"); struct Gzuo int id; /进程名字 int dt; /到达时刻 int st; /服务时间 int wct; /完成时刻 float zt; /周转时间 float dczt; /带权周转时间 ; Gzuo aN; for(i=0;i<n;i+) ai.id=i+1; printf("t到达时间: "); scanf("%d",&ai.dt); printf("t服务时间: "); scanf("%d",&ai.st); printf("n"); min=a0.dt; for(j=n-1;j>=0;j-) for(i=0;i<j;i+) if(ai.dt>ai+1.dt) min=ai.dt; ai.dt=ai+1.dt; ai+1.dt=min; min=ai.st; ai.st=ai+1.st; ai+1.st=min; min=ai.id; ai.id=ai+1.id; ai+1.id=min; if(ai.dt=ai+1.dt&&ai.st>ai+1.st) min=ai.dt; ai.dt=ai+1.dt; ai+1.dt=min; min=ai.st; ai.st=ai+1.st; ai+1.st=min; min=ai.id; ai.id=ai+1.id; ai+1.id=min; a0.wct=a0.st+a0.dt; a0.zt=(float)a0.st; a0.dczt=a0.zt/a0.st; for(i=1;i<n;i+) if(ai.dt>a0.wct) ; else b=b+1; for(j=b-1;j>=1;j-) for(i=1;i<j;i+) if(ai.st>ai+1.st) min=ai.dt; ai.dt=ai+1.dt; ai+1.dt=min; min=ai.st; ai.st=ai+1.st; ai+1.st=min; min=ai.id; ai.id=ai+1.id; ai+1.id=min; for(i=1;i<n;i+) if(ai.dt>ai-1.wct) ai.wct=ai.dt+ai.st; ai.zt=(float)ai.st; ai.dczt=ai.zt/ai.st; else ai.wct=ai-1.wct+ai.st; ai.zt=(float)(ai.wct-ai.dt); ai.dczt=ai.zt/ai.st; for(j=i+1,b=j;j<n;j+) if(aj.dt>ai.wct) ; else b=b+1; for(j=b-1;j>=i;j-) for(z=i;z<j;z+) if(az.st>az+1.st) min=az.dt; az.dt=az+1.dt; az+1.dt=min; min=az.st; az.st=az+1.st; az+1.st=min; min=ai.id; ai.id=ai+1.id; ai+1.id=min; printf("nt请选择输出顺序n"); printf("t1、按id号依次输出n"); printf("t2、按完成顺序依次输出n"); scanf("%d",&px); printf("nid:到达时间t服务时间t完成时间t周转时间t带权周转时间n"); sum1=0; sum2=0; switch(px) case 2: for(i=0;i<n;i+) printf("%d: %dtt%dtt%dtt%.0ftt%.2fn",ai.id,ai.dt,ai.st,ai.wct,ai.zt,ai.dczt); sum1+=ai.zt; sum2+=ai.dczt; printf("n平均周转时间:%.2fn",sum1/n); printf("n平均带权周转时间:%.2fnn",sum2/n); break; case 1: for(j=0;j<n;j+) for(i=0;i<n;i+) if(ai.id=j+1) printf("%d: %dtt%dtt%dtt%.0ftt%.2fn",ai.id,ai.dt,ai.st,ai.wct,ai.zt,ai.dczt); sum1+=ai.zt; sum2+=ai.dczt; printf("n平均周转时间:%.2fn",sum1/n); printf("n平均带权周转时间:%.2fnn",sum2/n); break; default: break; 六 截图 FCFS: SJF: 七 实验总结: 比如有3个进程,到达时间分别为2 3 5 服务时间分别为 2 4 3 FCFS算法运行顺序为 :1 2 3 SJF算法运行作业的顺序为:1 3 2 FCFS算法的平均周转时间为4.33,平均带权周转时间1.42 SJF算法的平a均周转时间为5.33,平均带权周转时间1.50 SJF算法的平均周转时间和平均带权周转时间比FCFS算法的平均周转时间和平均带权周转时间的低。