进程调度算法 —— 时间片轮转调度

时间:2022-06-22 19:52:35
/*时间片轮转调度算法*/
#include<stdio.h>
#define MAX 50
struct a_struct
{
	char name[10];		//进程名字
	int number;			//进程编号
	float dt;			//到达时间
	float begin_time;	//开始运行时间
	float st;			//服务时间	
	float end_time;		//完成时间
	int priority;		//优先级
	int flag;			//调度标志
	int start_flag;		//是否为第一次开始调度
	float zt;			//周转时间
	float dczt;			//带权周转时间
}a[MAX];

int n,rr=0;				//n:进程个数  rr:时间片大小 
float sum1,sum2;		//周转时间之和、带权周转时间之和
int Input();
int Output();			//调度结果输出
int Run();
int charge();			//判断是否所有的进程都被执行过

void main(){
	printf("\n**************时间片轮转调度算法***************\n");
	Input();
	Run();
	Output();
}

/*数据输入*/
int Input() 
{
	int i;
	printf("\n\t请输入有n个进程(0<n<=50): ");
	scanf("%d",&n);
	while(n>50||n<=0)
	{
		printf("n\t请重新输入: ");
		scanf("%d",&n);
	}
	printf("\t请输入时间片大小(0<rr):  ");
	scanf("%d",&rr);
	while(rr<=0)
	{
		printf("n\t请重新输入: ");
		scanf("%d",&rr);
	}

	for(i=0;i<n;i++)
	{
		printf("\n\t*******************");
		printf("输入第%d个进程信息:\n",i+1);
		printf("\t进程名字:  ");
        scanf("%s",a[i].name);
		printf("\t进程编号:  ");
        scanf("%d",&a[i].number);
		printf("\t到达时间: ");
		scanf("%f",&a[i].dt);
		printf("\t服务时间: ");
		scanf("%f",&a[i].st);
		printf("\t优先级: ");
		scanf("%d",&a[i].priority);
		a[i].begin_time=0;
        a[i].end_time=0;
        a[i].flag=0;			//运行是否结束
        a[i].start_flag=0;		//是否首次被执行
	}
    return 0;
}

/*算法执行*/
int Run(){
	float time_temp=0;
    int i,j=0;

	struct a_struct  copy_a[MAX];//备份
    for(i=0; i<n; i++)
    {
        copy_a[j++]=a[i];		//对进程的初始化信息备份
    }

	time_temp=a[0].dt;
	while(charge())
	{
        for(i=0; i<n; i++)
		{
            if(a[i].dt>time_temp)
			{
                time_temp=a[i].dt;
            }
            if(a[i].flag==0)			//该进程还未结束
			{
                if(a[i].start_flag==0)	//该条件成立则说明,该进程是第一次执行,记录开始执行时间
				{
                    a[i].begin_time=time_temp;
                    a[i].start_flag=1;
                }
                if(a[i].st/rr>1)		//至少有两倍的时间片未执行
				{
                    a[i].st=a[i].st-rr;
                    time_temp=time_temp+rr;
                }
				else if(a[i].st-rr==0)	//刚好执行一个时间片
				{  
                    time_temp=time_temp+rr;
                    a[i].end_time=time_temp;
                    a[i].flag=1;
                    a[i].st=copy_a[i].st;
                }
                else					//仅剩下不足一倍的时间片
                {
                    time_temp=time_temp+a[i].st;
                    a[i].end_time=time_temp;
                    a[i].flag=1;
                    a[i].st=copy_a[i].st;
                }
            }
        }
    }
	return 0;
}
	
/*判断是否全部进程都执行完毕*/
int charge()
{
    int super_flag=0;			//判断是否全部的进程都执行完毕
    for(int k=0; k<n; k++)
    {
        if(a[k].flag==0)
        {
            super_flag=1;
            return super_flag;
            break;
        }
        else
        {
            super_flag=0;
        }
    }
    return super_flag;
}

/*调度结果输出*/
int Output() 
{
	printf("\n进程编号 进程名字 到达时间 服务时间 优先级 开始时间 完成时间 周转时间 带权周转时间\n");
    for(int i=0; i<n; i++)
    {
        a[i].zt = a[i].end_time - a[i].dt;	//周转时间=完成时间-到达时间
		a[i].dczt=a[i].zt/a[i].st;			//带权周转时间=周转时间/服务时间
		sum1+=a[i].zt;
		sum2+=a[i].dczt;
        printf("%-d\t  %-s\t   %-.0f\t    %-.0f\t    %d\t\t%-.0f\t%-.0f\t %-.2f\t   %-.2f\n",a[i].number,a[i].name,a[i].dt,a[i].st,a[i].priority,a[i].begin_time,a[i].end_time,a[i].zt,a[i].dczt);
    }
	printf("\n平均周转时间:%.2f\n",sum1/n);
	printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
    return 0;
}