操作系统实验2-作业调度2.0
实验二、作业调度实验
专业:商业软件1班 姓名:周诗琦 学号:201406114108
一、实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、实验内容和要求
(1) 对初始化的作业序列按照“到达时间”排序;
(2) 遍历作业系列,计算每个作业的结束时间;
分两种情况:
一、第一个作业的结束时间=到达时间+所需运行时间;
二、剩余作业的结束时间=上一个作业的结束时间+所需运行时间。
(1)计算每个作业的周转时间、带权周转时间;
(2)计算作业序列的平均周转时间、平均带权周转时间;
(3)将调度结果显示。
三、实验方法、步骤及结果测试
1. 主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
1 #include<stdio.h> 2 struct jcb 3 { 4 char name[10]; /* 作业名 */ 5 char status; /* 作业状态 */ 6 7 int arrtime; /* 到达时间 */ 8 int startime; /* 开始运行时间 */ 9 int reqtime; /* 要求服务时间 */ 10 int finitime; /* 完成时间 */ 11 12 float TAtime; /* 周转时间 */ 13 float TAWtime; /* 带权周转时间 */ 14 15 float prio; //优先权 16 } jobarr[24],jobfin[24],job[24]; 17 18 void Finishtime(int n,jcb job[]);//计算结束时间 19 TAtime(int n,jcb job[],float averageTAtime);//计算周转时间、平均周转时间 20 TAWtime(int n,jcb job[],float averageTAWtime);//计算带权周转时间、平均带权周转时间 21 void OrderByarrtime(int n,jcb job[]);//先到先服务,按到达时间排序 22 void putOutjob(jcb job[],int n);//打印内容 23 24 void main() 25 { 26 27 // int intarr,intfin,intjob; /* 到达作业个数,完成作业个数,未到达作业个数 */ 28 float averageTAtime=0; 29 float averageTAWtime=0; 30 int n; 31 int systime=0; 32 printf("作业个数:"); 33 scanf("%d",&n); 34 printf("\n"); 35 for(int i=0;i<n;i++) 36 { 37 printf("第%d个作业:\n",i+1); 38 printf("输入作业名称:"); 39 scanf("%s",job[i].name); 40 printf("到达时间:"); 41 scanf("%d",&job[i].arrtime); 42 printf("要求服务时间:"); 43 scanf("%d",&job[i].reqtime); 44 printf("\n"); 45 } 46 OrderByarrtime(n,job); 47 Finishtime(n,job); 48 averageTAtime=TAtime(n,job,averageTAtime); 49 averageTAWtime=TAWtime(n,job,averageTAWtime); 50 putOutjob(job,n); 51 printf("现在系统时间:%d\n",systime); 52 printf("平均周转时间=%f\n",averageTAtime); 53 printf("平均带权周转时间=%f\n",averageTAWtime); 54 55 } 56 57 58 void putOutjob(jcb job[],int n)//打印内容 59 { 60 int i; 61 printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n"); 62 for(i=0;i<n;i++) 63 { 64 printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 65 printf("\n"); 66 67 } 68 printf("\n\n"); 69 } 70 71 void OrderByarrtime(int n,jcb job[])//先到先服务,按到达时间排序 72 { 73 int i,j; 74 jcb tmp; 75 for(i=0;i<n-1;i++) 76 for(j=i+1;j<n;j++) 77 { 78 if(job[i].arrtime>job[j].arrtime) 79 { 80 tmp=job[i]; 81 job[i]=job[j]; 82 job[j]=tmp; 83 } 84 } 85 } 86 87 88 void Finishtime(int n,jcb job[])//计算结束时间 89 { 90 int i; 91 for(i=0;i<n;i++) 92 { 93 if(i==0) 94 { 95 //job[i].startime=job[i].arrtime; 96 job[i].finitime=job[i].arrtime+job[i].reqtime; 97 job[i].startime=job[i].finitime; 98 } 99 else 100 { 101 job[i].finitime=job[i-1].startime+job[i].reqtime; 102 job[i].startime=job[i].finitime; 103 } 104 } 105 } 106 107 TAtime(int n,jcb job[],float averageTAtime)//计算周转时间、平均周转时间 108 { 109 int i; 110 float sum=0; 111 for(i=0;i<n;i++) 112 { 113 job[i].TAtime=job[i].finitime-job[i].arrtime; 114 sum=sum+job[i].TAtime; 115 } 116 averageTAtime=sum/(double)n; 117 return averageTAtime; 118 } 119 120 121 TAWtime(int n,jcb job[],float averageTAWtime)//计算带权周转时间、平均带权周转时间 122 { 123 int i; 124 float sum=0; 125 for(i=0;i<n;i++) 126 { 127 job[i].TAWtime=job[i].TAtime/job[i].reqtime; 128 sum=sum+job[i].TAWtime; 129 } 130 averageTAWtime=sum/(double)n; 131 return averageTAWtime; 132 }
2. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、实验总结
在此次实验中收获良多,但是编程能力仍存在一些问题,自己去发现问题的能力比较弱,很多方面都还有待提高。