在网上找的代码都很复杂,所以我写了一个简单的程序,不涉及任何数据结构,纯算法实现
先科普一下四种算法的含义(个人理解):
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); } }