#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*******以下为先来先服务主要算法*****************/
//
//声明一个先来先服务的结构,成员包含进程运行的各种时间
struct fcfs{
char name[20];//进程名字
float ddtime; //到达时间
float yxtime; //运行时间
float kstime; //开始时间
float wctime; //完成时间
float zztime; //周转时间
float dqzztime; //带权周转时间
};
struct fcfs a[1000]; //定义结构数组,一个数组元素中记录有结构中各种信息
void intput1(fcfs *p,int n) //输入进程信息的函数
{
int i;
for(i=0;i<n;i++) //输入必要的几个信息
{
printf("\n****************************\n",i+1);
printf("请您输入第%d个进程的下列信息:",i+1);
printf("\n\n进程名字:");
scanf("%s",&p[i].name);
printf("到达时间:");
scanf("%f",&p[i].ddtime);
printf("运行时间:");
scanf("%f",&p[i].yxtime);
}
printf("\n****************************\n",i+1);
}
void sort(fcfs *p,int n) //进程根据“到达时间”进行排序
{
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(p[i].ddtime>p[j].ddtime) //如果i的到达时间小于j的到达时间,就交换
{
fcfs temp; //定义结构类型的变量,交换时进程内的各种信息都被交换
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
printf("\n进程执行顺序为: ");
for(i=0;i<n;i++)
printf("%s ",p[i].name);
}
void output1(fcfs *p,int n)//定义输入函数,输入进程的各种信息
{
int k;
printf("\n\n进程的相关信息如下表所示:");
printf("\n------------------------------------------------------------------------------------------------------------");
printf("\n进程名字\t到达时间\t运行时间\t开始时间\t完成时间\t周转时间\t带权周转时间\n");
printf("------------------------------------------------------------------------------------------------------------");
for(k=0;k<n;k++)
{
printf("\n%s\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",p[k].name,p[k].ddtime,p[k].yxtime,p[k].kstime,p[k].wctime,p[k].zztime,p[k].dqzztime);
printf("------------------------------------------------------------------------------------------------------------");
}
printf("\n");
}
void FCFS(fcfs *p,int n) //运行函数计算进程的各种时间
{
int k;
for(k=0;k<n;k++) //计算开始时间和完成时间
{
if(k==0) //k=0,表示第一个进程到达
{
p[k].kstime=p[k].ddtime; //第一个进程的开始时间就是它的到达时间
p[k].wctime=p[k].ddtime+p[k].yxtime; //完成时间=到达时间+运行时间
}
else
{
if(p[k].ddtime<=p[k-1].wctime) //如果这个进程的到达时间小于上一个进程的完成时间
p[k].kstime=p[k-1].wctime; //此进程的开始时间=上一个进程的完成时间
else
p[k].kstime=p[k].ddtime;
p[k].wctime=p[k].kstime+p[k].yxtime; //此进程的完成时间=此进程的开始时间+运行时间
}
p[k].zztime=p[k].wctime-p[k].ddtime; //周转时间=完成时间-到达时间
p[k].dqzztime=p[k].zztime/p[k].yxtime; //带权周转时间=周转时间/运行时间
}
}
/*******以下为时间片轮转算法*****************/
//
struct shijian //声明一个时间结构,包含了各种所用到的时间
{
char name[20];//进程名字
float ddtime;//到达时间
float yxtime;//运行时间
float sytime;//剩余时间
float wctime;//完成时间
float kstime;//开始时间
float zztime;//周转时间
float dqzztime;//带权周转时间
int number;//记录进程执行次数
int sign; //进程完成的标志(1表示完成,0表示还没有完成)
};
struct shijian time[1000];
void intput2(shijian *p,int n) //输入进程信息的函数
{
int i;
for(i=0;i<n;i++) //输入必要的几个信息
{
printf("\n****************************\n",i+1);
printf("请您输入第%d个进程的下列信息:",i+1);
printf("\n\n进程名字:");
scanf("%s",&p[i].name);
printf("到达时间:");
scanf("%f",&p[i].ddtime);
printf("运行时间:");
scanf("%f",&p[i].yxtime);
p[i].sytime=p[i].yxtime;
p[i].sign=0;
}
printf("\n****************************\n",i+1);
}
void sort2(shijian *p,int n) //进程根据“到达时间”由先到后进行排序
{
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(p[i].ddtime>p[j].ddtime) //如果i的到达时间小于j的到达时间,就交换
{
shijian temp; //定义结构类型的变量,交换时进程内的各种信息都被交换
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
printf("\n进程按照到达时间排序:");
for(i=0;i<n;i++)
printf("%s ",p[i].name);
}
void output2(shijian *p,int n)//定义输入函数,输入进程的各种信息
{
int i;
printf("\n\n进程的相关信息如下表所示:");
printf("\n------------------------------------------------------------------------------------------------------------------------\n");
printf("进程名字\t到达时间\t开始时间\t运行时间\t完成时间\t周转时间\t带权周转时间\t执行次数\n");
printf("------------------------------------------------------------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%s\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",p[i].name,p[i].ddtime,p[i].kstime,p[i].yxtime,p[i].wctime,p[i].zztime,p[i].dqzztime,p[i].number);
printf("------------------------------------------------------------------------------------------------------------------------\n");
}
printf("\n");
}
void compare(shijian *p,int t,int n,float *nowtime,int *flag,int *sum)//比较进程与时间片关系的函数
{
int i;
for(i=0;i<n;i++)
{
if(p[i].sign==1) //如果此进程已经完成
continue;
else //如果此进程没有完成
{
if(*nowtime>=p[i].ddtime)
{
*flag=1; //就绪队列中有进程
if(p[i].sytime<=t) //如果此进程剩余服务时间小于一个时间片
{
p[i].number++; //执行次数加一
if(p[i].number==1){p[i].kstime=*nowtime;}//开始时间为当前的时间
*nowtime=*nowtime+p[i].sytime;
p[i].wctime=*nowtime;
p[i].zztime=p[i].wctime-p[i].ddtime; //周转时间=完成时间-到达时间
p[i].dqzztime=p[i].zztime/p[i].yxtime; //带权周转时间=周转时间/运行时间
p[i].sign=1; //标志着这个进程做完了
*sum=*sum+1; //完成的进程数加一
p[i].sytime=0;//剩余时间为0
}
else //如果此进程剩余服务时间大于一个时间片
{
*flag=1; //就绪队列中有进程
p[i].number++; //执行次数加一
if(p[i].number==1){p[i].kstime=*nowtime;}//开始时间为当前的时间
p[i].sytime=p[i].sytime-t;
*nowtime=*nowtime+t;
}
}
}
}
}
void RR(shijian *p,int n) //时间片函数
{
int t,i; //t表示时间片
int SUM=0; //记录完成进程数目
int FLAG=0; //进程是否进入就绪队列的标志(1表示进入了,0表示没有进入)
float NOW=0; //记录当前时间
NOW=p[0].ddtime; //记录当前时间的初值是多少
p[0].kstime=p[0].ddtime; //第一个到达的进程开始时间与到达时间相等
printf("\n\n请您输入时间片:");
scanf("%d",&t);
for(i=0;i<n;i++){p[i].number=0;} //初始化进程的执行次数为0;
while(SUM<n)
{
FLAG=0; //设就绪队列中没有进程
compare(p,t,n,&NOW,&FLAG,&SUM);
if(FLAG==0&&SUM<n) //如果进程没有执行完,但是就绪队列中已经没有进程了(说明前面进程都执行完,下一个进程还不到)
{
for(i=0;i<n;i++)
if(p[i].sign==0){NOW=p[i].ddtime;break;}
}
}
}
/*******以下为优先级调度算法*****************/
//
struct priority//声明一个结构,包含了各种所用到的时间
{
char name[30];//进程名字
float yxtime;//运行时间
float kstime;//开始时间
float sytime;//剩余时间
float ddtime;//到达时间
float wctime;//完成时间
float zztime;//周转时间
float dqzztime;//带权周转时间
int youxian;//优先数
int sign; //进程完成的标志(1表示完成,0表示还没有完成)
};
struct priority pr[50];
void intput3(priority *p,int n)//定义输入函数,输入进程的各种信息
{
int i;
for(i=0;i<n;i++)
{
printf("\n****************************\n",i+1);
printf("请您输入第%d个进程的下列信息:",i+1);
printf("\n\n进程名字:");
scanf("%s",&p[i].name);
printf("到达时间:");
scanf("%f",&p[i].ddtime);
printf("运行时间:");
scanf("%f",&p[i].yxtime);
printf(" 优先数:");
scanf("%d",&p[i].youxian);
p[i].sytime=p[i].yxtime;
p[i].sign=0;
}
}
void output3(priority *p,int n)//定义输入函数,输入进程的各种信息
{
int i;
printf("\n\n进程的相关信息如下表所示:");
printf("\n----------------------------------------------------------------------------------------------------------------------");
printf("\n进程名字\t到达时间\t开始时间\t运行时间\t完成时间\t周转时间\t带权周转\t优先数\n");
printf("----------------------------------------------------------------------------------------------------------------------");
for(i=0;i<n;i++)
{printf("\n%s\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",p[i].name,p[i].ddtime,p[i].kstime,p[i].yxtime,p[i].wctime,p[i].zztime,p[i].dqzztime,p[i].youxian);
printf("----------------------------------------------------------------------------------------------------------------------");}
printf("\n");
}
void sort3(priority *p,int n)//定义排序函数,按照到达时间从先到后将进程排序
{
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(p[i].ddtime>p[j].ddtime) //如果i的到达时间大于j的到达时间,就交换
{
priority temp; //定义结构类型的变量,交换时进程内的各种信息都被交换
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(p[i].ddtime==p[j].ddtime && p[i].youxian<p[j].youxian) //如果i和j的到达时间相等,但是优先数不同,则按照优先数进行排列
{
priority temp; //定义结构类型的变量,交换时进程内的各种信息都被交换
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
printf("\n进程按照到达时间排序:");
for(i=0;i<n;i++)
printf("%s ",p[i].name);
}
void sort4(priority *p,int qq,int zz)//定义排序函数,按照优先数从高到低将进程排序
{
int i,j;
for(i=qq+1;i<=qq+zz;i++) //就绪队列中第一个进程下标qq+1,最后一个进程下标qq+zz
for(j=i+1;j<=qq+zz;j++)
if(p[i].youxian<p[j].youxian) //如果i的优先数小于j的优先数,就交换
{
priority temp; //定义结构类型的变量,交换时进程内的各种信息都被交换
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
void priority(priority *p,int n)//定义优先级函数
{
int i,j=0,qq,zz=0;
float nowtime=p[0].ddtime; //初始化当前时间为第一个进程的到达时间
for(i=0;i<n;i++) //循环一次就有一个进程做完
{
while(p[i].sign==0)// 进程没有做完就一直循环直到做完
{
if(p[i].sytime==0)
{
p[i].sign=1;
p[i].kstime=nowtime; //开始时间=当前时间
nowtime+=p[i].yxtime;
p[i].wctime=nowtime;
p[i].zztime=p[i].wctime-p[i].ddtime; //周转时间=完成时间-到达时间
p[i].dqzztime=p[i].zztime/p[i].yxtime; //带权周转时间=周转时间/运行时间
}
else
{
p[i].sytime--; //不将其直接设为0,而是要减1,模拟进程不断执行
}
} //执行完一个进程,跳出循环
zz=0;
qq=i;//记录进程的下标
for(j=i+1;j<n;j++)//计算此时就绪队列中的进程数
{
if(p[j].ddtime<=nowtime)
zz++;
}
if(zz==0)//就绪队列中的进程数为0
{
nowtime=p[i+1].ddtime;
for(j=i+1;j<n;j++)
if(p[j].ddtime<=nowtime)
zz++;
}
if(zz>1)
sort4(p,qq,zz); //将就绪队列中的进程按照优先级排序
}
}
void main()
{
int N;//进程的个数
int number=0;
char tishi;
do{
printf("\n-------------------提示框-------------------\n");
printf("********************************************\n");
printf("******* 【先来先服务算法】请输入 1 *******\n");
printf("******* 【时间片轮转算法】请输入 2 *******\n");
printf("******* 【优先级调度算法】请输入 3 *******\n");
printf("********************************************\n");
printf("\n请选择您的算法:");
scanf("%d",&number);
switch(number)
{
case 1:
printf("\n恭喜您选择:【先来先服务算法】\n\n");
printf("\n请您输入进程的数量:");
scanf("%d",&N);
intput1(a,N);
sort(a,N);
FCFS(a,N);
output1(a,N);
break;
case 2:
printf("\n恭喜您选择:【时间片轮转算法】\n\n");
printf("\n请您输入进程数量:");
scanf("%d",&N);
intput2(time,N);
sort2(time,N);
RR(time,N);
output2(time,N);
break;
case 3:
printf("\n恭喜您选择:【优先级调度算法】\n\n");
printf("\n请您输入进程数量:");
scanf("%d",&N);
intput3(pr,N);
sort3(pr,N);
priority(pr,N);
output3(pr,N);
break;
default:
printf("\n您的输入有误,请确定从1到3之间进行输入,谢谢!!!!!\n");
break;
}
printf("\n\n------------------------------------------");
printf("\n您要继续执行吗?(是请输入y)(否请输入n)");
printf("\n\n请选择:");
fflush(stdin);//清空输入缓冲区
scanf("%c",&tishi);
}while(tishi=='y');
}
进程调度实习
最新推荐文章于 2024-11-12 21:59:57 发布