实验二 作业调度
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define M 24 struct JCB{ char name[M];//作业名 int rt;//到达时间 float r;//响应比 int ct;//需要CPU(运行)时间 int ft;//完成时的时间 int wt;//周转时间 float awt;//加权周转时间 }p[M]; //输出函数 void Output(int a) { int i; printf("\n作业名 到达系统时间 所需CPU时间 完成时间 周转时间 加权周转时间\n"); for(i=0;i<a;i++) { printf("%s\t ",p[i].name); printf(" %d\t\t",p[i].rt); printf(" %d\t\t",p[i].ct); printf("%d\t",p[i].ft); printf("%d\t",p[i].wt); printf("%f\n",p[i].awt); } } //输入函数 int Input() { int i,a,b=0; int init,k; int j=1; JCB f; do{ printf("请输入作业个数(2-24):"); scanf("%d",&a); if(a<2||a>24) j=0; else break; }while(j=1); for(i=0;i<a;i++) { printf("Please enter name:"); scanf("%s",p[i].name); printf("Please enter rt:"); scanf("%d",&p[i].rt); printf("Please enter ct:"); scanf("%d",&p[i].ct); p[i].ft=0; p[i].wt=0; p[i].awt=0; p[i].r=0; } for(i=0;i<a;i++)//按到达系统时间先后排序 { init=p[b].rt; f=p[b]; for(k=b;k<a;k++) { if(p[k].rt<init) { f=p[k]; p[k]=p[b]; p[b]=f; init=p[b].rt; } } b++; } Output(a);//按到达系统时间先后排序输出 return a; } //SJF算法选择短作业 int Selectwork(int t,int n){ int i,l=0; int temp,m,k=0; JCB a[M]; JCB b; //寻找当前时间t到达系统还未完成的作业,用数组a[M]存储 for(i=1;i<n;i++) { if(p[i].rt<=t&&p[i].ft==0) { a[l]=p[i]; l++; k=l; } } //寻找未完成作业中最短的作业 temp=a[0].ct; b=a[0]; for(m=0;m<k;m++) { if(a[m].ct<temp) { b=a[m]; a[m]=a[0]; a[0]=b; temp=a[0].ct; } } return a[0].ct;//返回最短作业的所需CPU时间 } //HRRE算法选择响应比高的作业 int Choose(int t,int n) { int i,k,l=0; int m=0; float r,temp; JCB a[M]; JCB b; //寻找当前时间t到达系统还未完成的作业,用数组a[M]存储 for(i=1;i<n;i++) { if(p[i].rt<=t&&p[i].ft==0) { a[l]=p[i]; l++; k=l; } } //计算每个未完成作业的响应比 for(i=0;i<k;i++) { a[i].r=1+(float)(t-a[i].rt)/(float)a[i].ct; } //寻找未完成作业中响应比最高的作业 temp=a[0].r; b=a[0]; for(m=0;m<k;m++) { if(a[m].r>temp) { b=a[m]; a[m]=a[0]; a[0]=b; temp=a[0].r; } } return a[0].ct;//返回最高响应比的作业的所需CPU时间 } void FCFS() { int i,j; int now=0;//当前时间 j=Input(); int sumwt=0;//周转时间总和 float sumawt=0;//带权周转时间总和 float avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间 for(i=0;i<j;i++) { if(i==0) { now=p[i].rt; p[i].ft=now+p[i].ct; p[i].wt=p[i].ft-p[i].rt; p[i].awt=p[i].wt/p[i].ct; } else { if(p[i-1].ft>p[i].rt) { now=p[i-1].ft; p[i].ft=now+p[i].ct; } else { now=p[i].rt; p[i].ft=now+p[i].ct; } p[i].wt=p[i].ft-p[i].rt; p[i].awt=(float)p[i].wt/(float)p[i].ct; } sumwt+=p[i].wt; sumawt+=p[i].awt; } avgwt=(float)sumwt/j; avwt=sumawt/j; Output(j); printf("平均周转时间为:%f\n",avgwt); printf("平均带权周转时间为:%f\n",avwt); } void SJF() { int i=0,j=0,k=0; j=Input(); int l,m,now;//当前时间 int a=0; int sumwt=0;//周转时间总和 float sumawt=0;//带权周转时间总和 double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间 l=0; int n=0; for(i=0;i<j;i++) { if(i==0) { now=p[i].rt; p[i].ft=p[i].rt+p[i].ct; now=p[i].ft; } else { a=Selectwork(now,j); //寻找最短作业的位置 for(m=0;m<j;m++) if(p[m].ct==a&&p[m].ft==0) { k=m; break; } p[k].ft=now+p[k].ct;//计算最短作业的完成时间 now=p[k].ft; } } for(i=0;i<j;i++) { p[i].wt=p[i].ft-p[i].rt; p[i].awt=(float)p[i].wt/(float)p[i].ct; sumwt+=p[i].wt; sumawt+=p[i].awt; } avgwt=(float)sumwt/j; avwt=sumawt/j; Output(j); printf("平均周转时间为:%f\n",avgwt); printf("平均带权周转时间为:%f\n",avwt); } void HRRN() { int i=0,j=0,k=0; int b=0,now=0,m; float sumwt=0;//周转时间总和 float sumawt=0;//带权周转时间总和 double avwt,avgwt;//avwt是平均周转时间,avgwt是平均带权周转时间 j=Input(); for(i=0;i<j;i++) { if(i==0) { p[i].ft=p[i].rt+p[i].ct; now=p[i].ft; } else { b=Choose(now,j); //寻找最高响应比的作业的位置 for(m=0;m<j;m++) if(p[m].ct==b&&p[m].ft==0) { k=m; break; } p[k].ft=now+p[k].ct;//计算最高响应比的作业的完成时间 now=p[k].ft; } } for(i=0;i<j;i++) { p[i].wt=p[i].ft-p[i].rt; p[i].awt=(float)p[i].wt/(float)p[i].ct; sumwt+=p[i].wt; sumawt+=p[i].awt; } avgwt=(float)sumwt/j; avwt=sumawt/j; Output(j); printf("平均周转时间为:%f\n",avgwt); printf("平均带权周转时间为:%f\n",avwt); } void Start() { int d; int j=1; do{ printf("1.FCFS 2.SJF 3.HRRN \n请输入你需要的调度算法的序号: "); scanf("%d",&d); if(d<1||d>3) j=0; else break; }while(j=1); switch(d) { case 1: FCFS(); break; case 2: SJF(); break; case 3: HRRN(); break; } } int main() { int i=1; char a; do{ Start(); printf("Do you want to continue?(y or n):"); scanf(" %c",&a); if(a=='n') break; }while(i=1); printf("The end!\n"); return 0; }
总结:在编程的过程中遇到了一些小问题,就是思路不够清晰,导致程序得不到想要的结果,所以花费了一段时间理清思路重新编写。经过一番修改,最终还是得到了想要的结果。完成后觉得小有成就,对FCFS,SJF,HRRE三个算法调度有了更深一步的理解,很享受这一次的编程。