1. 程式人生 > >程序排程演算法 —— 時間片輪轉排程

程序排程演算法 —— 時間片輪轉排程

/*時間片輪轉排程演算法*/
#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;
}