单道批处理系统设计一个作业调度模拟程序.docx

上传人:b****6 文档编号:4435479 上传时间:2022-12-01 格式:DOCX 页数:27 大小:272.03KB
下载 相关 举报
单道批处理系统设计一个作业调度模拟程序.docx_第1页
第1页 / 共27页
单道批处理系统设计一个作业调度模拟程序.docx_第2页
第2页 / 共27页
单道批处理系统设计一个作业调度模拟程序.docx_第3页
第3页 / 共27页
单道批处理系统设计一个作业调度模拟程序.docx_第4页
第4页 / 共27页
单道批处理系统设计一个作业调度模拟程序.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

单道批处理系统设计一个作业调度模拟程序.docx

《单道批处理系统设计一个作业调度模拟程序.docx》由会员分享,可在线阅读,更多相关《单道批处理系统设计一个作业调度模拟程序.docx(27页珍藏版)》请在冰豆网上搜索。

单道批处理系统设计一个作业调度模拟程序.docx

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

 

操作系统

课程设计说明书

 

题目:

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

 

院系:

计算机科学与工程学院

专业班级:

计算机

学号:

学生姓名:

指导教师:

 

计算机科学与工程学院计算机科学与技术系

学号

学生姓名

专业(班级)

计算机09-3班

设计题目

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

使用MicrosoftVisualC++6.0编辑器编写,利用c语言开发的基于单道批处理系统的一个作业调度模拟程序,完成该课程设计需要掌握先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。

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

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

1.源代码程序不少于400行

2.附有各种图示4张

3.课程设计任务书不少于3500字

1.10月23日-10月28日:

查询相关资料,初步确定课程设计的语言,进一步明确其所要实现的功能

2.10月29日-11月10日:

根据所学知识及搜集的相关信息进行概要设计

3.11月11日-11月25日:

进行详细设计,完成相应源代码的编写

4.11月26日-12月2日:

对源代码进行调试、运行

5.12月3日-12月10日:

完善课程设计说明书并提交

[1]梁小丹,梁红兵,哲凤屏,汤子赢.计算机操作系统.第三版.西安:

西安电子科技大学出版社,2007.2

[2]袁捷、沈俊、袁晴晴.计算机操作系统基础与应用.第二版.北京:

清华大学出版社,2009.07

[3]杨振山、龚培增.计算机操作系统教程.第三版.北京:

清华大学出版社,2007.9

[4]谭浩强.C程序设计.第四版.北京:

清华大学出版社,2010.06

[5]王敬华,林萍,张清国等.C语言程序设计教程.第二版.北京:

清华大学出版社,2009.10

指导教师签字

系主任签字

2011年9月26日

学生姓名:

学号:

专业班级:

计算机09-3班

设计题目:

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

指导教师评语:

 

成绩:

指导教师:

年月日

安徽理工大学课程设计(论文)成绩评定表

摘要

本次课程设计要求用高级语言编写和调试一个单道批处理系统的作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。

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

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

关键词:

作业调度,先来先服务(FCFS),最短作业优先(SJF),响应比高者优先(HRN)

1.需求分析

1.1问题描述

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

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

比高者优先(HRN)的调度算法。

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

1.2功能分析及描述

在批处理系统中,作业进入系统后,先驻留在外存上,通过作业调度算法,将它们分批装入内存。

作业调度程序用于决定把外存上处于后备队列中的哪些作业调入内存,并为他们创建进程、分配必要的资源,然后,再将新创建的进程加入就绪队列中,准备执行。

应将哪些作业从外存调入内存,取决于所采用的调度算法。

最简单的是先来先服务调度算法,这是指讲最早进入外存的作业最先调入内存;较常用的一种是短作业优先调度算法,这是将外存上最短的作业最先调入内存;此外,还有基于响应比高者优先的调度算法,根据作业的等待时间和要求服务时间的和与要求服务时间之比可计算出响应比。

1.3开发语言选择

本课程设计采用C语言实现。

2.概要设计

2.1功能模块划分

根据功能描述,单道批处理程序作业调度的模拟程序要求实现如下功能:

建立作业、选择作业、运行作业、计算作业周转时间和带权周转时间,以及这组作业的平均周转时间和带权平均周转时间、显示运行结果(包括每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间等)、退出程序。

2.2功能模块的描述

各模块的功能介绍如下:

(1)建立作业:

输入作业数,建立一组作业,并对所建立的这组作业进行初始化,用以模拟作业调度。

初始化的内容包括作业名,作业要求运行的时间,其中,作业进入系统的时间由系统默认设置。

(2)选择作业:

程序通过先来先服务调度算法、短作业优先调度算法和高响应比优先调度算法对建立的一组作业进行选择,决定把哪个作业从外存调入内存中。

(3)运行作业:

根据初始化中设置的作业要求运行时间来模拟作业的运行。

(4)计算:

作业完成计算作业周转时间和带权周转时间,以及这组作业的平均周转时间和带权平均周转时间。

(5)显示结果:

将计算所得的结果输出。

(6)退出程序:

当实验结束,不再需要模拟作业调度的时候,用来退出程序。

2.3功能模块结构图示

作业调度模拟程序的系统功能结构如图2-1所示。

 

 

图2-1作业调度模拟程序系统功能结构图

 

3.详细设计

3.1作业控制块JCB的数据结构类型

由于在单道批处理系统中,不必考虑作业所需要的资源是否得到满足,它所占用的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;

3.2先来先服务算法设计

先来先服务算法:

按照作业提交给系统的先后顺序来挑选作业,先提交的先被执行。

流程图如图3-1所示。

 

 

图3-1先来先服务调度算法流程图

3.3最短作业优先算法设计

最短作业优先算法:

是以进入系统的作业所要求的服务时间为标准,总是优先选取执行时间最短的作业。

流程图如图3-2所示。

 

 

 

图3-2短作业优先调度算法流程图

3.4响应比高者优先算法设计

响应比高者优先算法:

是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。

流程图如图3-3所示。

 

图3-3响应比高者优先算法流程图

4.代码实现

4.1高响应比算法

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()函数

}

4.2最短作业优先算法

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()函数

}

4.3先来先服务算法

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()函数

}

 

5.运行结果与分析

5.1选择操作的界面

如图5-1所示。

图5-1选择操作的界面

5.2选择先来先服务算法进行作业调度

输入操作初始信息,建立一组作业,由4个作业组成,作业名分别为a,b,c,d。

如图5-2所示。

图5-2初始化

调度顺序为a→b→c→d。

运行结果如图5-3、图5-4、图5-5所示。

图5-3先来先服务算法调度图5-4先来先服务算法调度

图5-5先来先服务算法调度

5.3选择最短作业优先算法进行作业调度

调度顺序:

a→c→d→b。

运行结果如图5-6、图5-7、图5-8所示。

图5-6最短作业优先算法调度图5-7最短作业优先算法调度

 

图5-8最短作业优先算法调度

5.4选择高响应比优先算法进行作业调度

调度顺序:

a→c→b→d。

运行结果如图5-9、图5-10、图5-11所示。

图5-9响应比高者优先算法调度图5-10响应比高者优先算法调度

图5-11响应比高者优先算法调度

 

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;

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");

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1