多道作业调度(基于优先级).docx
- 文档编号:144399
- 上传时间:2022-10-04
- 格式:DOCX
- 页数:10
- 大小:14.95KB
多道作业调度(基于优先级).docx
《多道作业调度(基于优先级).docx》由会员分享,可在线阅读,更多相关《多道作业调度(基于优先级).docx(10页珍藏版)》请在冰豆网上搜索。
#include"stdafx.h"
#include
#include
B.h>
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
int j=0;
int n,i; //需要输入的作业数量
float T1=0,T2=0; //初始化周转时间带权周转时间
int times=0; //初始化开始运行时间
int freesa=100,disksa=5; //预定内存的大小为100k磁带数量为5个
struct jcb //作业控制块
{int priority; //
float super; //
char name[10]; //作业名
int reachtime; //作业到达时间
int starttime; // 已经运行了的时间
int runtime; // 作业需要运行的时间
int needtime; // 作业要占用的内存
int frees; // 作业所需磁带
int disks; //作业所需磁带
int finishtime; // 作业完成时间
float cycletime; // 作业周转时间
float cltime; // 作业带权周转时间
char state; // 作业状态
struct jcb *next; // 结构体指针
}*ready=NULL,*start=NULL,*p,*q,*r,*s,*t;
typedef struct jcb JCB;
sort()
{
JCB *first, *second;
int insert=0;
if((ready==NULL)||((p->priority)>(ready->priority)))
{
p->next=ready;
ready=p;
}
else
{
first=ready;
second=first->next;
while(second!
=NULL)
{
if((p->priority)>(second->priority))
{
p->next=second;
first->next=p;
second=NULL;
insert=1;
}
else
{
first=first->next;
second=second->next;
}
}
if(insert==0) first->next=p;
}
}
void inital()
{
int i;
printf("\n输入作业数:
");
scanf("%d",&n);
for(i=0;i
{
p=getpch(JCB);
printf("输入作业名:
");
scanf("%s",p->name);
p->reachtime=i;
printf("作业默认到达时间:
%d",i);
printf("\n输入作业要运行的时间:
");
scanf("%d",&p->needtime);
printf("输入作业运行要占用的内存:
");
scanf("%d",&p->frees);
printf("输入作业运行所需磁带:
");
scanf("%d",&p->disks);
printf("输入优先数:
");
scanf("%d",&p->priority);
printf("\n");
p->runtime=0;
p->state='W';
p->next=NULL;
/*if(ready==NULL) ready=q=p;
else{
q->next=p;
q=p;
}*/
sort();
}
}
int space() //计算内存中作业的个数
{
int l=0; JCB* pr=start;
while(pr!
=NULL)
{
l++;
pr=pr->next;
}
return(l);
}
void apply() //把符合条件的作业调用内存并给他们分配资源
{
int len;
p=ready;
while(p!
=NULL)
{
if(p->frees<=freesa&&p->disks<=disksa)
{
freesa-=p->frees;
disksa-=p->disks;
r=p;
p=p->next;
if(r==ready) //先将符合条件的作业从队列中分离出来
{
ready=r->next;
r->next=NULL;
}
else
{
q=ready;
while(q->next!
=r) q=q->next;
q->next=r->next;
}
if(start==NULL) start=s=r; //将其查到Start队列
else{
s->next=r;
s=r;
}
}
else
{
p=p->next;
}
}
len=space();
printf("\n\t此时有%d道作业在内存\n\n",len);
}
void disp(JCB * pr,int m) //建立作业显示函数
{
printf("作业名:
%s",pr->name);
printf(" 状态:
%c",pr->state);
printf(" 到达时间:
%d",pr->reachtime);
printf(" 需要时间:
%d",pr->needtime);
if(m==0){
printf("\t开始时间:
%d",pr->starttime);
printf(" 结束时间%d",pr->finishtime);
printf(" 周转时间:
%f",pr->cycletime);
printf(" 带权周转时间:
%f",pr->cltime);}
printf(" 需要内存:
%d",pr->frees);
printf(" 需要磁道数:
%d",pr->disks);
printf("\n");
}
void check() //显示作业状况
{
printf("\n作业%s于完成%d个作业后运行完毕,其完成后的情况:
\n",q->name,j);
j++;
disp(q,0);
s=start;
printf("\n\t\t*********当前进入内存的作业状态*********\n");
while(s!
=NULL)
{
disp(s,1);
s=s->next;
}
r=ready;
printf("\n\n\t\t*********当前后备作业表中作业的状态**********\n");
while(r!
=NULL)
{
disp(r,1);
r=r->next;
}
}
void running() //运行作业
{
for(t=start;t!
=NULL;)
{
start=t->next;
q=t;
q->next=NULL;
t=start;
q->starttime=times;
q->state='R';
q->finishtime=q->starttime+q->needtime;
q->cycletime=(float)(q->finishtime-q->reachtime);
q->cltime=(float)(q->cycletime/q->needtime);
T1+=q->cycletime;
T2+=q->cltime;
times+=q->needtime;
q->state='F';
freesa+=q->frees;
disksa+=q->disks;
check(); //调用check显示正在运行的就需的以及后备的作业
free(q); //释放作业
apply(); //分配作业
getch();
}
}
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;
getch();
printf("\n\n作业已经全部完成!
");
printf("\n%d个作业的平均周转时间是%f",n,t);
printf("\n%d个作业的平均带权周转时间是%f\n\n\n",n,s);
}
main() //初始化界面
{
int m;
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t多道作业调度(基于优先级)\n");
printf("\t\t*********************************************\t\t\n");
inital();
apply();
running();
final() ;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多道 作业 调度 基于 优先级