进程调度实习

#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');

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值