進程調度算法 —— 時間片輪轉調度


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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM