完成五个进程调度的模拟包括:1.先到先服务调度(FCFS) 2.最短作业优先调度(SJF)
3.高响应比优先调度 4.(抢占式)优先权调度 5.时间片轮转调度
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 10 //允许最大进程个数
#define M 100 //进程名长度
int n; //进程个数
char name[N][M]; //进程名
int Arival[N]={0}; //到达时间
int Go[N]={0}; //运行时间
int Start[N]={0}; //开始时间
int End[N]={0}; //结束时间
int Timer[N]={0}; //周转时间
float DTimer[N]={0}; //带权周转时间
int Check[N]={0}; //判断作业是否完成,完成值为1
int prio[N]={0}; //优先权,初始化为100,优先权=100-运行时间,运行时间越短优先级越高,先进行调度
int left[N]={0}; //剩余时间,抢占、轮转调度时剩余时间
void input(){
int i;
printf("输入进程的个数:");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("输入 进程名:");
scanf("%s",&name[i]);
printf("第%d个进程的到达时间:",i+1);
scanf("%d",Arival+i);
printf("第%d个进程的运行时间:",i+1);
scanf("%d",Go+i);
prio[i]=100-Go[i];
left[i]=Go[i];
}
}
/*先来先服务调度算法*/
/**选出先到达的作业
*a[] 到达时间
*n 进程个数
**/
int Select1(int a[],int n){
int i=0;
for(int k=0;k<n;k++){
if(Check[k]==0){
i=k;
break;
}
}
for(int j=0;j<n;j++){
if(a[i]>a[j]&&Check[j]==0){
i=j;
}
}
Check[i]=1;
return i;
}
/*短作业优先调度算法*/
/**选出短作业
*a[] 运行时间
*n 进程个数
*local 当前时间
**/
int Select2(int a[],int n,int local){
int i=0;
for(int k=0;k<n;k++){
if(Check[k]==0){
i=k;
break;
}
}
for(int j=0;j<n;j++){
if(a[i]>a[j]&&Check[j]==0&&Arival[j]<=local){
i=j;
}
}
Check[i]=1;
return i;
}
/*高响应比优先调度算法*/
/**选出响应比最高作业
*优先权=等待时间+要求服务时间/要求服务时间
*a[] 到达时间
*b[] 要求服务时间
*n 进程个数
*local 当前时间
**/
int Select3(int a[],int b[],int n,int local){
int i=0;
double rate;
for(int k=0;k<n;k++){
if(Check[k]==0){
i=k;
break;
}
}
rate=(local-a[i]+b[i])/b[i];
for(int j=0;j<n;j++){
double temp=(local-a[j]+b[j])/b[j];
if(temp>rate&&Check[j]==0&&Arival[j]<=local){
i=j;
rate=temp;
}
}
Check[i]=1;
return i;
}
void diaodu(int x){
int k=0; //每次选出即将服务的进程
int l=0; //本次服务的进程
int Atimer=0; //周转时间之和
float timer=0; //带权周转时间之和
int localtime=0; //当前时间
memset(Check,0,sizeof(Check));//每次开始之前Check数组要全部置0
if(x==1)
k=Select1(Arival,n);
if(x==2)
k=Select2(Go,n,localtime);
if(x==3)
k=Select3(Arival,Go,n,localtime);
Start[k]=Arival[k];
End[k]=Start[k]+Go[k];
Timer[k]=End[k]-Arival[k];
DTimer[k]=(float)Timer[k]/Go[k];
localtime=End[k];
printf("作业 提交时间 运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(int m=0;m<n;m++){
l=k;
if(x==1)
k=Select1(Arival,n);
if(x==2)
k=Select2(Go,n,localtime);
if(x==3)
k=Select3(Arival,Go,n,localtime);
Start[k]=End[l];
End[k]=Start[k]+Go[k];
Timer[k]=End[k]-Arival[k];
DTimer[k]=(float)Timer[k]/Go[k];
Atimer=Timer[l]+Atimer;
timer=timer+DTimer[l];
printf(" %s %2d %2d %2d %2d %2d %.2f\n",name[l],Arival[l],Go[l],Start[l],End[l],Timer[l],DTimer[l]);
}
printf("平均周转时间:%.2f\n",(float)Atimer/n);
printf("平均带权周转时间:%.2f\n",(float)timer/n);
}
/*抢占式优先权调度算法*/
/**选出该时刻前优先级最高的进程
*a[] 优先级
*left[] 剩余时间
*n 进程个数
*local 当前时间
**/
int Select4(int a[],int left[],int n,int local){
int i=0;
for(int k=0;k<n;k++){
if(Check[k]==0){
i=k;
break;
}
}
for(int j=0;j<n;j++){
if(a[j]>a[i]&&left[j]!=0&&Arival[j]<=local){
i=j;
}
}
return i;
}
void p_prio(){
int k=0; //每次选出即将服务的进程
int l=0; //本次服务的进程
int Atimer=0; //周转时间之和
float timer=0; //带权周转时间之和
int localtime=0; //当前时间
memset(Check,0,sizeof(Check));//每次开始之前Check数组要全部置0
k=Select4(prio,left,n,localtime);
Start[k]=Arival[k];
int sum=0; //记录完成进程数
printf("作业 提交时间 运行时间 开始时间 剩余运行时间 结束时间 周转时间 带权周转时间\n");
while(sum<n){
localtime++;
left[k]--;
prio[k]++;
if(left[k]==0){
sum++;
Check[k]=1;
End[k]=localtime;
Timer[k]=End[k]-Arival[k];
DTimer[k]=(float)Timer[k]/Go[k];
printf(" %s %2d %2d %2d %2d %2d %2d %.2f\n",name[k],Arival[k],Go[k],Start[k],left[k],End[k],Timer[k],DTimer[k]);
}
else
printf(" %s %2d %2d %2d %2d 未完成 未完成 未完成\n",name[k],Arival[k],Go[k],Start[k],left[k]);
l=Select4(prio,left,n,localtime);//有新进程抢占
if(l!=k){
if(left[l]==Go[l])//第一次被选中记录开始时间
Start[l]=localtime;
k=l;
}
}
for(int i=0;i<n;i++){
Atimer=Timer[i]+Atimer;
timer=timer+DTimer[i];
}
printf("平均周转时间:%.2f\n",(float)Atimer/n);
printf("平均带权周转时间:%.2f\n",(float)timer/n);
}
/*时间片轮转调度算法*/
void lun(){
int k=0; //每次选出即将服务的进程
int l=0; //本次服务的进程
int Atimer=0; //周转时间之和
float timer=0; //带权周转时间之和
int localtime=0; //当前时间
memset(Check,0,sizeof(Check));//每次开始之前Check数组要全部置0
//k=Select4(prio,left,n,localtime);
Start[k]=Arival[k];
int sum=0; //记录完成进程数
printf("作业 提交时间 运行时间 开始时间 剩余运行时间 结束时间 周转时间 带权周转时间\n");
while(true){
localtime++;
left[k]--;
if(left[k]==0){
sum++;
Check[k]=1;
End[k]=localtime;
Timer[k]=End[k]-Arival[k];
DTimer[k]=(float)Timer[k]/Go[k];
printf(" %s %2d %2d %2d %2d %2d %2d %.2f\n",name[k],Arival[k],Go[k],Start[k],left[k],End[k],Timer[k],DTimer[k]);
if(sum==n)
break;
}
else
printf(" %s %2d %2d %2d %2d 未完成 未完成 未完成\n",name[k],Arival[k],Go[k],Start[k],left[k]);
while(true){
k++;
if(k==n)
k=k-n;
if(left[k]!=0)
break;
}
if(left[k]==Go[k]){
Start[k]=localtime;
}
}
for(int i=0;i<n;i++){
Atimer=Timer[i]+Atimer;
timer=timer+DTimer[i];
}
printf("平均周转时间:%.2f\n",(float)Atimer/n);
printf("平均带权周转时间:%.2f\n",(float)timer/n);
}
void menu(){
int choice;
while(1){
printf(" 请选择调度算法 \n\t1、先来先服务(FCFS)\n\t2、短作业优先(SJF)\n\t3、高响应比优先\n\t4、(抢占式)优先权调度\n\t5、时间片轮转调度\n\t0、退出\n请输入:");//
scanf("%d",&choice);
if(choice==0){
break;
}
else if(choice<=3){
diaodu(choice);
}
else if(choice==4){
p_prio();
}
else{
lun();
}
}
}
int main(){
input();
menu();
return 0;
}