先来先服务FCFS算法:进程先进入的先服务。
短作业优先SJF算法:根据当前到来的进程,筛选当前所有进程中所需运行时间最短的进程。
时间片轮转算法:根据时间片的大小,切换进程,直到每个进程都运行完成。
计算出每个进程的开始时间,结束时间,周转时间T=开始时间-到达时间,带权周转时间W = T/运行时间,平均周转时间,平均带权周转时间。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct P
{
char name;//进程名字
int come;//进程到达时间
int need;//进程所需运行时间
int start;//进程开始运行时间
int finish;//进程运行结束时间
int flag;
struct P *next;
} P;
P p[5];
int n = 5;
char str[100] = {0};
//先来先服务
void FCFS()
{
int start[n];//开始时间
int success[n];//完成时间
int t[n];
float w[n];
float tsum =0,wsum = 0;
start[0] = p[0].come;
success[0]=p[0].need+p[0].come;
for(int i = 1; i<n; i++)
{
success[i] = success[i-1]+p[i].need;
start[i] = success[i-1];
}
printf("FCFS算法:\n");
for(int i=0; i<n; i++)
{
t[i] = success[i]-p[i].come;
tsum = t[i] + tsum;
w[i] = (float)t[i]/p[i].need;
wsum = wsum+w[i];
printf("%c开始时间:%d 周转时间T: %d 带权周转时间W: %.2lf\n",p[i].name,start[i],t[i],w[i]);
}
printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
void sort(int s,int k)//开始,结束
{
P temp;
for(int i = s; i<k-1; i++)
{
for(int j = i+1; j<k; j++)
{
if(p[i].need>p[j].need)
{
temp = p[i];
p[i]= p[j];
p[j] = temp;
}
}
}
}
//短作业优先
void SJF()
{
int start[n];//开始时间
int success[n];
int t[n];
float w[n];
int j;
float tsum = 0,wsum = 0;
/*
for(int i = 0;i<n;i++)//初始化未激活状态0
{
p[i].flag = 0;
}
*/
start[0] = p[0].come;
success[0]=p[0].need+p[0].come;
for(int i = 1; i<n; i++)
{
for(j = i; j<n; j++)
{
if(p[j].come>success[i-1])
{
j=j+1;
break;
}
}
sort(i,j);//到达时间早于当前进程结束时间的激活,进行排序,取运行时间最小的进程
success[i] = success[i-1]+p[i].need;
start[i] = success[i-1];
}
/*
for(j = 1;p[j].come<=success[0]&&j<n;j++)
{
}
sort(1,j);
success[1] = success[0]+p[1].need;
*/
/*
for(int i = 1;i<n;i++)
{
success[i] = success[i-1]+p[i].need;
start[i] = success[i-1];
}
*/
printf("SJF算法:\n");
for(int i=0; i<n; i++)
{
t[i] = success[i]-p[i].come;
tsum = t[i] + tsum;
w[i] = (float)t[i]/p[i].need;
wsum = wsum+w[i];
printf("%c 开始时间:%d 周转时间T: %d 带权周转时间W: %.2lf\n",p[i].name,start[i],t[i],w[i]);
}
printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
void TT()
{
int time = 0;
int count[n];
int q;
int a = 1;//循环标志
int c = 0;//记录数组长度
int sum = 0;//数组总长
int t[n];
float w[n];
float tsum = 0,wsum = 0;
printf("请输入时间片\n");
scanf(" %d",&q);
for(int i = 0; i<n; i++)
{
p[i].flag = 1;
count[i] = p[i].need;
sum = sum + p[i].need;
}
while(a)
{
for(int i = 0; i<n; i++)
{
if(p[i].flag==1)
{
if(count[i]-q>0)//未完成
{
for(int j = 0;j<q;j++)
{
//printf("%c ",p[i].name);
c++;
str[c] = p[i].name;
}
count[i] = count[i]-q;
}else if(count[i]-q == 0)//完成
{
for(int j = 0;j<q;j++)
{
//printf("%c ",p[i].name);
c++;
str[c] = p[i].name;
}
count[i] = count[i]-q;
p[i].flag = 0;
}else if(count[i]-q < 0)//完成
{
for(int j = 0;j<count[i];j++)
{
//printf("%c ",p[i].name);
c++;
str[c] = p[i].name;
}
count[i] = 0;
p[i].flag = 0;
}
}
}
if(c==sum)
a = 0;
}
for(int i = 1;i<=c;i++)
{
printf("%c ",str[i]);
}
for(int i = c ;i>=1;i--)//查找完成时间
{
if(str[i]=='a')
{
p[0].finish = i;
break;
}
}
for(int i = c ;i>=1;i--)//查找完成时间
{
if(str[i]=='b')
{
p[1].finish = i;
break;
}
}
for(int i = c ;i>=1;i--)//查找完成时间
{
if(str[i]=='c')
{
p[2].finish = i;
break;
}
}
for(int i = c ;i>=1;i--)//查找完成时间
{
if(str[i]=='d')
{
p[3].finish = i;
break;
}
}
for(int i = c ;i>=1;i--)//查找完成时间
{
if(str[i]=='e')
{
p[4].finish = i;
break;
}
}
printf("时间片轮转算法:\n");
//完成时间
printf("完成时间\n");
for(int i = 0;i<n;i++)
{
printf("%d ",p[i].finish);
}
printf("\n");
for(int i=0; i<n; i++)
{
t[i] = p[i].finish-p[i].come;
tsum = t[i] + tsum;
w[i] = (float)t[i]/p[i].need;
wsum = wsum+w[i];
printf("%c 周转时间T: %d 带权周转时间W: %.2lf\n",p[i].name,t[i],w[i]);
}
printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
void sortQuan(int *quan)//开始,结束
{
P temp;
for(int i = 1; i<n-1; i++)
{
for(int j = i+1; j<n; j++)
{
if(quan[j]>quan[i])
{
temp = p[i];
p[i]= p[j];
p[j] = temp;
}
}
}
}
void SN()
{
int success[n];
int t[n];
float w[n];
int j;
int quan[n];
float tsum = 0,wsum = 0;
success[0]=p[0].need+p[0].come;
printf("请输入各权值\n");
for(int i=0;i<n;i++)
{
scanf(" %d",&quan[i]);
}
sortQuan(quan);
for(int i = 1; i<n; i++)
{
success[i] = success[i-1]+p[i].need;
}
printf("静态非抢占算法:\n");
for(int i=0; i<n; i++)
{
t[i] = success[i]-p[i].come;
tsum = t[i] + tsum;
w[i] = (float)t[i]/p[i].need;
wsum = wsum+w[i];
printf("%c 周转时间T: %d 带权周转时间W: %.2lf\n",p[i].name,t[i],w[i]);
}
printf("\n平均周转时间:%.2lf\n",(float)tsum/n);
printf("\n平均带权周转时间:%.2lf\n",wsum/n);
}
int main()
{
int r,f = 1;
printf("请输入5个进程的名字、到达时间 和 服务时间\n");
for(int i = 0; i<n; i++)
{
scanf(" %c %d %d",&p[i].name,&p[i].come,&p[i].need);
}
printf("**************\n\n");
printf("1.FCFS\n");
printf("2.短作业优先SJF\n");
printf("3.时间片轮转\n");
printf("4.静态非抢占\n");
printf("5.退出\n");
printf("**************\n\n");
while(f)
{
scanf(" %d",&r);
switch(r)
{
case 1:
FCFS();
break;
case 2:
SJF();
break;
case 3:
TT();
break;
case 4:
SN();
break;
case 5:
f = 0;
}
}
return 0;
}
运行截图