作业调度设计报告多道.docx
- 文档编号:27264333
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:26
- 大小:68.93KB
作业调度设计报告多道.docx
《作业调度设计报告多道.docx》由会员分享,可在线阅读,更多相关《作业调度设计报告多道.docx(26页珍藏版)》请在冰豆网上搜索。
作业调度设计报告多道
作业调度(多通道)课程设计报告
一、目的要求:
用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
二、详细设计:
在多通道批处理系统中,作业的运行除了考虑作业之间的优先关系之外,还必须考虑系统能否为其所需的资源分配资源。
因为在多通道批处理系统中同时有不只一道作业在CPU中运行,这样就会导致某个作业需要的资源正在被另一个作业占用,这样就会导致无法分配资源的作业进入等待状态,直到该资源被其它作业释放后才能重新激活。
1、作业调度算法
该作业调度系统的调度算法是基于优先级的调度算法。
在作业提交后按预先设定的优先级的高低依次插入到就绪队列(ready),但在系统运行过程中,除了考虑优先级外(即优先级高只是表明该作业能较先运行),同时还应该考虑该作业所需的资源是否能够被分配到。
2、为作业分配资源
在这里采用这样的方法判断资源能否分配:
查看该作业运行所需的第一个资源,然后在系统资源中查看该资源是否还有空闲的,有则表示该资源可以插入到运行队列(run)中,准备在下一个时间片中运行。
3、设置同时运行的最大并行度
这里设置一个量maxrun,这个量是系统允许同时并行运行的作业数量,当运行队列中的作业数目达到最大值maxrun后,即使某作业所需的资源系统还有空闲的,也不再允许继续分配。
4、作业模块
每个作业由一个作业控制块JCB控制,相关信息将在代码中将详细给出。
5、所需资源模块
每个作业的JCB模块中有个所需资源的链,其结构用needsource表示,相关信息将在代码中将详细给出。
6、系统资源模块(systemsource)
将系统拥有的各个资源及其的数目链成链,在系统运行过程过这个链就可以查询某作业需要的资源系统是否可以分配。
每当为某作业分配了某个资源后,该资源的数目减1,而当某作业释放了某个资源后,该资源的数目又将加1。
相关信息将在代码中将详细给出。
三、调度算法流程图如下:
结束
开始
初始化系统资源(将系统资源及数目链成链,以便查询)
初始化所有JCB,使JCB按预定的优先级排成队列(systemtime=0)
作业调度(函数为:
attemper())
查看调度情况(函数为:
check();打印就绪队列,运行队列,等待队列中各个作业的信息)
作业运行,将运行队列中的各个作业的所需的第一个资源撤消,查看等待队列,看是否有作业需要该资源,有则激活该作业,同时所需资源链needsource*source指针指向下一个资源。
Systemtime加1
运行队列中有作业的资源链*source为空?
资源链为空,该作业已经运行完毕,打印所有完成的作业信息,并从run队列中撤消
Ready=NULL?
Run=NULL?
计算并打印该组作业的平均周转时间和平均带权周转时间
是
是
是
否
否
否
详细过程见下图
作业调度的详细过程如下:
作业调度(函数为:
attemper())
运行队列(run)空?
首先为运行队列中的作业分配资源(将不能分配资源的作业插入等待队列,同时当前并行运行的作业数runjcb加1)
否
Ready=NULL?
运行作业数runjcb大于最大允许数maxrun?
将ready队列中优先级高且能被分配资源的作业插入run队列
是
是
否
否
四、程序代码如下:
#include
#include
#include"conio.h"
#defineGetSpace(type)(type*)malloc(sizeof(type))//空间分配函数
#defineNULL0
#definesourcenum8//系统拥有的各种同类资源数目
#definemaxrun3//定义在CPU中能同时运行的作业总数
charsyssourcename[sourcenum]={'A','B','C','D','E','F','G','H'};//系统资源名称
intsournum[sourcenum]={1,1,1,1,1,1,1,1};//对应的系统资源数量
intsystemtime=0;//系统时间,开始为零
intrunjcb=0;//在运行队列中的作业数量,开始为零
intJCBNum=0;//总的作业数
intJCBTime=0;//总的周转时间
floatJCBTime_1=0;//总的带权周转时间
structsystemsource{//系统资源,包括名称和数量
charname;
intnumber;
systemsource*link;
}*systemsor;
structneedsource{//作业所需资源链表结构
charname;
needsource*link;
}*sourcelink;
structjcb{//作业结构
charname[10];//作业名称
intptime;//提交时间
intrtime;//开始运行时间
intftime;//完成时间
intsuper;//优先级
intneedtime;//所需运行时间
needsource*source;//所需资源链表
charstate;//作业状态
boolrunflag;//标识该作业运行与否
jcb*link;
}*wait=NULL,*ready=NULL,*run=NULL,*p;
typedefstructsystemsourceSYSTEM;
typedefstructneedsourceNEED;
typedefstructjcbJCB;
//-----------------------------------------------------------------------------voidinit()//将系统资源名称和对应的资源数目放到系统资源队列中
{
systemsource*fir,*sec;
for(inti=0;i { fir=GetSpace(SYSTEM); fir=newSYSTEM; fir->name=syssourcename[i];//系统资源名称 fir->number=sournum[i];//对应的数量 fir->link=NULL; if(i==0) systemsor=fir;//生成系统资源链表systemsor else sec->link=fir; sec=fir; } } //----------------------------------------------------------------------------- voidsort(boolBOOL) { //按作业的优先级的高低依次插入到相关队列 //当BOOL为true时表明要插入到就绪队列,否则插入到等待队列 jcb*fir,*sec; boolins=true; if(BOOL)//插入就绪队列 fir=ready; else fir=wait; if((fir==NULL)||(p->super)>(fir->super)) { p->link=fir; fir=p; if(BOOL) ready=fir; else wait=fir; } else { sec=fir->link; while(sec! =NULL) { if((p->super)>(sec->super)) { p->link=sec; fir->link=p; sec=NULL; ins=false; } else { fir=fir->link; sec=sec->link; } } if(ins) fir->link=p; } } //----------------------------------------------------------------------------- voidinput() { intnum; cout<<"\n输入作业个数: "; cin>>num; JCBNum+=num;//将新加的作业个数加到总的作业数中 for(inti=0;i { p=GetSpace(JCB); p=newJCB; cout<<"\n\n输入作业"< "; cin>>p->name; cout<<"\n输入该作业的优先级: "; cin>>p->super; cout<<"\n输入该作业所需的资源数目: "; cin>>p->needtime; needsource*fir,*sec; systemsource*cur; sec=p->source; for(intj=0;j { boolBOOL=true; fir=GetSpace(NEED); while(BOOL) { cur=systemsor;//指向系统资源链表 cout<<"\n输入第"< "; cin>>fir->name; fir->link=NULL; while(cur! =NULL)//保证输入的资源是系统有的 { if(fir->name==cur->name)//输入的是合法资源 { BOOL=false; break; } else cur=cur->link; } if(cur==NULL)//输入的是非法资源 cout<<"\n该资源不是系统资源,请重新输入...\n\n"; } if(j==0) p->source=fir; else sec->link=fir; sec=fir; } p->ptime=systemtime;//提交时间为当前系统时间 p->ftime=p->rtime=0; p->runflag=false;//开始时运行状态为否 p->state='O';//状态为就绪Order p->link=NULL; sort(true);//参数为true表示插入就绪链表,当参数为false是表示要插入等待链表 } } //----------------------------------------------------------------------------- intspace()//查看就绪队列是否为空,返回其长度 { intlen=0;jcb*fir; fir=ready; while(fir! =NULL) { len++; fir=fir->link; } returnlen; } //----------------------------------------------------------------------------- voidattemper()//为作业分配资源函数 { jcb*fir,*sec,*thr; systemsource*res; if(run! =NULL)//如果有作业正在运行的话,优先为它们分配资源 { sec=fir=run; while(fir! =NULL) { res=systemsor;//指向系统资源链表 while(res! =NULL) { if(fir->source->name==res->name) {//找到运行队列中所有作业需要的资源 //并查看系统能否为其分配资源 if(res->number>0)//可以为该作业分配资源 { res->number--;//资源数减1 sec=fir;//继续分配队列中其它作业需要的资源 fir=fir->link; } else//不能分配,插入等待队列 { if(fir==run)//如果的运行队列的队首 { run=run->link; p=fir; sec=fir=run; } else { sec->link=fir->link; p=fir; fir=fir->link; } p->link=NULL; p->state='W';//作业状态为等待Wait p->super--;//优先级减1,从而保证其它作业能得到资源 runjcb--;//运行的作业数减1 sort(false);//插入等待队列 } break; } else res=res->link; } } } //为就绪队列中的作业分配资源 sec=fir=ready; jcb*cur; while(runjcb<=maxrun&&fir! =NULL)//运行队列中的总数小于允许同时运行的总数 { res=systemsor;//指向系统资源链表 while(res! =NULL) { if(fir->source->name==res->name) { if(res->number>0)//能够为该作业分配资源 { res->number--;//对应资源数目减1 runjcb++;//运行队列作业树木加1 thr=fir; cur=run; //将该作业移出就绪队列 if(fir==ready) { ready=ready->link; sec=fir=ready; } else { sec->link=fir->link; fir=fir->link; } thr->link=NULL; thr->state='R'; if(thr->runflag==false) { //该作业第一次运行,开始运行时间等于当前系统时间 thr->rtime=systemtime; thr->runflag=true;//表示已经运行 } //插入到运行队列的队尾 if(run==NULL) run=thr; else { while(cur->link! =NULL)//找到运行队列的队尾 cur=cur->link; cur->link=thr;//在队尾插入该作业 } } else {//准备为就绪队列中的下一个作业分配资源 sec=fir; fir=fir->link; } break;//跳处while循环 } res=res->link;//指向系统资源链表的下一个资源,继续查找 } } } //----------------------------------------------------------------------------- voiddisplay(jcb*pr) { needsource*res; cout<<"\n\t"< res=pr->source->link; while(res! =NULL) {//将作业所需的资源列表逐一打印出来 cout<<"\t\t\t\t\t\t\t"< res=res->link; } cout< } //----------------------------------------------------------------------------- voidcheck()//打印在运行队列,就绪队列和等待队列中的作业的信息 { jcb*pr; if(run==NULL) cout<<"\n当前在运行队列没有任何作业...\n"; else { cout<<"\n当前在运行队列的作业参数如下...\n\n"; cout<<"\tname\tptime\trtimr\tftime\tsuper\tstate\tsource"< pr=run; while(pr! =NULL) { display(pr);//打印作业信息函数 pr=pr->link; } } if(ready==NULL) cout<<"\n当前在就绪队列没有任何作业...\n"; else { cout<<"\n当前在就绪队列的作业参数如下...\n\n"; cout<<"\tname\tptime\trtimr\tftime\tsuper\tstate\tsource"< pr=ready; while(pr! =NULL) { display(pr);//打印作业信息函数 pr=pr->link; } } if(wait==NULL) cout<<"\n当前在等待队列没有任何作业...\n\n"; else { cout<<"\n当前在等待队列的作业参数如下...\n\n"; cout<<"\tname\tptime\trtimr\tftime\tsuper\tstate\tsource"< pr=wait; while(pr! =NULL) { display(pr);//打印作业信息函数 pr=pr->link; } } cout< } //----------------------------------------------------------------------------- voidactivation(charResName)//激活在等待队列中的作业 { //ResName为刚刚释放的资源的名称 //在等待队列中找到某作业所需资源队列的第一个资源名称跟其相同的,激活之 jcb*fir,*sec; if(wait==NULL)//等待队列为空,返回 return; if(wait->source->name==ResName)//等待队列中第一个作业就是需要该资源的作业 //激活之 { p=wait; wait=wait->link; p->state='O';//作业状态为就绪Order p->link=NULL; sort(true);//将该作业插入到就绪队列中 } else {//在等待队列中查找需要该资源的作业 fir=wait; sec=fir->link; while(sec! =NULL) { if(sec->source->name==ResName) { p=sec; fir->link=sec->link; p->state='O'; p->link=NULL; sort(true);//将该作业插入到就绪队列中 break; } else { fir=sec; sec=sec->link; } } } } //------------------------------------------------------------------------------------------------ voiddestory(jcb*pr)//打印运行完成的作业信息,并撤消之 { pr->ftime=systemtime; cout<<"\n\n\n作业"< cout<<"相关参数如下: "< cout<<"\n提交时间: "< cout<<"\n---------------------------"; cout<<"\n开始运行时间: "< cout<<"\n---------------------------"; cout<<"\n完成时刻: "< cout<<"\n---------------------------"; cout<<"\n所需运行时间: "< cout<<"\n---------------------------"; cout<<"\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 调度 设计 报告 多道