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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  1. 进程及进程队列的表示。
  2. 处理器调度算法:FCFS,SJF,RR,HRRN,MLFQ等
  3. 跟踪进程状态的转化
  4. 输出:系统中进程的调度次序,计算CPU利用率,平均周转时间和平均带权周转时间

 

 

 

三.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 ;
}

  

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄