作业调度设计报告(多道)_第1页
作业调度设计报告(多道)_第2页
作业调度设计报告(多道)_第3页
作业调度设计报告(多道)_第4页
作业调度设计报告(多道)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 作业调度(多通道)课程设计报告 一、 目的要求:用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。二、 详细设计:在多通道批处理系统中,作业的运行除了考虑作业之间的优先关系之外,还必须考虑系统能否为其所需的资源分配资源。因为在多通道批处理系统中同时有不只一道作业在CPU中运行,这样就会导致某个作业需要的资源正在被另一个作业占用,这样就会导致无法分配资源的作业进入等待状态,直到该资源被其它作业释放后才能重新激活。、 作业调度算法该作业调度系统的调度算法是基于优先级的调度算法。在作业提交后按预先设定的优先级的高低依次插入到就绪队列(ready),但在系统运行过程中,除

2、了考虑优先级外(即优先级高只是表明该作业能较先运行),同时还应该考虑该作业所需的资源是否能够被分配到。、 为作业分配资源在这里采用这样的方法判断资源能否分配:查看该作业运行所需的第一个资源,然后在系统资源中查看该资源是否还有空闲的,有则表示该资源可以插入到运行队列(run)中,准备在下一个时间片中运行。、 设置同时运行的最大并行度这里设置一个量maxrun,这个量是系统允许同时并行运行的作业数量,当运行队列中的作业数目达到最大值maxrun后,即使某作业所需的资源系统还有空闲的,也不再允许继续分配。、 作业模块每个作业由一个作业控制块JCB控制,相关信息将在代码中将详细给出。、 所需资源模块

3、每个作业的JCB模块中有个所需资源的链,其结构用needsource表示,相关信息将在代码中将详细给出。、 系统资源模块(systemsource)将系统拥有的各个资源及其的数目链成链,在系统运行过程中通过这个链就可以查询某作业需要的资源系统是否可以分配。每当为某作业分配了某个资源后,该资源的数目减1,而当某作业释放了某个资源后,该资源的数目又将加1。相关信息将在代码中将详细给出。三、 调度算法流程图如下:结束 开始初始化系统资源(将系统资源及数目链成链,以便查询)初始化所有JCB,使JCB按预定的优先级排成队列(systemtime=0)作业调度(函数为:attemper())查看调度情况(

4、函数为:check();打印就绪队列,运行队列,等待队列中各个作业的信息)作业运行,将运行队列中的各个作业的所需的第一个资源撤消,查看等待队列,看是否有作业需要该资源,有则激活该作业,同时所需资源链needsource * source指针指向下一个资源。Systemtime加1运行队列中有作业的资源链*source为空?资源链为空,该作业已经运行完毕,打印所有完成的作业信息,并从run队列中撤消Ready=NULL?Run=NULL?计算并打印该组作业的平均周转时间和平均带权周转时间是是是否否否详细过程见下图 作业调度的详细过程如下: 作业调度(函数为:attemper())运行队列(run

5、)空?首先为运行队列中的作业分配资源(将不能分配资源的作业插入等待队列,同时当前并行运行的作业数runjcb加1)否Ready=NULL?运行作业数runjcb大于最大允许数maxrun?将ready队列中优先级高且能被分配资源的作业插入run队列是是否否四、 程序代码如下:#include <iostream.h>#include <stdlib.h>#include "conio.h"#define GetSpace(type) (type*)malloc(sizeof(type) /空间分配函数#define NULL 0#define sou

6、rcenum 8 /系统拥有的各种同类资源数目#define maxrun 3 /定义在CPU中能同时运行的作业总数char syssourcenamesourcenum = 'A','B','C','D','E','F','G','H'/系统资源名称int sournumsourcenum = 1,1,1,1,1,1,1,1; /对应的系统资源数量int systemtime = 0; /系统时间,开始为零int runjcb = 0; /在运行队列中的作业数量,开

7、始为零int JCBNum = 0; /总的作业数int JCBTime = 0; /总的周转时间float JCBTime_1 = 0; /总的带权周转时间struct systemsource /系统资源,包括名称和数量char name;int number;systemsource * link;*systemsor;struct needsource /作业所需资源链表结构char name;needsource *link;*sourcelink;struct jcb /作业结构char name10; /作业名称 int ptime; /提交时间int rtime; /开始运行时

8、间int ftime; /完成时间int super; /优先级int needtime; /所需运行时间needsource * source; /所需资源链表char state; /作业状态bool runflag; /标识该作业运行与否jcb * link;*wait=NULL,*ready=NULL,*run=NULL,*p;typedef struct systemsource SYSTEM;typedef struct needsource NEED;typedef struct jcb JCB;/-void init() /将系统资源名称和对应的资源数目放到系统资源队列中sys

9、temsource *fir,*sec;for(int i=0;i < sourcenum;i+)fir = GetSpace(SYSTEM);fir = new SYSTEM;fir->name = syssourcenamei; /系统资源名称fir->number = sournum i; /对应的数量fir->link = NULL;if(i=0)systemsor = fir; /生成系统资源链表systemsorelsesec->link = fir;sec = fir;/-void sort(bool BOOL)/按作业的优先级的高低依次插入到相关队

10、列/当BOOL为true时表明要插入到就绪队列,否则插入到等待队列jcb *fir,*sec;bool ins = true;if(BOOL) /插入就绪队列fir = ready;elsefir = wait;if(fir=NULL) | (p->super) > (fir->super)p->link = fir;fir = p;if(BOOL)ready = fir;elsewait = fir;elsesec = fir->link ;while(sec != NULL)if(p->super) > (sec->super)p->l

11、ink = sec;fir->link = p;sec = NULL;ins = false;elsefir=fir->link;sec=sec->link;if(ins)fir->link = p;/-void input()int num;cout<<"n输入作业个数: "cin>>num;JCBNum += num; /将新加的作业个数加到总的作业数中for(int i=0; i<num; i+)p = GetSpace(JCB);p = new JCB;cout<<"nn输入作业 "

12、;<<i+1<<" 的名称: "cin>>p->name ;cout<<"n输入该作业的优先级: "cin>>p->super;cout<<"n输入该作业所需的资源数目: "cin>>p->needtime;needsource *fir,*sec;systemsource *cur;sec = p->source;for(int j=0; j<p->needtime ; j+)bool BOOL=true;fir

13、= GetSpace(NEED); while(BOOL)cur = systemsor; /指向系统资源链表cout<<"n输入第 "<<j+1<<" 个资源的名称:"cin>>fir->name; fir->link = NULL;while(cur != NULL) /保证输入的资源是系统有的if(fir->name = cur->name ) /输入的是合法资源BOOL = false;break;elsecur = cur->link ;if(cur = NULL)

14、/输入的是非法资源cout<<"n该资源不是系统资源,请重新输入.nn"if(j=0)p->source = fir;elsesec->link = fir;sec = fir;p->ptime = systemtime; /提交时间为当前系统时间p->ftime = p->rtime = 0;p->runflag = false; /开始时运行状态为否p->state = 'O' /状态为就绪Orderp->link = NULL; sort(true);/参数为true表示插入就绪链表,当参数为

15、false是表示要插入等待链表/-int space() /查看就绪队列是否为空,返回其长度int len=0; jcb *fir;fir = ready;while(fir != NULL)len+;fir=fir->link ;return len;/-void attemper() /为作业分配资源函数jcb *fir,*sec,*thr;systemsource *res;if(run != NULL) /如果有作业正在运行的话,优先为它们分配资源sec = fir = run;while(fir != NULL)res = systemsor; /指向系统资源链表while(r

16、es != NULL)if(fir->source->name = res->name)/找到运行队列中所有作业需要的资源/并查看系统能否为其分配资源if(res->number > 0) /可以为该作业分配资源res->number -; /资源数减1sec = fir; /继续分配队列中其它作业需要的资源 fir = fir->link;else /不能分配,插入等待队列if(fir = run) /如果的运行队列的队首run = run->link ;p= fir;sec = fir = run;elsesec->link = fir

17、->link;p=fir;fir = fir->link;p->link = NULL;p->state = 'W' /作业状态为等待Waitp->super -; /优先级减1,从而保证其它作业能得到资源runjcb -; /运行的作业数减1sort(false); /插入等待队列break;elseres = res->link ;/为就绪队列中的作业分配资源sec = fir = ready;jcb *cur;while(runjcb <= maxrun && fir != NULL) /运行队列中的总数小于允许同

18、时运行的总数res = systemsor; /指向系统资源链表while(res != NULL)if(fir->source->name = res->name)if(res->number > 0) /能够为该作业分配资源res->number -; /对应资源数目减1runjcb +; /运行队列作业树木加1thr = fir;cur = run;/将该作业移出就绪队列if(fir = ready) ready = ready->link ;sec = fir = ready;elsesec->link = fir->link ;f

19、ir = fir->link ;thr->link = NULL;thr->state = 'R'if(thr->runflag = false) /该作业第一次运行,开始运行时间等于当前系统时间thr->rtime = systemtime;thr->runflag = true; /表示已经运行/插入到运行队列的队尾if(run = NULL)run = thr;elsewhile(cur->link != NULL) /找到运行队列的队尾cur = cur->link ;cur->link = thr; /在队尾插入该

20、作业else/准备为就绪队列中的下一个作业分配资源sec = fir;fir = fir->link;break; /跳处内while循环res = res->link ; /指向系统资源链表的下一个资源,继续查找/-void display(jcb *pr)needsource *res;cout<<"nt"<<pr->name<<"t"<<pr->ptime<<"t"<<pr->rtime<<"t"

21、<<pr->ftime<<"t"<<pr->super<<"t"<<pr->state<<"t"<<pr->source->name<<endl;res = pr->source->link;while(res != NULL) /将作业所需的资源列表逐一打印出来cout<<"ttttttt"<<res->name<<endl;res =

22、 res->link;cout<<endl;/-void check() /打印在运行队列,就绪队列和等待队列中的作业的信息jcb *pr;if(run = NULL)cout<<"n 当前在运行队列没有任何作业.n"elsecout<<"n 当前在运行队列的作业参数如下.nn"cout<<"tnametptimetrtimrtftimetsupertstatetsource"<<endl;pr = run;while(pr != NULL)display(pr); /

23、打印作业信息函数pr = pr->link ;if(ready = NULL)cout<<"n 当前在就绪队列没有任何作业.n"elsecout<<"n 当前在就绪队列的作业参数如下.nn"cout<<"tnametptimetrtimrtftimetsupertstatetsource"<<endl;pr = ready;while(pr != NULL)display(pr); /打印作业信息函数pr = pr->link ;if(wait = NULL)cout<

24、<"n 当前在等待队列没有任何作业.nn"elsecout<<"n 当前在等待队列的作业参数如下.nn"cout<<"tnametptimetrtimrtftimetsupertstatetsource"<<endl;pr = wait;while(pr != NULL)display(pr); /打印作业信息函数pr = pr->link ;cout<<endl;/-void activation(char ResName) /激活在等待队列中的作业/ResName为刚刚释

25、放的资源的名称/在等待队列中找到某作业所需资源队列的第一个资源名称跟其相同的,激活之jcb *fir,*sec;if(wait = NULL) /等待队列为空,返回return;if(wait->source->name = ResName) /等待队列中第一个作业就是需要该资源的作业 /激活之p = wait;wait = wait->link ;p->state = 'O' /作业状态为就绪Orderp->link = NULL;sort(true); /将该作业插入到就绪队列中else/在等待队列中查找需要该资源的作业fir = wait;s

26、ec=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;elsefir = sec;sec = sec->link ;/-void destory(jcb *pr) /打印运行完成的作业信息,并撤消之pr->ftime = systemtime;cout<<&qu

27、ot;nnn 作业 "<<pr->name<<" 已经完成.nn"cout<<" 相关参数如下:"<<endl;cout<<"n提交时间: "<<pr->ptime;cout<<"n-"cout<<"n开始运行时间: "<<pr->rtime;cout<<"n-"cout<<"n完成时刻: "<

28、;<pr->ftime;cout<<"n-"cout<<"n所需运行时间: "<<pr->needtime;cout<<"n-"cout<<"n实际运行时间: "<<pr->ftime-pr->rtime; /实际运行时间等于完成时刻/开始运行时刻cout<<"n-"cout<<"n周转时间: "<<pr->ftime-pr->

29、ptime;/周转时间德育完成时刻-提交时刻cout<<"n-"cout<<"n带权周转时间 "<<float(pr->ftime-pr->ptime)/float(pr->needtime); /带权周转时间等于周转时间/所需的运行时间cout<<"n-"<<endl;JCBTime += systemtime-pr->ptime; /将该作业的周转时间加入到作业总周转时间JCBTime_1 += float(JCBTime)/float(pr-&g

30、t;needtime); /更新总带权周转时间cout<<endl;delete pr;/-void running() /运行函数/每运行一次相当于把运行队列中所有作业所需的第一个资源从所需资源队列中撤消掉jcb *fir; systemsource *res; /系统资源needsource *abandon;if(run = NULL) /运行队列为空,没有运行作业return;fir = run;while(fir != NULL)res = systemsor; /res指向系统资源链表的表头while(res != NULL)if(fir->source->

31、name = res->name) /运行的结果是该作业取消所需的第一个资源abandon = fir->source; /abandon为需要释放的资源fir->source = fir->source->link;res->number +; /释放该作业占用的但已经完成的资源 activation(res->name); /激活等待队列中需要该资源的作业delete abandon;break;elseres = res->link ;fir = fir->link ;/-void displayResult() /检查是否有运行完的

32、作业jcb *fir,*sec,*thr;if(run = NULL) /运行队列为空,返回return;fir = sec = run; /在运行队列中找到已经完成的作业while(fir != NULL)if(run->source = NULL) /所需资源链表为空,该作业已经完成thr = run;run = run->link ;fir = sec = run;destory(thr); /打印该作业的参数信息并撤消该作业runjcb -; /当前运行队列的作业数减1cout<<"n按任意键继续."<<endl; getch();elseif(fir->source = NULL)thr = fir;sec->link = fir->link ;fir = fir->link ;destory(thr); /打印该作业的参数信息并撤消该作业 runjcb -; /当前运行队列的作业数减1cout<<"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论