实验二作业调度模拟程序.docx
- 文档编号:11274063
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:14
- 大小:161.64KB
实验二作业调度模拟程序.docx
《实验二作业调度模拟程序.docx》由会员分享,可在线阅读,更多相关《实验二作业调度模拟程序.docx(14页珍藏版)》请在冰豆网上搜索。
实验二作业调度模拟程序
实验二作业调度模拟程序
专业:
08信息管理与信息系统
姓名:
黄赞润
学号:
200806054113
一、实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。
作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。
总是首先调度在系统中等待时间最长的作业。
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:
作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。
每个作业的最初状态都是等待W。
一、模拟数据的生成
1.允许用户指定作业的个数(2-24),默认值为5。
2.允许用户选择输入每个作业的到达时间和所需运行时间。
3.(**)从文件中读入以上数据。
4.(**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。
二、模拟程序的功能
1.按照模拟数据的到达时间和所需运行时间,执行FCFS,SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间。
2.动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。
3.(**)允许用户在模拟过程中提交新作业。
4.(**)编写并调度一个多道程序系统的作业调度模拟程序。
只要求作业调度算法:
采用基于先来先服务的调度算法。
对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
三、模拟数据结果分析
1.对同一个模拟数据各算法的平均周转时间,平均带权周转时间比较。
2.(**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。
四、其他要求
1.完成报告书,内容完整,规格规范。
三、实验方法、步骤及结果测试
1.源程序名:
压缩包文件(zip)中源程序名run.c
可执行程序名:
run.exe
2.原理分析及流程图
程序主要为带指针的结构体存储
structjcb
{
charname[10];
intartime;/*到达shijian*/
intrqtime;/*服务*/
intsttime;/*调度*/
intfntime;/*完成*/
floattat;/*周转*/
floattaw;/*带权*/
floatr;/*优先权*/
charstatut;/*状态*/
structjcb*link;/*结构体指针*/,调用相关功能的子函数,实现程序!
流程图:
voidstart()//输入作业数和选择作业方式,调用input和run子函数
voidinput()//子程序--输入作业数据
voidrun(intm)//开始运算,通过for(i=0;i 判断到达且状态为未到达的作业。 并把状态转为到达,然后通过switch对M进行判断选择,m=1调用fcfs,m=2为sjf,m=3调用hrn。 WN*fcfs(intm)//对作业进行排序。 返回指针*t WN*sjf(intm)//对作业要求时间进行由小到大排序,返回*min WN*hrn(intm)//调用jisuanr,计算权值,然后对作业优先权值进行由小到大排序,返回*min voidjisuanr()//计算作业优先权值。 running(WN*p,intm)//将FCFS的*p或者SJF和HRN的*min传递到running,然后进行A状态转换到R状态,计算调用时间等。 voidprint(intm)//输出各状态作业。 voidprint2(WN*pr,intm)//输出最后结果 voidlast()//计算平均TAT平均TAW main()//主函数 { start(); last(); printf("\n结束\n"); getchar(); getchar(); } 算法实现: 存储结构为带指针的结构体, 关键函数: 包括三种作业调度方式。 与关于作业数的总循环。 主要算法实现: 通过do{}while();函数做关于指针的遍历循环,通过子函数调用,实现程序逻辑。 3.主要程序段及其解释: 首先通过structjcb{};定义带指针结构体,主函数只有main() { start(); last(); printf("结束"); } 其他由子函数相互调用实现。 通过for(i=0;i 通过do{ if(p->statut=='u'&&p->artime<=time) { p->statut='a'; p=p->link; iden=0; } else p=p->link; }while(p! =NULL); 对已经到达的作业进行从’U’(未到达)到’A’(到达)状态转化,其中iden为标记是否有作业到达,为1的话则表示无作业到达,执行 if(iden) { i--; time++; } 直到有作业到达,iden变为0 通过switch(m) { case1: p=fcfs(m);/*running*/ running(p,m); break; case2: min=sjf(m);/*running*/ running(min,m); break; case3: min=hrn(m);/*running*/ running(min,m); break; } 实现选择调度方式,并通过running子函数运行作业,其中min皆为由子函数调回的最短作业指针和最小权值指针。 通过voidjisuanr()/*计算优先权值*/ { 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,intm)运行作业并计算 { 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->taw; print(p,m); p->statut='f';/*r->f*/ time=p->rqtime+time; printf("按回车继续"); getch(); } 其中有A到R(运行中)和R到F(完成)的状态转化。 通过voidprint2(WN*pr,intm) { p=head;/*完成*/ printf("\n\n系统时间为=%d",time); printf("\n全部作业已经完成: \n"); do{ if(p->statut=='f') { if(m==3){ printf("%s\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\t%f\n", p->name,p->artime,p->rqtime,p->sttime,p->fntime,p->tat,p->taw,p->r); } else{ printf("%s\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\t%f\n", 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语言知识,可以说是第一次用很多零碎的知识拼凑成一个程序,一个月的时间让我懂得如何去编程,事先有正确的逻辑,流程图和伪代码成为必须的工具,之前那种想到什么编什么的方式已经不适用。 虽然这次实验有参照有关程序,但还是靠自己一步一步探索做出来了,也克服了对指针和子函数迷漫,也克服了长程序无从下手的恐惧感,实验最后顺利完成!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 作业 调度 模拟 程序