先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
int fcfs()
{
int i,j,w=0;
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==0)
{
t=arrayTask[i].ArriveTime;
w=1;
}
if(w==1)
break;
}
for(i=0;i<4;i++)
{
if(arrayTask[i].ArriveTime<t&&arrayTask[i].Status==0)
t=arrayTask[i].ArriveTime;
}
for(i=0;i<4;i++)
{
if (arrayTask[i].ArriveTime==t)
return i;
}
}
int sjf()
{
int i,x=0,a=0,b=0;
float g;
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==1)
{
g=arrayTask[i].EndTime;
x=1;
}
}
if(x==0)
{
t=arrayTask[0].ArriveTime;
for(i=0;i<4;i++)
{
if(arrayTask[i].ArriveTime<t)
{
t=arrayTask[i].ArriveTime;
a=i;
}
}
return a;
}
else
{
for(i=0;i<4;i++)
{
if(arrayTask[i].EndTime>g) g=arrayTask[i].EndTime;
}
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g)
{
t=arrayTask[i].RequestTime;
a=i;
b=1;
}
}
if(b!=0)
{
for (i=0; i <4; i ++)
{
if (arrayTask [i]. Status==0&&arrayTask[i]. ArriveTime<=g&&arrayTask[i]. RequestTime<t)
{
t=arrayTask[i]. RequestTime;
a=i;
}
}
return a;
}
else
{
for (i=0; i <4; i ++)
{
if (arrayTask [i]. Status==0) t=arrayTask[i]. ArriveTime;
}
for(i=0;i<4;i++)
{
if(arrayTask[i]. Status==0&&arrayTask[i]. ArriveTime<t)
{
t=arrayTask[i]. ArriveTime;
a=i;
}
}
return a;
}
}
}
总的代码实现
# include
float t, d;
struct
{
int id;
float ArriveTime;
float RequestTime;
float StartTime;
float EndTime;
float RunTime;
float DQRunTime;
int Status;
}arrayTask[4];
GetTask()
{
int i;
float a;
for(i=0;i<4;i++)
{
arrayTask[i].id=i+1;
printf("input the number");
printf("input the the ArriveTime of arrayTask[%d]:",i);
scanf("%f",&a); arrayTask[i].ArriveTime=a;
printf("input the RequestTime of arrayTask[%d]:",i);
scanf("%f",&a); arrayTask[i].RequestTime=a; arrayTask[i].StartTime=0;
arrayTask[i].EndTime=0; arrayTask [i].RunTime=0;
arrayTask[i].Status=0;
}
}
int fcfs()
{
int i,j,w=0;
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==0)
{
t=arrayTask[i].ArriveTime;
w=1;
}
if(w==1)
break;
}
for(i=0;i<4;i++)
{
if(arrayTask[i].ArriveTime<t&&arrayTask[i].Status==0)
t=arrayTask[i].ArriveTime;
}
for(i=0;i<4;i++)
{
if (arrayTask[i].ArriveTime==t)
return i;
}
}
int sjf()
{
int i,x=0,a=0,b=0;
float g;
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==1)
{
g=arrayTask[i].EndTime;
x=1;
}
}
if(x==0)
{
t=arrayTask[0].ArriveTime;
for(i=0;i<4;i++)
{
if(arrayTask[i].ArriveTime<t)
{
t=arrayTask[i].ArriveTime;
a=i;
}
}
return a;
}
else
{
for(i=0;i<4;i++)
{
if(arrayTask[i].EndTime>g) g=arrayTask[i].EndTime;
}
for(i=0;i<4;i++)
{
if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g)
{
t=arrayTask[i].RequestTime;
a=i;
b=1;
}
}
if(b!=0)
{
for (i=0; i <4; i ++)
{
if (arrayTask [i]. Status==0&&arrayTask[i]. ArriveTime<=g&&arrayTask[i]. RequestTime<t)
{
t=arrayTask[i]. RequestTime;
a=i;
}
}
return a;
}
else
{
for (i=0; i <4; i ++)
{
if (arrayTask [i]. Status==0) t=arrayTask[i]. ArriveTime;
}
for(i=0;i<4;i++)
{
if(arrayTask[i]. Status==0&&arrayTask[i]. ArriveTime<t)
{
t=arrayTask[i]. ArriveTime;
a=i;
}
}
return a;
}
}
}
void new (int s)
{
int i, g=0;
for (i=0; i <4; i ++)
{
if (arrayTask [i]. Status==0) continue;
else
{
g=1;
break;
}
}
if (g==0)
{
arrayTask[s].StartTime=arrayTask[s]. ArriveTime;
arrayTask[s]. EndTime=arrayTask[s]. RequestTime+arrayTask[s]. ArriveTime;
arrayTask[s]. RunTime=arrayTask[s]. RequestTime;
arrayTask[s]. Status=1; g=2;
}
if (g==1)
{
arrayTask[s]. Status=1;
for(i=0;i<4;i++)
{
if(arrayTask[i]. Status==1) d=arrayTask[i]. EndTime;
}
for (i=0; i <4; i ++)
{
if (arrayTask [i]. EndTime>d&&arrayTask[i]. Status==1)
d=arrayTask[i]. EndTime;
}
if(arrayTask[s]. ArriveTime <d)
arrayTask [s]. StartTime=d;
else
arrayTask[s]. StartTime=arrayTask[s].ArriveTime;
arrayTask[s]. EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;
arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;
}
arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;
}
/* output */
void Printresult(int j )
{
printf ("%d \t", arrayTask [j]. id);
printf("%5.2f\t",arrayTask[j]. ArriveTime);
printf("%5.2f\t",arrayTask[j]. RequestTime);
printf("%5.2f\t",arrayTask[j]. StartTime);
printf("%5.2f\t",arrayTask[j].EndTime);
printf("%5.2f\t",arrayTask[j].RunTime);
printf("%5.2f\n",arrayTask[j].DQRunTime);
}
void main()
{
int i,b,k,a,c=0;
int d[4];
printf("\t F. FCFS \n");
printf("\t S. SJF \n"); // short job first
printf("\t Q. EXIT \n");
for(i=0;;i++)
{
if(c)
break;
printf("please input the number a:\n");
scanf("%S",&a);
switch(a)
{
case 'Q': c=1; break;
case 'F': printf("please input the different-ArriveTime of arrayTasks\n");
GetTask();
printf("*****************************the result of fcfs\n");
printf("Number\tArrive\tServer\tStart \ tFinish \ tTurnove \ tTake power turnover time \n ");
for (b=0; b <4; b ++)
{
k = fcfs();
d[b] = k;
new(k);
}
for (b=0; b <4; b ++)
Printresult(d[b]);
continue;
case 'S': printf (" please input the different-RequestTime of arrayTasks\n");
GetTask();
printf("******************************the result of sjf\n");
printf("Number\tArrive\tRequest\tStart\tEnd\tRun\tDQRun time\n");
for(b=0;b < 4 ;b++)
{
k = sjf();
d[b] = k;
new(k);
}
for(b=0;b < 4;b++)
Printresult(d[b]);
continue;
default:printf("the number Error.please input another number!\n");
}
}
}
执行结果如下:
先选择FCFS,再选择SFJ部分,设置四个进程:到达时间为分别为10、15、30、50,运行时间分别为100、5、30、10。可得到如下结果: