实时模拟_FCFS调度算法
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct course{/*进程结构体*/ 4 char courseName;/*进程名称*/ 5 int startTime/*到达时间*/,serviceTime/*服务时间*/; 6 int survivalTime/*生存时间*/,WhetherIn/*是否就绪*/; 7 int destructionTime/*销毁时间*/,readyTime/*就绪时间*/; 8 struct course*next; 9 }course; 10 void typeIn(course*courseData,int n);/*录入进程数据*/ 11 void myQSort(course*courseData,int left,int right);/*按到达时间排序进程数据*/ 12 void output(course*courseData,int n);/*按到达时间升序进程数据后输出*/ 13 void FCFSreal_timeSimulation(course*courseData,int n);/*实时模拟FCFS进程调度算法*/ 14 void summarize(course*courseData,int n);/*实验总结*/ 15 int main(){ 16 int n; 17 course courseData[100]; 18 while(1){ 19 system("cls"); 20 printf("模拟实验的进程数量:"); 21 scanf("%d",&n); 22 system("cls"); 23 typeIn(courseData,n);/*录入进程数据*/ 24 myQSort(courseData,0,n-1);/*按到达时间排序进程数据*/ 25 system("cls"); 26 //output(courseData,n);/*按到达时间升序进程数据后输出*/ 27 FCFSreal_timeSimulation(courseData,n);/*实时模拟FCFS进程调度算法*/ 28 summarize(courseData,n);/*实验总结*/ 29 system("pause"); 30 } 31 return 0; 32 } 33 void typeIn(course*courseData,int n){ 34 int i; 35 for(i=0;i<n;i++){ 36 printf("进程名称(Char):"); 37 scanf(" %c",&courseData[i].courseName); 38 printf("到达时间(Int):"); 39 scanf("%d",&courseData[i].startTime); 40 printf("服务时间(Int):"); 41 scanf("%d",&courseData[i].serviceTime); 42 courseData[i].survivalTime=courseData[i].serviceTime; 43 courseData[i].WhetherIn=0; 44 printf("\n"); 45 } 46 } 47 void myQSort(course *courseData,int left,int right){ 48 int i=left,j=right; 49 course key,exchange; 50 if(i<j){ 51 do{ 52 key=courseData[i]; 53 while(i<j&&courseData[j].startTime>key.startTime) 54 j--; 55 if(i<j){ 56 exchange=courseData[i]; 57 courseData[i]=courseData[j]; 58 courseData[j]=exchange; 59 i++; 60 } 61 while(i<j&&courseData[i].startTime<key.startTime) 62 i++; 63 if(i<j){ 64 exchange=courseData[i]; 65 courseData[i]=courseData[j]; 66 courseData[j]=exchange; 67 j--; 68 } 69 }while(i<j); 70 courseData[i]=key; 71 myQSort(courseData,left,i-1); 72 myQSort(courseData,i+1,right); 73 } 74 } 75 void output(course*courseData,int n){ 76 int i; 77 printf("按到达时间升序进程数据后输出如下:\n"); 78 printf("序号 进程名称 到达时间 服务时间\n"); 79 for(i=0;i<n;i++) 80 printf("%d\t%c\t%d\t%d\n",i+1,courseData[i].courseName,courseData[i].startTime,courseData[i].serviceTime); 81 } 82 void FCFSreal_timeSimulation(course*courseData,int n){ 83 int i,j,k; 84 i=k=0; 85 course *queueF,*queueT,*p,*m; 86 queueF=queueT=NULL; 87 while(1){ 88 //printf("当前时间%d:\n",i); 89 if(queueF){/*本次执行进程*/ 90 if(!queueF->WhetherIn){ 91 queueF->WhetherIn=1; 92 queueF->readyTime=i-1; 93 }/* 94 printf("本次执行进程:\n"); 95 printf("进程名称 :%c\n",queueF->courseName); 96 printf("到达时间 :%d\n",queueF->startTime); 97 printf("服务时间 :%d\n",queueF->serviceTime); 98 printf("服务开始时间 :%d\n",queueF->readyTime); 99 printf("已服务时间 :%d\n",queueF->serviceTime-queueF->survivalTime); 100 printf("剩余服务时间 :%d\n\n",queueF->survivalTime);*/ 101 queueF->survivalTime--; 102 } 103 printf("\n"); 104 for(j=0;courseData[j].WhetherIn&&j<n;j++);/*过滤已就绪进程*/ 105 for(;j<n;j++)/*本次就绪进程*/ 106 if(courseData[j].startTime==i){ 107 /*printf("本次就绪进程:\n"); 108 printf("进程名称 :%c\n",courseData[j].courseName); 109 printf("到达时间 :%d\n",courseData[j].startTime); 110 printf("服务时间 :%d\n\n",courseData[j].serviceTime);*/ 111 m=(course*)malloc(sizeof(course)); 112 m->courseName=courseData[j].courseName; 113 m->survivalTime=m->serviceTime=courseData[j].serviceTime; 114 m->startTime=courseData[j].startTime; 115 courseData[j].WhetherIn=1; 116 m->WhetherIn=0; 117 if(queueF) 118 queueT->next=m; 119 else 120 queueF=m; 121 queueT=m; 122 } 123 if(queueT) 124 queueT->next=NULL; 125 if(queueF&&!queueF->survivalTime){/*本次销毁进程*/ 126 queueF->destructionTime=courseData[k].destructionTime=i; 127 courseData[k].readyTime=queueF->readyTime; 128 /*printf("本次销毁进程:\n"); 129 printf("进程名称 :%c\n",queueF->courseName); 130 printf("到达时间 :%d\n",queueF->startTime); 131 printf("服务时间 :%d\n",queueF->serviceTime); 132 printf("服务开始时间 :%d\n",queueF->readyTime); 133 printf("服务结束时刻 :%d\n",i); 134 printf("服务周转时间 :%d\n",queueF->destructionTime-queueF->startTime); 135 printf("加权周转时间 :%.2f\n\n",1.0*(queueF->destructionTime-queueF->startTime)/queueF->serviceTime);*/ 136 if(queueF==queueT){ 137 free(queueF); 138 queueF=queueT=NULL; 139 } 140 else{ 141 p=queueF; 142 queueF=p->next; 143 free(p); 144 } 145 k++; 146 } 147 if(k==n) 148 return; 149 i++; 150 //system("pause"); 151 } 152 } 153 void summarize(course*courseData,int n){ 154 int i; 155 system("cls"); 156 printf("实时模拟FCFS进程调度算法结果如下:\n"); 157 for(i=0;i<n;i++){ 158 printf("进程名称 :%c\n",courseData[i].courseName); 159 printf("到达时间 :%d\n",courseData[i].startTime); 160 printf("服务时间 :%d\n",courseData[i].serviceTime); 161 printf("服务开始时间 :%d\n",courseData[i].readyTime); 162 printf("服务结束时刻 :%d\n",courseData[i].destructionTime); 163 printf("服务周转时间 :%d\n",courseData[i].destructionTime-courseData[i].startTime); 164 printf("加权周转时间 :%.2f\n\n",1.0*(courseData[i].destructionTime-courseData[i].startTime)/courseData[i].serviceTime); 165 } 166 }
版权声明:本文为KurokoTetsuya原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。