各类作业调度算法.docx

上传人:b****3 文档编号:6078438 上传时间:2023-05-09 格式:DOCX 页数:24 大小:36.68KB
下载 相关 举报
各类作业调度算法.docx_第1页
第1页 / 共24页
各类作业调度算法.docx_第2页
第2页 / 共24页
各类作业调度算法.docx_第3页
第3页 / 共24页
各类作业调度算法.docx_第4页
第4页 / 共24页
各类作业调度算法.docx_第5页
第5页 / 共24页
各类作业调度算法.docx_第6页
第6页 / 共24页
各类作业调度算法.docx_第7页
第7页 / 共24页
各类作业调度算法.docx_第8页
第8页 / 共24页
各类作业调度算法.docx_第9页
第9页 / 共24页
各类作业调度算法.docx_第10页
第10页 / 共24页
各类作业调度算法.docx_第11页
第11页 / 共24页
各类作业调度算法.docx_第12页
第12页 / 共24页
各类作业调度算法.docx_第13页
第13页 / 共24页
各类作业调度算法.docx_第14页
第14页 / 共24页
各类作业调度算法.docx_第15页
第15页 / 共24页
各类作业调度算法.docx_第16页
第16页 / 共24页
各类作业调度算法.docx_第17页
第17页 / 共24页
各类作业调度算法.docx_第18页
第18页 / 共24页
各类作业调度算法.docx_第19页
第19页 / 共24页
各类作业调度算法.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

各类作业调度算法.docx

《各类作业调度算法.docx》由会员分享,可在线阅读,更多相关《各类作业调度算法.docx(24页珍藏版)》请在冰点文库上搜索。

各类作业调度算法.docx

各类作业调度算法

实验二作业调度实验

一.目的要求:

 

  用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。

 

二.例题:

为单道批处理系统设计一个作业调度程序。

 

  由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。

  作业调度算法:

采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。

总是首先调度在系统中等待时间最长的作业。

  每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:

作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。

  作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。

每个作业的最初状态总是等待W。

  各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。

每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。

 

调度算法的流程图如下图所示。

三.实习题:

1、编写并调试一个单道处理系统的作业等待模拟程序。

  作业等待算法:

分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。

  对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。

 

2、编写并调度一个多道程序系统的作业调度模拟程序。

  作业调度算法:

采用基于先来先服务的调度算法。

可以参考课本中的方法进行设计。

对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

 

3、编写并调试一个多道程序系统的作业调度模拟程序。

  作业调度算法:

采用基于优先级的作业调度。

  可以参考课本中的例子自行设计。

三.实验过程:

1、编写并调试一个单道处理系统的作业等待模拟程序。

先来先服务(FCFS):

main.cpp:

/*

**先来先服作业调度算法模拟

*/

#include

#include

#defineMAX_SOURCE1000//资源总数(对于单通道的作业调度可以忽略系统资源问题)

usingnamespacestd;

structjobCB

{

stringname;

doublesubtime;//提交时间

doubleruntime;//运行时间

doublesource;//资源

charstate;//进程状态

structjobCB*next;//链指针

}*ready,*rail,*p;

intlength;

doublemaxsource;

doublenow_source;

doubleallTi;//总周转时间

doubleallWi;//总带权周转时间

doubletime;//时钟

voidinit()

{

time=0;

length=0;

allTi=0;

allWi=0;

maxsource=MAX_SOURCE;

now_source=0;

rail=ready=p=NULL;

}

voiddestroy()

{

maxsource+=p->source;//释放资源

time+=p->runtime;

p->state='f';

deletep;

}

voidrunning()

{

p->state='r';

doubleTc=time+p->runtime;//完成时刻

doubleTi=Tc-p->subtime;//周转时间

doubleWi=Ti/p->runtime;//带权周转时间

cout<<"\n作业"<name<<"信息:

"<

cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间"<

cout<<"\n"<subtime<<"\t"<runtime<<"\t"<

allTi+=Ti;

allWi+=Wi;

destroy();

}

voiddisplay()

{

cout<<"\n----------------------------------------------------------"<

for(inti=0;i

{

p=ready;

ready=ready->next;

p->state='r';

running();

}

cout<<"\n----------------------------------------------------------"<

}

voidin_queue()

{

now_source+=p->source;//分配资源给作业

if(maxsource>=now_source)

{

if(ready==NULL)

{

ready=rail=p;

}

else

{

rail->next=p;

rail=p;

}

length++;

}

else

{

now_source-=p->source;//回退

cout<<"没有足够资源!

"<

return;

}

}

voidinput()

{

intn;

cout<<"--先来先服作业调度算法模拟--"<

cout<<"请输入作业数:

"<

cin>>n;

for(inti=0;i

{

p=newjobCB;

cout<<"当前作业录入时间:

"<

cout<<"\n请输入作业名:

";

cin>>p->name;

cout<<"\n请输入作业所需的运行时间:

";

cin>>p->runtime;

cout<<"\n请输入作业所需的资源:

";

cin>>p->source;

p->state='w';

p->subtime=time;

time++;

p->next=NULL;

in_queue();

}

}

intmain()

{

init();

input();

display();

cout<<"\n这组作业的平均周转时间为:

"<

cout<<"\n这组作业的带权平均周转时间为:

"<

return0;

}

(程序测试运行结果在附件里)

短作业优先(SJF):

main.cpp:

/*

**短作业优先作业调度算法模拟

*/

#include

#include

#defineMAX_SOURCE1000

usingnamespacestd;

structjobCB

{

stringname;

doublesubtime;//提交时间

doubleruntime;//运行时间

doublesource;//资源

charstate;//进程状态

structjobCB*next;//链指针

}*ready,*rail,*p;

intlength;

doublemaxsource;//资源总数,对于单通道作业调度,资源部分可以去掉(由于当时写多道时是在单道上直接修改的,所以这里多道部分仍然在)

doublenow_source;//当前资源

doubleallTi;//总周转时间

doubleallWi;//总带权周转时间

doubletime;//时钟

voidinit()

{

time=0;

length=0;

allTi=0;

allWi=0;

maxsource=MAX_SOURCE;

now_source=0;

rail=ready=p=NULL;

}

voiddestroy()

{

Maxsource+=p->source;//释放资源

time+=p->runtime;

p->state='f';

deletep;

}

voidrunning()

{

p->state='r';

doubleTc=time+p->runtime;//完成时刻

doubleTi=Tc-p->subtime;//周转时间

doubleWi=Ti/p->runtime;//带权周转时间

cout<<"\n作业"<name<<"信息:

"<

cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间"<

cout<<"\n"<subtime<<"\t"<runtime<<"\t"<

allTi+=Ti;

allWi+=Wi;

destroy();

}

voiddisplay()

{

cout<<"\n----------------------------------------------------------"<

for(inti=0;i

{

p=ready;

ready=ready->next;

p->state='r';

running();

}

cout<<"\n----------------------------------------------------------"<

}

voidin_queue()

{

intflag=0;

now_source+=p->source;//分配资源给作业

jobCB*q1,*q2;

if(maxsource>=now_source)

{

if(ready==NULL)

{

ready=rail=p;

}

else

{

if(p->runtimeruntime)

{

p->next=ready;

ready=p;

}else{

q1=ready;

q2=ready->next;

while(q2!

=NULL){

if(q2->runtime>p->runtime)

{

p->next=q2;

q1->next=p;

flag=1;

}

q1=q2;

q2=q2->next;

}

if(flag==0)

q1->next=p;

}

}

length++;

}

else

{

now_source-=p->source;//回退

cout<<"没有足够资源!

"<

return;

}

}

voidinput()

{

intn;

cout<<"---短作业优先作业调度算法模拟---"<

cout<<"请输入作业数:

"<

cin>>n;

for(inti=0;i

{

p=newjobCB;

cout<<"当前作业录入时间:

"<

cout<<"\n请输入作业名:

";

cin>>p->name;

cout<<"\n请输入作业所需的运行时间:

";

cin>>p->runtime;

cout<<"\n请输入作业所需的资源:

";

cin>>p->source;

p->state='w';

p->subtime=time;

time++;

p->next=NULL;

in_queue();

}

}

intmain()

{

init();

input();

display();

cout<<"\n这组作业的平均周转时间为:

"<

cout<<"\n这组作业的带权平均周转时间为:

"<

return0;

}

(程序测试运行结果在附件里)

响应比高者优先(HRN):

main.cpp:

/*

**响应比高优先作业调度算法模拟

*/

#include

#include

#include

#defineMAX_SOURCE1000

usingnamespacestd;

structjobCB

{

stringname;

doublesubtime;//提交时间

doubleruntime;//运行时间

doublesource;//资源

charstate;//进程状态

structjobCB*next;//链指针

}*p;

listjobqueue;//声明作业调度队列,使用STL(标准模板库)的list

list:

:

iteratorit;

intlength;

doublemaxsource;

doublenow_source;

doubleallTi;//总周转时间

doubleallWi;//总带权周转时间

doubletime;//时钟

doubleinputfinishtime;//输入结束时间

voidinit()

{

time=0;

length=0;

allTi=0;

allWi=0;

inputfinishtime=0;

maxsource=MAX_SOURCE;

now_source=0;

p=NULL;

}

voiddestroy()

{

maxsource+=p->source;

time+=p->runtime;

p->state='f';

}

voidrunning()

{

p->state='r';

doubleTc=time+p->runtime;//完成时刻

doubleTi=Tc-p->subtime;//周转时间

doubleWi=Ti/p->runtime;//带权周转时间

cout<<"\n作业"<name<<"信息:

"<

cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间响应比"<

cout<<"\n"<subtime<<"\t"<runtime<<"\t"<subtime)/p->runtime+1<

allTi+=Ti;

allWi+=Wi;

destroy();

}

voiddisplay()

{

cout<<"\n----------------------------------------------------------"<

for(inti=0;i

{

p=jobqueue.front();//取出队首元素

jobqueue.pop_front();//出队

p->state='r';

running();

}

cout<<"\n----------------------------------------------------------"<

}

voidin_queue()//按所有作业到达后再计算响应比(即固定优先比),所有作业都提交完成的时间是n*提交单个作业时间

(1)

{

now_source+=p->source;//分配资源给作业

if(maxsource>=now_source)

{

jobqueue.push_back(p);

length++;

}

else

{

now_source-=p->source;//回退

cout<<"没有足够资源!

"<

return;

}

}

doublemakeout_ResR(jobCB*p)//算出响应比,因为优先比是waittime/runtime+1,所以这里直接比较waittime/runtime->(inputfinishtime-subtime)/runtime

{

//cout<<(inputfinishtime-p->subtime)/p->runtime<<"\t";

return(inputfinishtime-p->subtime)/p->runtime;

}

boolcompare(jobCB*first,jobCB*second)//用于list排序的compare函数

{

if(makeout_ResR(first)>makeout_ResR(second))returntrue;

elsereturnfalse;

}

voidinput()

{

intn;

cout<<"---响应比优先作业调度算法模拟---"<

cout<<"请输入作业数:

"<

cin>>n;

inputfinishtime=n*1;

for(inti=0;i

{

p=newjobCB;

cout<<"当前作业录入时间:

"<

cout<<"\n请输入作业名:

";

cin>>p->name;

cout<<"\n请输入作业所需的运行时间:

";

cin>>p->runtime;

cout<<"\n请输入作业所需的资源:

";

cin>>p->source;

p->state='w';

p->subtime=time;

time++;

p->next=NULL;

in_queue();

}

jobqueue.sort(compare);

}

intmain()

{

init();

input();

display();

cout<<"\n这组作业的平均周转时间为:

"<

cout<<"\n这组作业的带权平均周转时间为:

"<

return0;

}

(程序测试运行结果在附件里)

2、编写并调度一个多道程序系统的作业调度模拟程序。

采用基于先来先服务的调度算法:

(程序源码在1中已粘贴,1中不需要用到source部分)

3、编写并调试一个多道程序系统的作业调度模拟程序。

作业调度算法:

采用基于优先级的作业调度。

main.cpp:

/*

**短作业优先作业调度算法模拟

*/

#include

#include

#defineMAX_SOURCE1000

usingnamespacestd;

structjobCB

{

stringname;

doublesubtime;//提交时间

doubleruntime;//运行时间

doublesource;//资源

intpriority;//优先级

charstate;//进程状态

structjobCB*next;//链指针

}*ready,*rail,*p;

intlength;

doublemaxsource;

doublenow_source;

doubleallTi;//总周转时间

doubleallWi;//总带权周转时间

doubletime;//时钟

voidinit()

{

time=0;

length=0;

allTi=0;

allWi=0;

maxsource=MAX_SOURCE;

now_source=0;

rail=ready=p=NULL;

}

voiddestroy()

{

maxsource+=p->source;

time+=p->runtime;

p->state='f';

deletep;

}

voidrunning()

{

p->state='r';

doubleTc=time+p->runtime;//完成时刻

doubleTi=Tc-p->subtime;//周转时间

doubleWi=Ti/p->runtime;//带权周转时间

cout<<"\n作业"<name<<"信息:

"<

cout<<"\n录入时间运行时间开始运行的时刻完成时刻周转时间带权周转时间优先级"<

cout<<"\n"<subtime<<"\t"<runtime<<"\t"<priority<

allTi+=Ti;

allWi+=Wi;

destroy();

}

voiddisplay()

{

cout<<"\n----------------------------------------------------------"<

for(inti=0;i

{

p=ready;

ready=ready->next;

p->state='r';

running();

}

cout<<"\n----------------------------------------------------------"<

}

voidin_queue()

{

intflag=0;

now_source+=p->source;//分配资源给作业

jobCB*q1,*q2;

if(maxsource>=now_source)

{

if(ready==NULL)

{

ready=rail=p;

}

else

{

if(p->prio

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2