1. 程式人生 > >先來先服務演算法實現

先來先服務演算法實現

實現程式碼:

#include<stdio.h>

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() /*定義 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() /*定義 FCFS 中尋找未執行的程序的最先到達時間*/

{

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) /*第一個執行的程序按 FCFS*/

{

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) /*有程序到達則按 SJF*/

{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{ /*否則按 FCFS*/

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;}

}

}

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;

}

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);

}

main()

{ int i,b,k,a,c=0;

int d[4];

system("clear");

printf("\t 1. EXIT \n");

printf("\t 2. FCFS \n");

printf("\t 3. SFJ \n");

for(i=0;;i++)

{if(c)

break;

printf("please input the number a:\n");

scanf("%d",&a);

switch(a)

{

case 1: c=1;

break;

case 2:printf("please input the different-ArriveTime of arrayTasks\n");

GetTask();

printf("*****************************the result of fcfs\n");

printf("Number\tArrive\tServer\tStart\tFinish\tTurnover\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 3: 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演算法時,每次排程是從就緒的程序佇列中選擇一個`最先進入該佇列的程序,為之分配處理機,使之投入執行。該程序一直執行到完成或發某事件而阻塞後,程序排程程式才將處理機分配給其它程式。