进程调度算法——FCFS
算法流程
实现代码
#include<stdlib.h> #include<stdio.h> struct PCB { int pid;//进程标识符 float arrive_time;//进入时间 float request_time;//服务时间 float start_time;//开始时间 float end_time;//结束时间 float turnaround_time;//周转时间 float dqturnaround_time;//带权周转时间 int status; }proc[4]; void printresult(int i); void init() { int i; float x; for(i=0;i<4;i++) { proc[i].pid=i+1; printf("请输入进程%d的进入时间:",proc[i].pid); scanf("%f",&x); while(x<=0) { printf("请输入大于0的数:"); scanf("%f",&x); } proc[i].arrive_time=x; printf("请输入进程%d的服务时间:",proc[i].pid); scanf("%f",&x); while(x<=0) { printf("请输入大于0的数:"); scanf("%f",&x); } proc[i].request_time=x; proc[i].start_time=0; proc[i].end_time=0; proc[i].turnaround_time=0; proc[i].dqturnaround_time=0; proc[i].status=0; } } int fcfs()//寻找未执行的进程中进入时间最短的进程 { int i,t,w=0; for(i=0;i<4;i++) { if(proc[i].status==0) { t=proc[i].arrive_time; w=1; } if(w==1) { break; } } for(i=0;i<4;i++) { if(proc[i].arrive_time<t && proc[i].status==0) t=proc[i].arrive_time; } for(i=0;i<4;i++) if(proc[i].arrive_time==t) return i; } void update(int s) { int i,g=0,d; for(i=0;i<4;i++) { if(proc[i].status==0) continue; else { g=1; break; } } if(g==0)//第一个执行的进程 { proc[s].start_time=proc[s].arrive_time; proc[s].end_time=proc[s].arrive_time+proc[s].request_time; proc[s].turnaround_time=proc[s].request_time; proc[s].status=1; g=2; } if(g==1)//不是第一个执行的进程 { proc[s].status=1; for(i=0;i<4;i++) { if(proc[i].status==1) d=proc[i].end_time; } for(i=0;i<4;i++) { if(proc[i].end_time>d && proc[i].status==1)//找出所有进程的最晚结束时间 d=proc[i].end_time; } if(proc[s].arrive_time<d) proc[s].start_time=d; else proc[s].start_time=proc[s].arrive_time; proc[s].end_time=proc[s].start_time+proc[s].request_time; proc[s].turnaround_time=proc[s].end_time-proc[s].arrive_time;//周转时间等于结束时间减去进入时间 } proc[s].dqturnaround_time=proc[s].turnaround_time/proc[s].request_time;//带权周转时间等于周转时间除以服务时间 } void printresult(int i) { printf("%d\t",proc[i].pid); printf("%f\t",proc[i].arrive_time); printf("%f\t",proc[i].request_time); printf("%f\t",proc[i].start_time); printf("%f\t",proc[i].end_time); printf("%f\t",proc[i].turnaround_time); printf("%f\n",proc[i].dqturnaround_time); } int main() { int i,k; int d[4]; system("clear"); init(); printf("进程标识符 进入时间 服务时间 开始时间 结束时间 周转时间 带权周转时间\n"); for(i=0;i<4;i++) { k=fcfs(); update(k); d[i]=k; } for(i=0;i<4;i++) { printresult(d[i]); } return 0; }
效果
版权声明:本文为qrxqrx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。