c語言實現fcfs,rr_1,spn,srt4種排程演算法(無資料結構)
阿新 • • 發佈:2018-12-26
在網上找的程式碼都很複雜,所以我寫了一個簡單的程式,不涉及任何資料結構,純演算法實現
先科普一下四種演算法的含義(個人理解):
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); } }