操作系统单道批处理系统
FCFS作业调度算法
#include<stdio.h>
#include<stdlib.h>
#define getjcb(type) (type*)malloc(sizeof(type))
int counter=0;
typedef struct node
{
char name[20];
int InTime;
int StartTime;
int EndTime;
int NeedTime;
int RunTime;
float X;
char state;
struct node *link;
}JCB;
JCB *line = NULL, *run = NULL, *finish, *p ;
void Sort(JCB *q)
{
JCB *fst, *sed;
fst = sed = line;
int flag = 0;
if (line == NULL)
{
q->link = line;
line = q;
}
else
{
if (q->InTime < fst->InTime)
{
// printf("1");
q->link = fst;
fst = q;
line = q;
flag = 1;
}
else
while (fst->link != NULL)
{
fst = fst->link;
if (q->InTime < fst->InTime)
{
q->link = fst;
sed->link = q;
flag = 1;
}
else
sed = sed->link;
}
if ((fst->link == NULL) && (flag == 0))
{
q->link = fst->link;
fst->link = q;
flag = 1;
}
}
}
void OutPut()
{
run->X = (run->StartTime - run->InTime + run->RunTime)*1.0 / (run->NeedTime);
printf("作业名\t进入时间\t开始时间\t完成时间\t周转时间\t带权周转时间\n");
printf("%s \t %d \t %d \t %d \t %d \t %f \t \n",run->name,run->InTime,run->StartTime,run->StartTime+run->RunTime,run->RunTime,run->X);
//run = NULL;
//if (finish == NULL)
//{
run->link = finish;
finish = run;
//}
//else
//{
// run->link = finish->link;
// finish->link = run;
//}
if (line == NULL)
{
float ARound = 0, AwRound = 0, count = 0;
while (finish != NULL)
{
ARound += finish->RunTime;
AwRound += finish->X;
count++;
finish = finish->link;
}
ARound /= count;
AwRound /= count;
printf("平均周转时间\t平均带权周转时间\n");
printf("%f \t %f \t \n", ARound,AwRound);
}
}
void InPut()
{
int num;
JCB *tmp;
printf("请输入作业个数:");
scanf_s("%d", &num);
for (int i = 1; i <= num; i++)
{
if ((tmp = (JCB *)malloc(sizeof(JCB))) == NULL)
{
perror("malloc");
exit(1);
}
printf("作业 %d\n", i);
printf("请输入作业名称:");
scanf_s("%s", tmp->name, 20);
printf("请输入作业到达时间:");
scanf_s("%d", &(tmp->InTime));
printf("请输入作业所需运行时间:");
scanf_s("%d", &(tmp->NeedTime));
// printf("1.1");
tmp->state = 'W';
// printf("1.2");
tmp->X = 0;
// printf("1.3");
tmp->RunTime = 0;
// printf("1");
Sort(tmp);
}
/*
JCB *x;
x = line;
for (int j = 1; j <= num; j++)
{
printf("%s \t",x->name);
x = x->link;
}
printf("\n");
*/
}
void GetFirst()
{
run = line;
if (line != NULL)
{
run->state = 'R';
line = line->link;
run->link = NULL;
}
//printf("%s \n", run->name);
}
void Insert(JCB *in)
{
JCB *q;
q = line;
while (q->link != NULL)
{
q = q->link;
}
in->link = q->link;
q->link = in;
}
void Run(int T)
{
//GetFirst();
//run->state = 'R';
if (T > run->InTime)run->StartTime = T;
else run->StartTime=run->InTime;
run->RunTime = run->NeedTime;
OutPut();
//else Insert(run);
}
int main()
{
InPut();
int T=0;
while (line != NULL)
{
//printf("XXX\n");
GetFirst();
Run(T);
T += run->NeedTime;
run == NULL;
//printf("YYY\n");
}
//getchar();
system("pause");
return 0;
}