在网上找的代码都很复杂,所以我写了一个简单的程序,不涉及任何数据结构,纯算法实现
先科普一下四种算法的含义(个人理解):
FCFS:非剥夺式,意思很明显,先到达就先执行
RR_1:轮转调度算法,时间片为1,在当前时间点或之前到达的,按照顺序一个程序执行一次
SPN:最短进程优先,非剥夺式,当前到达的进程中服务时间最短的优先执行
SRT:剥夺式,最短剩余服务时间优先,当前时间点,选择最短剩余服务时间的进程执行
这里以5个进程为例:
(进程名:到达时间:服务时间:结束时间)
A:0:3:0
B:2:6:0
C:4:4:0
D:6:5:0
E:8:2:0
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define max 5
void menu();
void FCFS();
void RR_1();
void SPN();
void SRT();
struct pro
{
char process_name;
int arrived_time;
int service_time;
int end_time;
};
char f[20];//轨迹序列
int t;//时间
struct pro prodess[5]= {{'A',0,3,0},{'B',2,6,0},{'C',4,4,0},{'D',6,5,0},{'E',8,2,0}};
int main()
{
FCFS();RR_1();SPN();SRT();
return 0;
}
void FCFS()
{
int i,j,k,p;
t=0;
for(i=0; i<max; i++)
{
for(j=0; j<prodess[i].service_time; j++)
{
f[t]=prodess[i].process_name;
t++;
}
prodess[i].end_time=t;
}
printf("\n\nFCFS调度轨迹:");
for(k=0; k<t; k++)
{
printf("%c",f[k]);
}
printf("\n");
for(p=0; p<max; p++)
{
printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,prodess[p].end_time-prodess[p].arrived_time,1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
}
}
void RR_1()
{
int i,n,k,p,flag=0;
t=0;
int buff[max],servicetime[5];
for(i=0; i<5; i++)
{
servicetime[i]=prodess[i].service_time;
}
while(1)
{
for(n=0; n<max; n++)
{
if(prodess[n].arrived_time==t)
{
flag++;
buff[flag-1]=n;
break;
}
}
if(servicetime[buff[0]]==0)
{
prodess[buff[0]].end_time=t;
flag--;
if(flag==0) break;
for(i=0; i<flag; i++) buff[i]=buff[i+1];
}
else
{
buff[flag]=buff[0];
for(i=0; i<flag; i++)
{
buff[i]=buff[i+1];
}
}
f[t]=prodess[buff[0]].process_name;
servicetime[buff[0]]--;
t++;
}
printf("\n\nRR_1调度轨迹:");
for(k=0; k<t; k++)
{
printf("%c",f[k]);
}
printf("\n");
for(p=0; p<max; p++)
{
printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,prodess[p].end_time-prodess[p].arrived_time,1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
}
}
void SPN()
{
int i,n,m,p,k,flag;
int buff[max],servicetime[5];
t=0;
flag=0;
m=0;
for(i=0; i<5; i++)
{
servicetime[i]=prodess[i].service_time;
}
while(1)
{
for(n=0; n<max; n++)
{
if(prodess[n].arrived_time==t)
{
buff[flag++]=n;
// printf("n=%d,t=%d,flag=%d,buff[%d]=%d\n",n,t,flag,flag-1,n);
break;
}
}
if(servicetime[buff[m]]==0)
{
prodess[buff[m]].end_time=t;
flag--;
if(flag==0)break;
for(n=m; n<flag; n++)buff[n]=buff[n+1];m=0;
//printf("buff[n]=%d\n",buff[n]);
for(n=0; n<flag; n++)if(servicetime[buff[n]]<servicetime[buff[m]])m=n;
}
f[t]=prodess[buff[m]].process_name;
servicetime[buff[m]]--;
// printf("%d:%c:%d\n",t,f[t],prodess[buff[m]].service_time);
t++;
}
printf("\n\nSPN调度轨迹:");
for(k=0; k<t; k++)
{
printf("%c",f[k]);
}
printf("\n");
for(p=0; p<max; p++)
{
printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,
prodess[p].end_time-prodess[p].arrived_time,
1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
}
}
void SRT()
{
int i,n,m,p,k,flag;
int buff[max],servicetime[5];
t=0;
flag=0;
m=0;
for(i=0; i<5; i++)
{
servicetime[i]=prodess[i].service_time;
}
while(1)
{
for(n=0; n<max; n++)
{
if(prodess[n].arrived_time==t)
{
buff[flag++]=n;
break;
}
}
if(servicetime[buff[m]]==0)
{
prodess[buff[m]].end_time=t;
flag--;
if(flag==0)break;
for(n=m; n<flag; n++)buff[n]=buff[n+1];
}
m=0;
for(n=0; n<flag; n++)if(servicetime[buff[n]]<servicetime[buff[m]])m=n;
f[t]=prodess[buff[m]].process_name;
servicetime[buff[m]]--;
t++;
}
printf("\n\nSRT调度轨迹:");
for(k=0; k<t; k++)
{
printf("%c",f[k]);
}
printf("\n");
for(p=0; p<max; p++)
{
printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,
prodess[p].end_time-prodess[p].arrived_time,
1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
}
}