进程调度算法 —— 短作业优先调度

时间:2021-12-05 21:13:32
/* 短作业优先调度 */
#include <stdio.h>
struct sjf{
	char name[10];
	float dt;//到达时间
	float st;//服务时间
	float begin_time;//开始运行时间
	float wct;//运行完成时间
	float zt;//周转时间
	float dczt;//带权周转时间
};
sjf a[100];

void input(sjf *p,int n)
{ 
	int i;
	for(i=0;i<=n-1;i++)
	{
		printf("\n\t*********请输入第 %d 个进程的信息:\n",i+1);
		printf("\t进程名称:");
		scanf("%s",&p[i].name);
		printf("\t到达时间:");
		scanf("%f",&p[i].dt);
		printf("\t服务时间:");
		scanf("%f",&p[i].st);
	}
}

void Print(sjf *p,float dt,float st,float begin_time,float wct,float zt,float dczt,int n)
{
	int k;
	float sum1=0,sum2=0;
    printf("\nrun order:");
    printf("%s",p[0].name);
	for(k=1;k<n;k++)
	{
		printf("-->%s",p[k].name);
	} 
    printf("\n\n进程信息如下:\n");
	printf("\n进程名字  到达时间  服务时间  开始时间  完成时间  周转时间  带权周转时间\n");
    for(k=0;k<n;k++)
	{ 
		printf("%3s\t  %3.0f\t\t%.0f\t%.0f\t%3.0f\t\t%.0f\t  %3.2f\n",p[k].name,p[k].dt,p[k].st,p[k].begin_time,p[k].wct,p[k].zt,p[k].dczt);
		sum1+=p[k].zt;
		sum2+=p[k].dczt;
	}
	printf("\n平均周转时间:%.2f\n",sum1/n);
	printf("\n平均带权周转时间:%.2f\n\n",sum2/n);
}

//排序
void sort(sjf *p,int n)
{
     for(int i=0;i<=n-1;i++)
         for(int j=0;j<=i;j++)
             if(p[i].dt<p[j].dt)
             {
                 sjf temp;
                 temp=p[i];
                 p[i]=p[j];
                 p[j]=temp;
             }
}

//运行阶段
void deal(sjf *p, float dt,float st,float begin_time,float wct,float &zt,float &dczt,int n)
{ int k;
    for(k=0;k<=n-1;k++)
    {
		if(k==0)
        { 
			p[k].begin_time=p[k].dt;
			p[k].wct=p[k].dt+p[k].st;
		}
		else
		{
			p[k].begin_time=p[k-1].wct;
			p[k].wct=p[k-1].wct+p[k].st;
		}			
	}
	for(k=0;k<=n-1;k++)
	{
		p[k].zt=p[k].wct-p[k].dt;
		p[k].dczt=p[k].zt/p[k].st;
	}
}

void SJF(sjf *p,int n)
{
	float dt=0,st=0,begin_time=0,wct=0,zt=0,dczt=0;//对结构进行初始化
	sort(p,n);
    for(int m=0;m<n-1;m++)
    {
		if(m==0)
            p[m].wct=p[m].dt+p[m].st;
        else
            p[m].wct=p[m-1].wct+p[m].st;
        int i=0;
        for(int n=m+1;n<=n-1;n++)
        {
			if(p[n].dt<=p[m].wct)//判断内存中每次完成之后有多少到达的进程
				i++;
        }
        float min=p[m+1].st;
        int next=m+1;			//m+1=n
        for(int k=m+1;k<m+i;k++)  //找出到达后的进程中最小的进程
        {
			if(p[k+1].st<min)
            {
				min=p[k+1].st;
				next=k+1;
			}
        }
        sjf temp;
        temp=p[m+1];
        p[m+1]=p[next];
        p[next]=temp;
    }
	deal(p,dt,st,begin_time,wct,zt,dczt,n);
   
	Print(p,dt,st,begin_time,wct,zt,dczt,n);
}
void main()
{ 
	int	n;
	printf("\n--------------短作业优先调度算法-----------------\n");
	printf("\n\t请输入进程的个数: ");
	scanf("%d",&n);
	input(a,n);
	sjf *b=a;
	sjf *c=a;
	SJF(b,n);
}