调度算法

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

  1. 进程及进程队列的表示。
  2. 处理器调度算法:FCFS,SJF,RR,HRRN,MLFQ等
  3. 跟踪进程状态的转化
  4. 输出:系统中进程的调度次序,计算CPU利用率,平均周转时间和平均带权周转时间

 一、FCFS

1.流程图

 

#include<stdio.h>
#include<string.h>
#define MAX 10
struct jcb{
    char name[20];         //作业名称
    float arrtime;         //到达系统时间
    float reqtime;         //cpu所需时间
    float finitime;        //结束时间
    float TAtime;          //周转时间
    float TAWtime;        //带权周转时间
};
int main(){
    struct jcb a[MAX],temp;
    int i,j,n;
    float all_time=0 ;      //运行总时间
    printf("输入作业的个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("第%d个作业:\n",i+1);
        printf("输入作业名:");
        scanf("%s",a[i].name);
        printf("到达时间:");
        scanf("%f",&a[i].arrtime);
        printf("要求服务时间:");
        scanf("%f",&a[i].reqtime);
    }
    printf("\n未排序前的作业列表为:\n");
    printf("作业名\t到达系统时间\tcpu所需时间\n");        //输出未排序前的作业列表
    for(i=0;i<n;i++)
    {
        printf("%s\t%.1f\t\t%.1f \n",a[i].name,a[i].arrtime,a[i].reqtime);
    }
     for(i=0;i<n-1;i++) //按到达时间排序
    {
        for(j=i+1;j<n;j++)
        {
            if(a[j].arrtime < a[i].arrtime)
            {
                temp=a[i] ;
                a[i]=a[j] ;
                a[j]=temp ;
            }
        }
    }
    printf("\n按照FCFS算法排序后的作业列表为:\n");
    printf("作业名\t到达系统时间\tCPU所需时间\n");   //输出排序后的作业列表
    for(i=0;i<n;i++)
    {
        printf("%s\t%.1f\t\t%.1f \n",a[i].name,a[i].arrtime,a[i].reqtime);
    }
    float sum_TAtime=0 ,sum_TAWtime=0;
    for( i=0 ; i<n ; i++)
    {
        if( a[i].arrtime >all_time )            //是否有进程进行
        {
            all_time +=(a[i].arrtime-all_time) ;
            all_time +=a[i].reqtime ;
            a[i].finitime=all_time ;
        }
        else {
                all_time +=a[i].reqtime ;
                a[i].finitime=all_time ;
        }
        a[i].TAtime=all_time ;
        a[i].TAWtime=a[i].TAtime/a[i].reqtime ;
        sum_TAtime +=a[i].TAtime ;
        sum_TAWtime +=a[i].TAWtime ;
    }
    float Avg , Avgw ;
    Avg=sum_TAtime/n ;
    Avgw= sum_TAWtime/n ;
    printf("\n------------进程结束-------------\n");
    printf("作业名\t到达时间\tCPU所需时间\t完成时间\t周转时间\t带权周转时间\n");   //输出排序后的作业列表
    for(i=0;i<n;i++)
    {
        printf("%s\t%.1f\t\t%.1f\t\t%.1f \t\t%.1f\t\t%.1f\n",a[i].name,a[i].arrtime,a[i].reqtime,a[i].finitime,a[i].TAtime,a[i].TAWtime);
    }
    printf("\n平均周转时间:%.1f",Avg) ;
    printf("\n平均带权周转时间:%.1f",Avgw) ;
}

二、SJF

#include<stdio.h>
#include<string.h>
#define MAX 10
struct jcb{
char name[20]; //作业名称
float arrtime; //到达系统时间
float reqtime; //cpu所需时间
float finitime; //结束时间
float TAtime; //周转时间
float TAWtime; //带权周转时间
};
int main(){
struct jcb a[MAX],temp;
struct jcb flag[MAX] ;
int flag_num=0 ;
int i,j,n;
float all_time=0 ; //运行总时间
printf("输入作业的个数:");
scanf("%d",&n);
int n_flag=n ;
for(i=0;i<n;i++)
{
printf("第%d个作业:\n",i+1);
printf("输入作业名:");
scanf("%s",a[i].name);
printf("到达时间:");
scanf("%f",&a[i].arrtime);
printf("要求服务时间:");
scanf("%f",&a[i].reqtime);
}
printf("\n未排序前的作业列表为:\n");
printf("作业名\t到达系统时间\tcpu所需时间\n"); //输出未排序前的作业列表
for(i=0;i<n;i++)
{
printf("%s\t%.1f\t\t%.1f \n",a[i].name,a[i].arrtime,a[i].reqtime);
}
for(i=0;i<n-1;i++) //按服务时间排序
{
for(j=i+1;j<n;j++)
{
if(a[j].reqtime < a[i].reqtime)
{
temp=a[i] ;
a[i]=a[j] ;
a[j]=temp ;
}
}
}

//运行SJF算法
do{
for( i=0 ;i<n_flag ; i++)
{
if( a[i].arrtime>all_time )//判断进程是否到达
{
continue ;
}
else //进程到达
{
all_time+=a[i].reqtime ;
flag[flag_num]=a[i] ;
flag[flag_num].finitime=all_time ;
flag_num++ ;
for( j =i+1 ; j<n_flag-1 ; j++)
a[j]=a[j+1] ;
n_flag-- ;
break ;
}

}
}while(flag_num!=(n-1)) ;
printf("\n按照SJF算法排序后的作业列表为:\n");
printf("作业名\t到达系统时间\tCPU所需时间\n"); //输出排序后的作业列表
for(i=0;i<n;i++)
{
printf("%s\t%.1f\t\t%.1f \n",flag[i].name,flag[i].arrtime,flag[i].reqtime);
}

float sum_TAtime=0 ,sum_TAWtime=0;
for( i=0 ; i<n ; i++)
{

flag[i].TAtime=all_time ;
flag[i].TAWtime=flag[i].TAtime/flag[i].reqtime ;
sum_TAtime +=flag[i].TAtime ;
sum_TAWtime +=flag[i].TAWtime ;
}
float Avg , Avgw ;
Avg=sum_TAtime/n ;
Avgw= sum_TAWtime/n ;
printf("\n------------进程结束-------------\n");
printf("作业名\t到达时间\tCPU所需时间\t完成时间\t周转时间\t带权周转时间\n"); //输出排序后的作业列表
for(i=0;i<n;i++)
{
printf("%s\t%.1f\t\t%.1f\t\t%.1f \t\t%.1f\t\t%.1f\n",flag[i].name,flag[i].arrtime,flag[i].reqtime,flag[i].finitime,flag[i].TAtime,flag[i].TAWtime);
}
printf("\n平均周转时间:%.1f",Avg) ;
printf("\n平均带权周转时间:%.1f",Avgw) ;

}

 

 

三.RR

#include <stdio.h>
#define MAX 10
#define CLOCK 2
struct Process{
	char name[MAX] ;
	int get_time ;        //获取时间
	int server_time ;      //服务时间
	int shen_time ;      //剩余时间
	int finish_time ;   //完成时间
	float cylcing_time ;	//周转时间
} ;
float CPU_time=0 ;
float All_time=0 ;
int main()
{
	Process pro[MAX] , flag;
	Process record[MAX] ;
	int number , i , j , count=0 ;
	int time=0 , number_1;
	float time_1=0 , cycle_time=0 ;
	printf("请输入进程个数:");
	scanf("%d",&number) ;
	number_1 = number ;
	for(  i=0 ; i<number ; i++)
	{
		printf("请输入进程名:");
		scanf("%s",&pro[i].name) ;
		printf("请输入进程到达时间:") ;
		scanf("%d",&pro[i].get_time) ;
		printf("请输入进程服务时间:");
		scanf("%d",&pro[i].server_time) ;
        pro[i].shen_time = pro[i].server_time ;
        pro[i].finish_time=0 ;
	}
	for( i=0 ; i<number-1 ; i++)
	{
		for( j=i+1 ; j<number ; j++)
		{
			if( pro[i].get_time > pro[j].get_time)
			{
				flag = pro[i] ;
				pro[i] = pro[j] ;
				pro[j] = flag ;
			}
		}
	}
        printf("进程名    到达时间    服务时间\n") ;
	for( i=0 ; i<number_1 ; i++)
	{
		printf(" %s		%d	%d\n",pro[i].name,pro[i].get_time,pro[i].server_time) ;
	}
        time=pro[0].get_time ;	//进程开始工作的时间
	do{
		for( i=0 ;i<number_1 ;i++)
		{
			if( pro[i].get_time > time )    //判断有无进程工作
			{
				time += CLOCK ;
				All_time+=CLOCK ;
				continue ;
			}
			if( pro[i].shen_time <= CLOCK )	//判断进程能否完成
				{
					time +=pro[i].shen_time ;
					CPU_time +=pro[i].shen_time ;
					pro[i].finish_time = time ;
					record[count]=pro[i] ;
					count++ ;
					for( j=i ; j<number_1-1 ; j++ )	//该进程往后的进程都向前移动一位
					{
						pro[j]=pro[j+1] ;
					}
					number_1-- ;
				}
			else if( pro[i].shen_time > CLOCK)  //进程剩余时间大于时间片时间
			{
				pro[i].shen_time -= CLOCK ;
				time += CLOCK ;
			}
		}
	}while(number_1!=0 ) ;
	for( i=0 ; i<count ; i++)
    {
        time_1 += record[i].finish_time ;
    }
	time_1 =time_1 / count ;    //计算平均周转时间

	for( i=0 ; i<count ; i++)
    {
        cycle_time += record[i].finish_time/(float)(record[i].server_time) ;
    }
    cycle_time=cycle_time/count ;   //计算平均带权周转时间
    CPU_time=(CPU_time/All_time) ;
	printf("进程名     到达时间    完成时间\n") ;
	for(i=0 ; i<count ; i++)
	{
		printf("  %s\t\t%d\t%d\n",record[i].name,record[i].get_time,record[i].finish_time) ;
	}
	printf("平均周转时间为: %4.2f\n",time_1) ;
	printf("平均周带权转时间为: %4.2f\n",cycle_time) ;
	//printf("CPU利用率为: %4.2f\n",CPU_time );       //乱码
	return 0 ;
四、MFLQ

#include<stdio.h>
#include<string.h>
#define MAX 10
struct jcb{
    char name[20];         //作业名称
    int pri ;              //优先级1-3
    float arrtime;         //到达系统时间
    float reqtime;         //cpu所需时间
    float finitime;        //结束时间
    float TAtime;          //周转时间
    float TAWtime;        //带权周转时间
};
int main(){
    struct jcb a[MAX],temp ,First[MAX],Second[MAX],Third[MAX];
    int count_1=0 ,coaunt_2=0 ,count_3=0 ;
    int CLOCK_1 , CLOCK_2 , CLOCK_3 ;
    int i,j,n;
    float all_time=0 ;      //运行总时间
    printf("输入作业的个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("第%d个作业:\n",i+1);
        printf("输入作业名:");
        scanf("%s",a[i].name);
        printf("到达时间:");
        scanf("%f",&a[i].arrtime);
        printf("要求服务时间:");
        scanf("%f",&a[i].reqtime);
        printf("优先级:");
        scanf("%d",&a[i].pri);
    }
    printf("输入优先级最高的时间片长度:");
    scanf("%d",&CLOCK_1);
    printf("输入优先级第二的时间片长度:");
    scanf("%d",&CLOCK_2);
    printf("输入优先级最低的时间片长度:");
    scanf("%d",&CLOCK_3);
    printf("\n未排序前的作业列表为:\n");
    printf("作业名\t到达系统时间\tcpu所需时间\t优先级\n");        //输出未排序前的作业列表
    for(i=0;i<n;i++)
    {
        printf("%s\t%.1f\t\t%.1f\t%d \n",a[i].name,a[i].arrtime,a[i].reqtime,a[i].pri);
    }
     for(i=0;i<n-1;i++) //按到达时间排序
    {
        for(j=i+1;j<n;j++)
        {
            if(a[j].arrtime < a[i].arrtime)
            {
                temp=a[i] ;
                a[i]=a[j] ;
                a[j]=temp ;
            }
        }
    }
    for( i=0;i<n ; i++)         //按优先级入队
    {
        if( a[i].pri==1 )       //优先级最高的队列
        {
            First[count_1]=a[i] ;
            count_1++ ;
        }
        else if( a[i].pri==2 )  //优先级第二的队列
        {
            Second[count_2]=a[i] ;
            count_2++ ;
        }
        else if( a[i].pri==3 )  //优先级最低的队列
        {
            Third[count_3]=a[i] ;
            count_3 ;
        }
    }
    printf("作业名\t到达系统时间\tcpu所需时间\t优先级\n");        //输出未排序前的作业列表
    for( i=0 ;i<count_1 ; i++)
    {
        printf("%s\t%.1f\t\t%.1f\t\t%d \n",First[i].name,First[i].arrtime,First[i].reqtime,First[i].pri);
    }
    for( i=0 ; i<count_2 ; i++ )
    {
        printf("%s\t%.1f\t\t%.1f\t\t%d \n",Second[i].name,Second[i].arrtime,Second[i].reqtime,Second[i].pri);
    }
    for( i=0 ; i<count_3 ; i++ )
    {
        printf("%s\t%.1f\t\t%.1f\t\t%d \n",Third[i].name,Third[i].arrtime,Third[i].reqtime,Third[i].pri);
    }
    /*
    float sum_TAtime=0 ,sum_TAWtime=0;
    for( i=0 ; i<n ; i++)
    {
        if( a[i].arrtime >all_time )            //是否有进程进行
        {
            all_time +=(a[i].arrtime-all_time) ;
            all_time +=a[i].reqtime ;
            a[i].finitime=all_time ;
        }
        else {
                all_time +=a[i].reqtime ;
                a[i].finitime=all_time ;
        }
        a[i].TAtime=all_time ;
        a[i].TAWtime=a[i].TAtime/a[i].reqtime ;
        sum_TAtime +=a[i].TAtime ;
        sum_TAWtime +=a[i].TAWtime ;
    }
    float Avg , Avgw ;
    Avg=sum_TAtime/n ;
    Avgw= sum_TAWtime/n ;
    printf("\n------------进程结束-------------\n");
    printf("作业名\t到达时间\tCPU所需时间\t完成时间\t周转时间\t带权周转时间\n");   //输出排序后的作业列表
    for(i=0;i<n;i++)
    {
        printf("%s\t%.1f\t\t%.1f\t\t%.1f \t\t%.1f\t\t%.1f\n",a[i].name,a[i].arrtime,a[i].reqtime,a[i].finitime,a[i].TAtime,a[i].TAWtime);
    }
    printf("\n平均周转时间:%.1f",Avg) ;
    printf("\n平均带权周转时间:%.1f",Avgw) ;
    */
}

 

 

posted on 2019-04-14 18:25  施伟康  阅读(458)  评论(1编辑  收藏  举报

导航