进程调度之SPF

进程调度之SPF

SPF算法,即短进程优先执行算法。

每次在进程队列中找到已到达的最短进程,并执行该进程(执行完标记该进程)

 

#include 
#include 
#define N 24

struct JOB{
	char name[10] ; 		//进程名
	int atime ;		//到达时间
	int runtime ;		//运行时间
	int ftime ;		//结束时间
	int total ;		//周转时间
	float welght ;		//周转系数
	int arun ;		//进程到达时间

	int flag;			//进程结束标志
};

struct JOB f[N];

int Total = 0;
float Welght = 0;
int Runtime = 0;

void print(int i);

void main()
{

	int amount;			//进程数
	int i;
	int j;
	int minindex = -1;			//记录最短进程下标
	int mintime = 0x7fffffff;		//记录最短进程时间
	char n[10];
	int a;
	int r;



	printf("请输入进程数(2-24)\n");
	scanf("%d",&amount);

	for(i = 0; i < amount; i++)
	{
		printf("请输入进程名,进程到达时间,进程运行时间\n");
		scanf("%s %d %d",&f[i].name, &f[i].atime, &f[i].runtime);
		f[i].flag = 0 ;
	}

	//按到达时间排序
	for(i = 0; i < amount - 1; i++)
	{
		for(j = i+1; j < amount; j++)
		{
			if(f[j].atime >f[i].atime || (f[j].atime == f[i].atime  && f[j].runtime > f[i].runtime))
			{
				continue;
			}
			strcpy(n, f[i].name);
			a = f[i].atime;
			r = f[i].runtime;

			strcpy(f[i].name, f[j].name);
			f[i].atime = f[j].atime;
			f[i].runtime = f[j].runtime;

			strcpy(f[j].name, n);
			f[j].atime = a;
			f[j].runtime = r;
			
		}
	}


	//获取已到达的最短进程
	printf("\n---------------------SPF调度算法----------------------------");
	printf("\n进程名\t到达时间\t开始运行时间\t运行时间\t结束时间\t周转时间\t周转系数\n");
	for(j = 0; j < amount; j++)
	{
		for(i = 0; i < amount; i++)
		{
			if(f[i].flag == 1) continue;
			if(Runtime < f[i].atime && minindex == -1)
			{
				f[i].arun = f[i].atime;
				minindex = i ;
				break;
			}
			else
			{
				if(Runtime < f[i].atime)
				{
					break;
				}
				else
				{
					if(f[i].runtime < mintime)
					{
						minindex = i ;
						mintime = f[i].runtime ;
						f[i].arun = Runtime;

					}
				}
			}
		}
		print(minindex);
		f[minindex].flag = 1;
		minindex = -1 ;
		mintime = 0x7fffffff ;
	}

	printf("\n平均周转时间:%f\n", (float)Total / (float)amount);
	printf("\n平均带权周转时间:%f\n", Welght / (float)amount);
}

void print(int i)
{
	f[i].ftime = f[i].arun + f[i].runtime ;
	f[i].total = f[i].ftime - f[i].atime ;
	f[i].welght = (float)f[i].total/(float)f[i].runtime ;

	printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%f\n",f[i].name, f[i].atime, 
			f[i].arun, f[i].runtime, f[i].ftime, f[i].total, f[i].welght);
	Runtime = f[i].ftime ;
	Total += f[i].total ;
	Welght += f[i].welght ;
}


 

你可能感兴趣的:(进程调度之SPF,段作业调度,c/c++)