1、实验二作业调度模拟程序实验二 作业调度模拟程序 专业:08信息管理与信息系统姓名:黄赞润 学号:200806054113一、 实验目的 (1)加深对作业调度算法的理解;(2)进行程序设计的训练。二、 实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序。单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。 作业调度算法:采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。每个作业由一个作业控制块JCB表示,JCB可以包含以下信
2、息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。一、 模拟数据的生成1 允许用户指定作业的个数(2-24),默认值为5。2 允许用户选择输入每个作业的到达时间和所需运行时间。3 (*)从文件中读入以上数据。4 (*)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。二、 模拟程序的功能1 按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时
3、间,周转时间和带权周转时间。2 动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。3 (*)允许用户在模拟过程中提交新作业。4 (*)编写并调度一个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采用基于先来先服务的调度算法。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。三、 模拟数据结果分析1 对同一个模拟数据各算法的平均周转时间,平均带权周转时间比较。2 (*)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。四、
4、其他要求1 完成报告书,内容完整,规格规范。三、 实验方法、步骤及结果测试1. 源程序名:压缩包文件(zip)中源程序名 run.c可执行程序名:run.exe2. 原理分析及流程图程序主要为带指针的结构体存储struct jcb char name10; int artime;/*到达shijian*/ int rqtime;/*服务*/ int sttime;/*调度*/ int fntime;/*完成*/ float tat;/*周转*/ float taw;/*带权*/ float r;/*优先权*/ char statut;/*状态*/ struct jcb *link;/*结构体指
5、针*/,调用相关功能的子函数,实现程序!流程图: void start()/输入作业数和选择作业方式,调用input和run子函数void input()/子程序-输入作业数据void run(int m)/ 开始运算,通过for(i=0;in;i+)循环,其中n为作业数。判断到达且状态为未到达的作业。并把状态转为到达,然后通过switch对M进行判断选择,m1调用fcfs,m2为sjf,m3调用hrn。 WN* fcfs(int m)/ 对作业进行排序。返回指针*tWN* sjf(int m)/ /对作业要求时间进行由小到大排序,返回*minWN* hrn(int m) / 调用jisuan
6、r,计算权值,然后对作业优先权值进行由小到大排序,返回*minvoid jisuanr()/ 计算作业优先权值。running(WN *p,int m)/ 将FCFS的*p或者SJF 和HRN的*min传递到running,然后进行A状态转换到R状态,计算调用时间等。void print(int m)/ 输出各状态作业。void print2(WN *pr,int m)/ 输出最后结果void last()/ 计算平均TAT 平均TAWmain()/ 主函数 start(); last(); printf(n结束n); getchar(); getchar(); 算法实现:存储结构为带指针的结
7、构体,关键函数:包括三种作业调度方式。与关于作业数的总循环。主要算法实现:通过dowhile();函数做关于指针的遍历循环,通过子函数调用,实现程序逻辑。 3. 主要程序段及其解释:首先通过struct jcb ;定义带指针结构体,主函数只有main() start(); last(); printf(结束);其他由子函数相互调用实现。通过 for(i=0;istatut=u&p-artimestatut=a; p=p-link; iden=0; else p=p-link ; while(p!=NULL);对已经到达的作业进行从U(未到达)到A(到达)状态转化,其中iden为标记是否有作业到
8、达,为1的话则表示无作业到达,执行 if(iden) i-; time+; 直到有作业到达,iden变为0通过 switch(m) case 1: p=fcfs(m);/*running*/ running(p,m); break; case 2: min=sjf(m);/*running*/ running(min,m); break; case 3: min=hrn(m);/*running*/ running(min,m); break; 实现选择调度方式,并通过running子函数运行作业,其中min皆为由子函数调回的最短作业指针和最小权值指针。 通过void jisuanr()/*计
9、算优先权值*/ WN *s; s=head; do if(s-statut=a) s-r=(float)(time-s-artime+s-rqtime)/s-rqtime ; s=s-link ; while(s!=NULL);通过running(WN *p,int m) 运行作业并计算 p-sttime=time; p-statut=r; /*a-r*/ p-fntime=p-sttime+p-rqtime; p-tat=(float)p-fntime-p-artime; p-taw=(float)p-tat/p-rqtime; atat=atat+p-tat; ataw=ataw+p-ta
10、w; print(p,m); p-statut=f; /*r-f*/ time = p-rqtime+time; printf(按回车继续); getch(); 其中有A到R(运行中)和R到F(完成)的状态转化。 通过void print2(WN *pr,int m) p = head;/*完成*/ printf(nn系统时间为=%d, time); printf(n全部作业已经完成:n); do if(p-statut = f) if(m = 3) printf(%st%dt%dt%dt%dt%4.2ft%4.2ft%fn, p-name, p-artime , p-rqtime , p-s
11、ttime , p-fntime, p-tat, p-taw, p-r); else printf(%st%dt%dt%dt%dt%4.2ft%4.2ft%fn, p-name, p-artime , p-rqtime , p-sttime , p-fntime, p-tat, p-taw); p = p-link; while( p != NULL );输出全部作业!4. 运行结果及分析 测试1:调度方式的选择!FCFS的结果(与SJF一样)测试2方式为FCFS结果为方式为SJF结果为方式为HRN结果为自测:数据如上,方式为FCFS结果为数据如上,方式为SJF结果为数据如上,方式为HRN结果为 结果与预想符合,结论:程序能正常运行,且结果正确! 四、 实验总结这次实验让我从所未有的累,这是一个几乎结合了之前关于C语言知识,可以说是第一次用很多零碎的知识拼凑成一个程序,一个月的时间让我懂得如何去编程,事先有正确的逻辑,流程图和伪代码成为必须的工具,之前那种想到什么编什么的方式已经不适用。虽然这次实验有参照有关程序,但还是靠自己一步一步探索做出来了,也克服了对指针和子函数迷漫,也克服了长程序无从下手的恐惧感,实验最后顺利完成!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1