调度算法
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
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 ; }

更多精彩