当前位置:文档之家› 操作系统课设 两道批处理 二级调度

操作系统课设 两道批处理 二级调度

#include "stdio.h"
#include
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0

struct time //定义时间结构体
{
int shi; //时
int fen; //分
};

struct time xttime; //系统时间
int flag=0; //记录内存作业数
struct pcb /* 定义进程控制块PCB */
{
char name[10]; //进程名
char state; //标志作业所处状态:值为"N"代表处于内存中,为“W”表示在就绪队列,为"S"表示处于输入井状态,为"F"表示已完成
int pri; //作业的优先数
int xytime; //需要运行时间
struct time tjtime; //提交时间
struct time kstime; //开始时间
int yxtime; //运行时间
struct time wctime; //完成时间
int zztime; //周转时间
float dqzztime; //带权周转时间
struct pcb* link;
}*ready=NULL,*one=NULL,*p,*q=NULL;
typedef struct pcb PCB;

int num,num2;

int time_cmp(struct time a,struct time b) //时间比较函数 ab返回1;
{
if(a.shielse if(a.shi==b.shi&&a.fenelse if(a.shi==b.shi&&a.fen==b.fen) return 0;
return 1;
}


int time_j(struct time c,struct time d)
{ int s;
s=c.shi*60+c.fen-d.shi*60-d.fen;
return s;
}

void fcfs() /* 先来先服务调度函数*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||time_cmp(p->tjtime,ready->tjtime)==-1) //提交时间最短的插到队首
{
p->link=ready;
ready=p;
}
else
{
first=ready;
second=first->link;
while(second!=NULL)
{
if(time_cmp(p->tjtime,second->tjtime)==-1) /*若插入进程比当前进程提交时间小,*/
{ /*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else
{
first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}



void shuru() //进程信息输入
{
int i;
printf("\n 请输入进程数:");
scanf("%d",&num);
num2=num;
if(num>0)
for(i=1;i<=num;i++)
{
printf("\n 进程No.%d:\n",i);
p=getpch(PCB);
printf("\n 请输入进程名:");
scanf("%s",p->name);
p->tjtime.shi=0,p->tjtime.fen=0;
printf("\n 输入提交时间:");
scanf("%d:%d",&p->tjtime.shi,&p->tjtime.fen);
printf("\n 输入进程需要运行时间:");
scanf("%d",&p->xytime);
printf("\n 输入进程优先数:");
scanf("%d",&p->pri);
printf("\n");
p->state='S';
p->yxtime=0;
p->kstime.shi=0,p->kstime.fen=0;
p->link=0;
fcfs();
}
else
{ printf("\n 您的输入有误!!请重新输入\n");
shuru();
}
}

void shunxu1()
{ if(one==NULL) {one=p;q=one;}
else
{ q->link=p;
q=p;
}
p=q->link;
q->link=NULL;
q->wctime.shi=xttime.shi;//记录作业完成时间
q->wctime.fen=xttime.fen;
f

lag--;
num2--;
q->state='F';//把作业状态置为已完成
}

void shunxu2()
{ if(one==NULL) {one=p->link;q=one;}
else
{ q->link=p->link;
q=p->link;
}
p->link=q->link;
q->link=NULL;
q->wctime.shi=xttime.shi;
q->wctime.fen=xttime.fen;
flag--;
num2--;
q->state='F';
}

void yunxing()
{
printf("被选中的作业为:");
if(p->link!=NULL)
if (p->link->pri<=p->pri&&p->link->state=='N')
{ printf("%s\n",p->link->name);
if(p->link->kstime.shi==0&&p->link->kstime.fen==0)
{ p->link->kstime.shi=xttime.shi;
p->link->kstime.fen=xttime.fen;
}
p->link->yxtime=p->link->yxtime+10;
if(p->link->yxtime==p->link->xytime)
shunxu2();
}

else
{ printf("%s\n",p->name);
if(p->kstime.shi==0&&p->kstime.fen==0)
{ p->kstime.shi=xttime.shi;
p->kstime.fen=xttime.fen;
}
p->yxtime=p->yxtime+10;
if(p->yxtime==p->xytime)
shunxu1();
}
else
{ printf("%s\n",p->name);
if(p->kstime.shi==0&&p->kstime.fen==0)
{ p->kstime.shi=xttime.shi;
p->kstime.fen=xttime.fen;
}
p->yxtime=p->yxtime+10;
if(p->yxtime==p->xytime)
shunxu1();

}
}
void neicunzy()
{ int i;
pcb *d;
d=p;
printf("**内存中的作业\n");
printf("进程名\t 提交时间 需要运行时间 已运行时间 优先数 \n");
for(i=1;i<=num2;i++)
{
if(d->state=='N')
printf(" %s \t %d:%d \t %d %d %d \n",d->name,d->tjtime.shi,d->tjtime.fen,d->xytime,d->yxtime,d->pri);
if(d->link==NULL)break;
d=d->link;


}
if(flag==0)printf("内存内作业为空");
else yunxing();

}


void jiuxuzy()
{ int i;
PCB *b;
b=p;
printf("**就绪的作业\n");
printf("进程名\t 提交时间 需要运行时间 优先数\n");
for(i=1;i<=num2;i++)
{
if(b->state=='W')
printf("%s\t %d:%d\t %d %d \n",b->name,b->tjtime,b->xytime,b->pri,b->state);
if(b->link==NULL)break;
b=b->link;
}
getchar();
}


void main() /*主函数*/
{
xttime.shi=10;
xttime.fen=00;
PCB *second,*c;
int i,x,y;
float s1=0,s2=0;
printf("\t\t********************************************\n");
printf("\t\t** 题目:两道道批处理系统的两级调度-2 **\n");
printf("\t\t** 计算机学院 级计算机科学与技术班 **\n");
printf("\t\t** **\n");
printf("\t\t** 作业调度采用先来先服务算法 **\n");
printf("\t\t** 进程调度采用可抢占的优先级调度算法 **\n");
printf("\t\t********************************************\n");
shuru();
getchar();
p=ready;
while(1)
{ c=p;
for(i=1;i<=num2;i++)
{ if(time_cmp(c->tjtime,xttime)==0||time_cmp(c->tjtime,xttime)==-1)
{ if(c->state=='S'||c->s

tate=='W')
if(flag<2)
{ c->state='N';
flag++;
}
else c->state='W';
}
if(c->link==NULL)break;
c=c->link;
}
printf("\n系统时间%d:%d\n",xttime.shi,xttime.fen);
xttime.fen=xttime.fen+10;
if(xttime.fen>=60)
{
xttime.fen=xttime.fen-60;
xttime.shi++;
}
neicunzy();
jiuxuzy();


if(flag==0)break;

}


printf("\n作业完成情况\n");
printf("进程名\t 提交时间 开始运行时间 完成时间 周转时间 带权周转时间\n");
second=one;
for(i=1;i<=num;i++) /*计算输出作业完成时间,周转时间等信息*/
{
second->zztime=time_j(second->wctime,second->tjtime);
x=second->zztime;
y=second->xytime;
second->dqzztime=(float)x/(float)y;
printf(" %s \t %d:%d %d:%d %d:%d %d %f \n",second->name,second->tjtime.shi,second->tjtime.fen,second->kstime.shi,second->kstime.fen,second->wctime.shi,second->wctime.fen,second->zztime,second->dqzztime);
s1=s1+second->zztime;
s2=s2+second->dqzztime;
second=second->link;

}
s1=s1/num;
s2=s2/num;
printf("\n平均周转时间=%f\n",s1);
printf("带权平均周转时间=%f\n\n",s2);
printf("***按任意键结束***");
getchar();
}

相关主题
文本预览
相关文档 最新文档