单道批处理系统作业调度.docx
《单道批处理系统作业调度.docx》由会员分享,可在线阅读,更多相关《单道批处理系统作业调度.docx(22页珍藏版)》请在冰豆网上搜索。
单道批处理系统作业调度
单道批处理系统作业调度
1.课程设计的目的
操作系统课程的一个非常重要的环节是培养计算机专业学生的系统程序设计能力。
通过操作系统课程设计,可以培养程序设计的方法和技巧,提高编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使我们更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
本次课程设计要求用高级语言编写和调试一个单道批处理系统的作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解
2.课程设计的开发语言
C语言
3.功能描述
在批处理系统中,作业进入系统后,是先驻留在外存上的,因此需要有作业调度的过程,以便将它们分批装入内存。
作业调度用于决定把外存上处于后备队列中的哪些作业调入内存,并为他们创建进程、分配必要的资源,然后,再将新创建的进程排在就绪队列上,准备执行。
应将哪些作业从外存调入内存,取决于所采用的调度算法。
最简单的是先来先服务调度算法,这是指讲最早进度外存的作业最先调入内存;较常用的一种是短作业优先电镀算法,这是将外存上最短的作业最先调入内存;此外,还有基于响应比高者优先的调度算法,根据作业的响应时间和要求运行时间可计算出响应比。
4.方案论证
4.1概要设计
根据功能描述,单道批处理程序作业调度的模拟程序要求实现如下功能:
建立作业、选择作业、运行作业、计算作业周转时间和带权周转时间,以及这组作业的平均周转时间和带权平均周转时间、显示运行结果,退出程序。
各模块的功能介绍如下:
(1)建立作业:
输入作业数,建立一组作业,并对所建立的这组作业进行初始化,用以模拟作业调度。
初始化的内容包括作业名,作业要求运行的时间。
(2)选择作业:
程序通过先来先服务调度算法、短作业优先调度算法和高响应比优先调度算法对建立的一组作业进行选择,决定把哪个作业从外存调入内存中。
(3)运行作业:
根据初始化中设置的作业要求运行时间来模拟作业的运行。
(4)计算:
计算作业周转时间和带权周转时间,以及这组作业的平均周转时间和带权平均周转时间。
(5)显示结果:
将计算所得的结果输出。
(6)退出程序:
当实验结束,不再需要模拟作业调度的时候,用来退出程序。
作业调度模拟程序的系统功能结构如图1所示。
图1作业调度模拟程序系统功能结构图
4.2详细设计
由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:
作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W。
对每种调度算法都要求输出每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。
从以上分析可见,在这个模拟程序中作业控制块JCB的数据结构类型可定义为:
structjcb{//作业控制块
charname[10];//作业名
intreachtime;//作业到达时间
intstarttime;//作业开始时间
intneedtime;//作业需要运行的时间
floatsuper;//作业的响应比
intfinishtime;//作业完成时间
floatcycletime;//作业周转时间
floatcltime;//作业带权周转时间
charstate;//作业状态
structjcb*next;//结构体指针
}*ready=NULL,*p,*q;
typedefstructjcbJCB;
作业调度算法:
分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
(1)先来先服务算法:
按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。
流程图如图2所示。
图2先来先服务调度算法流程图
(2)最短作业优先算法:
是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。
流程图如图3所示。
图3短作业优先调度算法流程图
(3)响应比高者优先算法:
是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。
流程图如图4所示。
图4响应比高者优先算法流程图
5.设计结果与分析
(1)选择操作的界面,如图5所示。
图5选择操作的界面
(2)输入操作初始信息,建立一组作业,由5个作业组成,作业名分别为a,b,c,d,e。
作业要运行的时间分别为5,2,7,3,4。
如图6所示。
图6初始化
(3)在选择操作的界面输入1,选择先来先服务算法进行作业调度,调度顺序为a→b→c→d→e。
运行结果如图7、图8、图9所示。
图7先来先服务算法调度图8先来先服务算法调度
图9先来先服务算法调度
(4)在选择操作的界面输入2,选择最短作业优先算法进行作业调度,调度顺序:
a→b→d→e→c。
运行结果如图10、图11、图12所示。
图10最短作业优先算法调度图11最短作业优先算法调度
图12最短作业优先算法调度
(5)在选择操作的界面输入3,选择响应比高者优先算法进行作业调度,调度顺序:
b→d→e→a→c。
运行结果如图13、图14、图15所示。
图13响应比高者优先算法调度图14响应比高者优先算法调度
图15响应比高者优先算法调度
6.设计心得体会
计算机技术发展的飞速变化超过了人们想象的速度。
但是操作系统作为一门计算机的基础课程,无论是对计算机等信息技术专业的学生活研究人员,还是对一般计算机应用人员,都是非常有益和重要的。
通过本次课程设计我对在课堂上所学的有关操作系统的知识有了更加深刻的理解和掌握,尤其是单道批处理系统。
进一步了解了该系统的主要特征:
自动性,顺序性,单道性。
批处理系统能提高系统资源的利用率和系统吞吐量。
通过设计的模拟程序对三种调度算法的模拟,对先来先服务调度算法、短作业优先调度算法以及高响应比优先调度算法的基本概念、实现过程以及各个算法的优缺点有的了深刻的了解,知道了不同的算法类型适合不同的作业类型。
本次课程设计结合了C语言程序设计语言,通过对作业调度模拟程序的设计,积累了程序设计的实战经验,锻炼了程序设计能力。
通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高,把所学课程及相关知识加以融会贯通,理解了操作系统工作的方法,为今后从事实际工作打下了坚实的基础。
7.附录
源程序:
#include
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
intn;
floatT1=0,T2=0;
inttimes=0;
structjcb//作业控制块
{
charname[10];//作业名
intreachtime;//作业到达时间
intstarttime;//作业开始时间
intneedtime;//作业需要运行的时间
floatsuper;//作业的响应比
intfinishtime;//作业完成时间
floatcycletime;//作业周转时间
floatcltime;//作业带权周转时间
charstate;//作业状态
structjcb*next;//结构体指针
}*ready=NULL,*p,*q;
typedefstructjcbJCB;
voidinize()//初始化界面
{
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t作业调度\n");
printf("\t\t*********************************************\t\t\n");
printf("\n\n\n\t\t\t\t\t信息工程学院计算机2班\n");
printf("\t\t\t\t\t施佳达\n");
printf("\t\t\t\t\t完成日期:
2010年7月17号");
printf("\n\n\n\t\t请输入任意键进入演示过程\n");
getch();
}
voidinital()//建立作业控制块队列,先将其排成先来先服务的模式队列
{
inti;
printf("\n输入作业数:
");
scanf("%d",&n);
for(i=0;i{
p=getpch(JCB);
printf("\n输入作业名:
");
scanf("%s",p->name);
getch();
p->reachtime=i;
printf("作业默认到达时间:
%d",i);
printf("\n输入作业要运行的时间:
");
scanf("%d",&p->needtime);
p->state='W';
p->next=NULL;
if(ready==NULL)ready=q=p;
else{
q->next=p;
q=p;
}
}
}
voiddisp(JCB*q,intm)//显示作业运行后的周转时间及带权周转时间等
{
if(m==3)//显示高响应比算法调度作业后的运行情况
{
printf("\n作业%s正在运行,估计其运行情况:
\n",q->name);
printf("开始运行时刻:
%d\n",q->starttime);
printf("完成时刻:
%d\n",q->finishtime);
printf("周转时间:
%f\n",q->cycletime);
printf("带权周转时间:
%f\n",q->cltime);
printf("相应比:
%f\n",q->super);
getch();
}
else//显示先来先服务,最短作业优先算法调度后作业的运行情况
{
printf("\n作业%s正在运行,估计其运行情况:
\n",q->name);
printf("开始运行时刻:
%d\n",q->starttime);
printf("完成时刻:
%d\n",q->finishtime);
printf("周转时间:
%f\n",q->cycletime);
printf("带权周转时间:
%f\n",q->cltime);
getch();
}
}
voidrunning(JCB*p,intm)//运行作业
{
if(p==ready)//先将要运行的作业从队列中分离出来
{
ready=p->next;
p->next=NULL;
}
else
{
q=ready;
while(q->next!
=p)q=q->next;
q->next=p->next;
}
p->starttime=times;//计算作业运行后的完成时间,周转时间等等
p->state='R';
p->finishtime=p->starttime+p->needtime;
p->cycletime=(float)(p->finishtime-p->reachtime);
p->cltime=(float)(p->cycletime/p->needtime);
T1+=p->cycletime;
T2+=p->cltime;
disp(p,m);//调用disp()函数,显示作业运行情况
times+=p->needtime;
p->state='F';
printf("\n%shasbeenfinished!
\npressanykeytocontinue...\n",p->name);
free(p);//释放运行后的作业
getch();
}
voidsuper()//计算队列中作业的高响应比
{
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);
}
voidfinal()//最后打印作业的平均周转时间,平均带权周转时间
{
floats,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);
}
voidhrn(intm)//高响应比算法
{
JCB*min;
inti,iden;
system("cls");
inital();
for(i=0;i{
p=min=ready;iden=1;
super();
do{
if(p->state=='W'&&p->reachtime<=times)
if(iden)
{
min=p;iden=0;
}
elseif(p->super>min->super)min=p;
p=p->next;
}while(p!
=NULL);
if(iden)
{
i--;times++;
//printf("\ntime=%d:
\tnoJCBsubmib...wait...",time);
if(times>1000)
{printf("\nruntimeistoolong...error...");getch();}
}
else
{
running(min,m);//调用running()函数
}
}//for
final();//调用running()函数
}
voidsjf(intm)//最短作业优先算法
{
JCB*min;
inti,iden;
system("cls");
inital();
for(i=0;i{
p=min=ready;iden=1;
do{
if(p->state=='W'&&p->reachtime<=times)
if(iden){
min=p;iden=0;
}
elseif(p->needtimeneedtime)min=p;
p=p->next;
}while(p!
=NULL);
if(iden){
i--;//printf("\ntime=%d:
\tnoJCBsubmib...wait...",time);
times++;
if(times>100){printf("\nruntimeistoolong...error");getch();}
}
else{
running(min,m);//调用running()函数
}
}//for
final();//调用running()函数
}
voidfcfs(intm)//先来先服务算法
{
inti,iden;
system("cls");
inital();
for(i=0;i{
p=ready;iden=1;
do{
if(p->state=='W'&&p->reachtime<=times)iden=0;
if(iden)p=p->next;
}while(p!
=NULL&&iden);
if(iden)
{
i--;
printf("\n没有满足要求的进程,需等待");
times++;
if(times>100){printf("\n时间过长");getch();}
}
else{
running(p,m);//调用running()函数
}
}
final();//调用running()函数
}
voidmune()
{
intm;
system("cls");
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t作业调度演示\n");
printf("\t\t*********************************************\t\t\n");
printf("\n\n\n\t\t\t1.先来先服务算法.");
printf("\n\t\t\t2.最短作业优先算法.");
printf("\n\t\t\t3.响应比高者优先算法");
printf("\n\t\t\t0.退出程序.");
printf("\n\n\t\t\t\t选择所要操作:
");
scanf("%d",&m);
switch(m)
{
case1:
fcfs(m);
getch();
system("cls");
mune();
break;
case2:
sjf(m);
getch();
system("cls");
mune();
break;
case3:
hrn(m);
getch();
system("cls");
mune();
break;
case0:
system("cls");
break;
default:
printf("选择错误,重新选择.");
getch();
system("cls");
mune();
}
}
main()//主函数
{
inize();
mune();
}
参考文献
[1]汤子赢,哲凤屏,汤小丹.计算机操作系统(修订版)[M].西安:
西安电子科技大学出版社,2006.3:
70—79
[2]屠立德.操作系统基础(第三版)[M].北京:
清华大学出版社,2000.6:
67-78
[3]杨振山,龚培增.计算机操作系统教程(第3版)[M].北京:
清华大学出版社,2007.9:
88-93
[4]谭浩强.C程序设计[M].北京:
清华大学出版社,2007.124-2:
125
[5]王敬华,林萍等.C语言程序设计教程[M].北京:
清华大学出版社,2006.3:
97—156
Welcome!
!
!
欢迎您的下载,
资料仅供参考!