调度算法
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
- 进程及进程队列的表示。
- 处理器调度算法:FCFS,SJF,RR,HRRN,MLFQ等
- 跟踪进程状态的转化
- 输出:系统中进程的调度次序,计算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
![](https://img2018.cnblogs.com/blog/1614749/201904/1614749-20190415162045975-1267991245.png)
#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) ; */ }