/* data[n].arriveTime=0;data[n++].serveTime=4;
data[n].arriveTime=1;data[n++].serveTime=3;
data[n].arriveTime=2;data[n++].serveTime=5;
data[n].arriveTime=3;data[n++].serveTime=2;
data[n].arriveTime=4;data[n++].serveTime=4;
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
#define N 5
float T1=0,T2=0;
int times=0;
struct jcb //作业控制块
{
int name; //作业名
int reachtime; //作业到达时间
int starttime; //作业开始时间
int needtime; //作业的服务时间
float super; //作业的响应比
int finishtime; //作业完成时间
float cycletime; //作业周转时间
float cltime; //作业带权周转时间
char state; //作业状态
struct jcb *next; //结构体指针
}*ready=NULL,*p,*q;
typedef struct jcb JCB;
void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列
{
int i;
for(i=0;i<N;i++)
{
p=getpch(JCB);
p->name = i;
p->reachtime=i;
switch(i)
{
case 0:p->needtime = 4;break;
case 1:p->needtime = 3;break;
case 2:p->needtime = 5;break;
case 3:p->needtime = 2;break;
case 4:p->needtime = 4;break;
}
p->state='W';
p->next=NULL;
if(ready==NULL) ready=q=p;
else
{
q->next=p;
q=p;
}
}
}
void titledisp(int m)
{
switch(m)
{
case 1:
printf("FCFS:\n进程名 到达时间 服务时间 执行时间 完成时间 周转时间 带权周转\n");
break;
case 2:
printf("SJF:\n进程名 到达时间 服务时间 执行时间 完成时间 周转时间 带权周转\n");
break;
case 3:
printf("HRN:\n进程名 到达时间 服务时间 执行时间 完成时间 周转时间 带权周转\n");
break;
}
}
void disp(JCB* q) //显示作业运行后的周转时间及带权周转时间等
{
printf("%-9d%-11d%-11d%-11d%-11d%-11f%-11f\n",q->name , q->reachtime , q->needtime ,q->starttime , q->finishtime ,q->cycletime , q->cltime);
// getch();
}
void running(JCB *p,int m) //运行作业
{
if(p==ready) //先将要运行的作业从队列中分离出来
{
ready=p->next;
p->next=NULL;
}
else
{
q=ready;
while(q->next!=p) q=q->next;
q->next=p->next;
}
p->starttime=times; //计算作业运行后的完成时间,周转时间等等
p->state='R';
p->finishtime=p->starttime+p->needtime;
p->cycletime=(float)(p->finishtime-p->reachtime);
p->cltime=(float)(p->cycletime/p->needtime);
T1+=p->cycletime;
T2+=p->cltime;
disp(p); //调用disp()函数,显示作业运行情况
times+=p->needtime;
p->state='F';
free(p); //释放运行后的作业
}
void super() //计算队列中作业的高响应比
{
JCB *padv;
padv=ready;
do{
if(padv->state=='W'&&padv->reachtime<=times)
padv->super=(float)((times-padv->reachtime+padv->needtime)/padv->needtime);
padv=padv->next;
}while(padv!=NULL);
}
void final() //最后打印作业的平均周转时间,平均带权周转时间
{
float s,t;
t=T1/N;
s=T2/N;
printf("平均周转时间是:%f",t);
printf("\n平均带权周转时间是%f:\n\n",s);
}
void hrn(int m) //高响应比算法
{
JCB *min;
int i,iden;
times=0;
//system("cls");
inital();
titledisp(m);
for(i=0;i<N;i++)
{
p=min=ready;iden=1;
super();
do{
if(p->state=='W'&&p->reachtime<=times)
if(iden)
{
min=p;iden=0;
}
else if(p->super>min->super) min=p;
p=p->next;
}while(p!=NULL);
if(iden)
{
i--;times++;
//printf("\ntime=%d:\tno JCB submib...wait...",time);
if(times>1000)
{printf("\nruntime is too long...error...");getch();}
}
else
{
running(min,m); //调用running()函数
}
} //for
final(); //调用final()函数
}
void sjf(int m) // 最短作业优先算法
{
JCB *min;
int i,iden;
times=0;
//system("cls");
inital();
titledisp(m);
for(i=0;i<N;i++)
{
p=min=ready;iden=1;
do{
if(p->state=='W'&&p->reachtime<=times)
if(iden){
min=p;iden=0;
}
else if(p->needtime<min->needtime) min=p;
p=p->next;
}while(p!=NULL) ;
if(iden) {
i--; //printf("\ntime=%d:\tno JCB submib...wait...",time);
times++;
if(times>100){printf("\nruntime is too long...error");getch();}
}
else{
running(min,m); //调用running()函数
}
} //for
final(); //调用final()函数
}
void fcfs(int m) //先来先服务算法
{
int i,iden;
system("cls");
inital();
titledisp(m);
for(i=0;i<N;i++)
{
p=ready;iden=1;
do{
if(p->state=='W'&&p->reachtime<=times) iden=0;
if(iden)p=p->next;
}while(p!=NULL&&iden) ;
if(iden)
{
i--;
printf("\n没有满足要求的进程,需等待");
times++;
if(times>100){printf("\n时间过长");getch();}
}
else{
running(p,m); //调用running()函数
}
}
final(); //调用final()函数
}
void mune()
{
fcfs(1);
sjf(2);
hrn(3);
}
void main() //主函数
{
mune();
}