标签:
1. 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
2.实验要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
拓展内容:
#include<stdio.h> #include<string.h> #include<time.h> typedef struct jcb{ char name[10];//作业名 int arrtime;//到达时间 int reqtime;//要求服务时间 int startime;//调度时间 int finitime;//结束时间 float TAtime,TAWtime;//周转时间,带权周转时间(周转时间/服务时间) int shebei1,shebei2; }JCB; int systime=0; int intarr=0,intfin=0,intjob=0;//到达作业个数,完成作业个数,未到达作业个数 JCB jobarr[24],jobfin[24],job[24]; void Mune() { printf("\n\n"); printf("\t\t|------------------------------------------------|\n"); printf("\t\t| 作业调度模拟程序 |\n"); printf("\t\t|------------------------------------------------|\n"); printf("\t\t| 0:退出 |\n"); printf("\t\t| 1:从文件读取输入 |\n"); printf("\t\t| 2:伪随机数产生 |\n"); printf("\t\t| 3:自己输入模拟数据 |\n"); printf("\t\t|------------------------------------------------|\n"); printf("请选择<0~3>:"); } //从文件读取 int ReadFile() { int i=0; FILE *fp; //定义文件指针 fp=fopen("3.txt","r"); //打开文件 if(fp==NULL) { printf("File open error !\n"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%d%d%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime,&job[i].shebei1,&job[i].shebei2); //fscanf()函数将数据读入 i++; }; if(fclose(fp)) //关闭文件 { printf("Can not close the file !\n"); exit(0); } return i; } //伪随机数产生 void Pseudo_random_number() { int i; char str[25]; srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 //输入作业数 intjob=rand()%23+5; for(i=1;i<=intjob;i++) { itoa(i, str, 10);//数字转换成字符 strcpy(job[i].name,str); //作业到达时间 job[i].arrtime=rand()%29+1; //作业运行时间 job[i].reqtime=rand()%7+1; //是否使用设备1 job[i].shebei1=rand()%2; //是否使用设备2 job[i].shebei2=rand()%2; } } void Input()//手动输入 { int i; int j; int n=0; printf("请输入作业个数:"); scanf("%d",&n); for(i=0;i<n;i++,intjob++) { printf("\n第%d个作业:\n请输入作业名:",i+1); scanf("%s",job[intjob].name); do{ printf("请输入到达时间:"); scanf("%d",&job[intjob].arrtime); if(job[i].arrtime<systime) printf("到达时间小于当前系统时间!请重新输入:"); }while(job[i].arrtime<systime); printf("请输入要求服务时间:"); scanf("%d",&job[intjob].reqtime); printf("请输入占用设备I1的时间:"); scanf("%f",&job[intjob].shebei1); printf("请输入占用设备I2的时间:"); scanf("%f",&job[intjob].shebei2); job[i].startime=0; job[i].finitime=0; job[i].TAtime=0; job[i].TAWtime=0; } for(i=0;i<intjob;i++)//若输入到达时间为现在的系统时间 { if(job[i].arrtime==systime) { jobarr[intarr]=job[i]; for(j=i;j<=intjob;j++) { job[j]=job[j+1]; } intarr++; intjob--; i--; } else if(job[i].arrtime<systime) { printf("到达时间小于当前系统时间!请重新输入"); } } } void Output()//输出排序后队列 { int i; printf("\n\n\n未到达队列的是\n"); printf("\tname\tarrime\treqtime\tstartime fintime TAtime\tTAWtime\tI1\tI2\n"); for(i=0;i<intjob;i++){ printf("N%d\t%s\t%d\t%d\t%d\t %d\t %.2f\t%.2f\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime,job[i].shebei1,job[i].shebei2); } printf("\n已到达队列的是\n"); printf("\tname\tarrime\treqtime\tstartime fintime TAtime\tTAWtime\tI1\tI2\n"); for(i=0;i<intarr;i++){ printf("N%d\t%s\t%d\t%d\t%d\t %d\t %.2f\t%.2f\t%d\t%d\n",i+1,jobarr[i].name,jobarr[i].arrtime,jobarr[i].reqtime,jobarr[i].startime,jobarr[i].finitime,jobarr[i].TAtime,jobarr[i].TAWtime,jobarr[i].shebei1,jobarr[i].shebei2); } printf("\n已完成队列的是\n"); printf("\tname\tarrime\treqtime\tstartime fintime TAtime\tTAWtime\tI1\tI2\n"); for(i=0;i<intfin;i++){ printf("N%d\t%s\t%d\t%d\t%d\t %d\t %.2f\t%.2f\t%d\t%d\n",i+1,jobfin[i].name,jobfin[i].arrtime,jobfin[i].reqtime,jobfin[i].startime,jobfin[i].finitime,jobfin[i].TAtime,jobfin[i].TAWtime,jobfin[i].shebei1,jobfin[i].shebei2); } printf("现在系统时间:%d",systime); printf("\n*********************************************\n"); } void Sort(JCB job[])//排序 { int i,j; JCB temp; for(i=0;i<intjob-1;i++) { for(j=i+1;j<intjob;j++) { if(job[i].arrtime>job[j].arrtime) { temp=job[i]; job[i]=job[j]; job[j]=temp; } } } } //先来先服务算法 void Fcfs(){ int i,j=0,k,n,i1,i2;//n记录当前系统运行的作业数,i1、i2记录设备使用情况 if(job[0].arrtime>systime) { systime++; } jobarr[intarr]=job[0]; for(k=0;k<=intjob;k++) { job[k]=job[k+1]; } intarr++; intjob--; while(0<intarr) { i=0; if(jobarr[i].shebei1){ printf("\n作业%s开始运行...\n",jobarr[i].name); jobarr[i].startime=systime; jobarr[i].finitime=systime+jobarr[i].reqtime; while(jobarr[i].finitime>systime||intjob>0) { systime++; while(job[j].arrtime==systime)//作业从未到达队列进入已到达队列 { jobarr[intarr]=job[0]; for(k=j;k<=intjob;k++) { job[k]=job[k+1]; } intarr++; intjob--; } } jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime; jobarr[i].TAWtime=jobarr[i].TAtime/jobarr[i].reqtime; jobfin[intfin]=jobarr[i]; printf("作业%s运行结束!\n",jobarr[i].name); printf("\n现在系统时间:%d\n",systime); printf("\n*********************************************\n"); for(k=i;k<=intarr;k++)//队列中剩余元素前移 { jobarr[k]=jobarr[k+1]; } intarr--; intfin++; } } main() { char a; char b[20]; int chose,i,j,key=0; Mune(); scanf("%d",&chose); switch(chose)//选择输入 { case 0:exit(0); case 1:intjob=ReadFile();break; case 2:Pseudo_random_number();break; case 3:Input();break; } for(i=0;i<intjob;i++)//若输入到达时间为现在的系统时间 { if(job[i].arrtime==systime) { jobarr[intarr]=job[i]; for(j=i;j<=intjob;j++) { job[j]=job[j+1]; } intarr++; intjob--; i--; } } //排序 Sort(job); Sort(jobarr); Output(); systime++; while(1) { printf("\n\nInsert or Delete or Operating or Exit ?(I or D or O or E):"); getchar(); scanf("%c",&a); if(a==‘I‘||a==‘i‘)//插入 { Input(); } else if(a==‘D‘||a==‘d‘)//删除(只删除在等待队列中的) { printf("请输入要删除的作业名:"); scanf("%s",b); for(i=0;i<intjob;i++) { if(strcmp(b,job[i].name)==0) { key=1; for(j=i;j<=intjob;j++) { job[j]=job[j+1]; } intjob--; } } if(key==0) { printf("查找不到该作业!"); } } else if(a==‘O‘||a==‘o‘) { Fcfs(); } else if(a==‘E‘||a==‘e‘)//退出 { exit(0); } else printf("输入错误!"); Sort(job); Sort(jobarr); Output(); systime++; } }
四、实验结果
标签:
原文地址:http://www.cnblogs.com/jinyechutao11/p/5419254.html