先来先服务算法实现

实现代码:

#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算法时,每次调度是从就绪的进程队列中选择一个`最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发某事件而阻塞后,进程调度程序才将处理机分配给其它程序。

先来先服务算法 #include "stdio.h" #include #define max 100 #define pfree 0 /*process end*/ #define running 1 /*process running status*/ #define aready 2 /*process aready status */ #define blocking 3 /*process aready blocking status*/ typedef struct node { char name; int status; int ax,bx,cx,dx; int pc; int psw; struct node *next; /*pcb define*/ }pcb; pcb *createprocess(pcb *head) { pcb *p,*q; int a,b,c,d,m,n; char ID; q=NULL; printf("input the first seven status pcb:"); scanf("\n%c%d%d%d%d%d%d",&ID,&a,&b,&c,&d,&m,&n); while(1) { p=(pcb*)malloc(sizeof(pcb)); p->name=ID; p->ax=a; p->bx=b; p->cx=c; p->dx=d; p->pc=m; p->psw=n; p->status=aready; if(head==NULL) head=p; else q->next=p; q=p; printf("input the next seven status pcb: "); scanf("\n%c",&ID); if (ID == '*') break; scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&m,&n); } if(q!=NULL) q->next=NULL; q=head; while(q) { printf("\n process name. status.ax. bx. cx. dx. pc. psw.\n "); printf("%10c%5d%5d%5d%5d%5d%5d%5d",q->name,q->status,q->ax,q->bx,q->cx,q->dx,q->pc,q->psw); q=q->next; } return head;/*createprocess end*/ } void processfcfs(pcb *head) /*use fifo */ { pcb *p; p=head; printf("\n the process use fcfs method.\n"); printf("running the frist process:\n"); while(p!=NULL) { p->status=running; printf("\nprocess name status. ax. bx. cx. dx. pc. psw."); printf("\n%10c%5d%8d%5d%5d%5d%5d%5d",p->name,p->status,p->ax,p->bx,p->cx,p->dx,p->pc,p->psw); /*check process running status */ p->status=0; p=p->next; } printf("\n检查进程是否结束:"); p=head; while(p) { printf("\n%3c%3d",p->name,p->status); p=p->next; } printf("\ngame is over!\n"); } main() { pcb *head; head=NULL; head=createprocess(head); processfcfs(head); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值