实时模拟_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 }

转载于:https://www.cnblogs.com/KurokoTetsuya/p/3612132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值