调度算法
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。- 进程及进程队列的表示。
- 处理器调度算法:FCFS,SJF,RR,HRRN,MLFQ等
- 跟踪进程状态的转化
- 输出:系统中进程的调度次序,计算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 ;
}
更多精彩

