作业调度实验报告

上传人:xt****7 文档编号:113263717 上传时间:2022-06-24 格式:DOC 页数:19 大小:155.50KB
收藏 版权申诉 举报 下载
作业调度实验报告_第1页
第1页 / 共19页
作业调度实验报告_第2页
第2页 / 共19页
作业调度实验报告_第3页
第3页 / 共19页
资源描述:

《作业调度实验报告》由会员分享,可在线阅读,更多相关《作业调度实验报告(19页珍藏版)》请在装配图网上搜索。

1、实验二 作业调度 一. 实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。(3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。作业调度算法:采用基于先来先服务的调度算法。可以参考课

2、本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。二. 实验目的:本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三 .实验过程 单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: zuoye.exe 2)实验分析:1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。2、每个作业由一个作业控制块

3、JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 3)流程图:代替 二.最短作业优先算法代替 三.高响应比算法图一.先来先服务流程图4)源程序: #include #include #include #define getpch(type) (type*)malloc(sizeof(type)

4、 #define NULL 0int n;float T1=0,T2=0;int times=0;struct jcb /作业控制块 char name10; /作业名 int reachtime; /作业到达时间 int starttime; /作业开始时间 int needtime; /作业需要运行的时间 float super; /作业的响应比 int finishtime; /作业完成时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*ready=N

5、ULL,*p,*q;typedef struct jcb JCB; void inize() /初始化界面 printf(nntt*ttn); printf(tttt实验二 作业调度n); printf(tt*ttn); printf(nnnttttt计算机学院软件四班n); printf(ttttt蓝小花n); printf(ttttt3204007102n); printf(ttttt完成日期:2006年11月17号); printf(nnntt请输入任意键进入演示过程n); getch();void inital() /建立作业控制块队列,先将其排成先来先服务的模式队列int i;pri

6、ntf(n输入作业数:);scanf(%d,&n);for(i=0;iname); 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; void disp(JCB* q,int m) /显示作业运行后的周转时间及带权周转时间等 if(m=3) /显示高响应比算法调度作业后的运行情况 printf(n作业%s正在运行,估计其运行

7、情况:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cltime); printf(相应比:%fn,q-super); getch(); else / 显示先来先服务,最短作业优先算法调度后作业的运行情况 printf(n作业%s正在运行,估计其运行情况:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime

8、); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cltime); getch(); void running(JCB *p,int m) /运行作业 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-needt

9、ime; 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%s has been finished!npress any key to continue.n,p-name); free(p); /释放运行后的作业 getch();void super() /计算队列中

10、作业的高响应比 JCB *padv; padv=ready; do if(padv-state=W&padv-reachtimesuper=(float)(times-padv-reachtime+padv-needtime)/padv-needtime padv=padv-next; while(padv!=NULL);void final() /最后打印作业的平均周转时间,平均带权周转时间 float s,t; t=T1/n; s=T2/n; getch(); printf(nn作业已经全部完成!); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业

11、的平均带权周转时间是%f:nnn,n,s); void hrn(int m) /高响应比算法 JCB *min; int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimesupermin-super) min=p; p=p-next; while(p!=NULL); if(iden) i-;times+; /printf(ntime=%d:tno JCB submib.wait.,time); if(times1000)printf(nruntime is too long.error.);getch(); else run

12、ning(min,m); /调用running()函数 /for final(); /调用running()函数void sjf(int m) / 最短作业优先算法 JCB *min; int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimeneedtimeneedtime) min=p; p=p-next; while(p!=NULL) ; if(iden) i-; /printf(ntime=%d:tno JCB submib.wait.,time); times+; if(times100)printf(nruntim

13、e is too long.error);getch(); else running(min,m); /调用running()函数 /for final(); /调用running()函数void fcfs(int m) /先来先服务算法 int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimenext; while(p!=NULL&iden) ; if(iden) i-; printf(n没有满足要求的进程,需等待); times+; if(times100)printf(n时间过长);getch(); else runn

14、ing(p,m); /调用running()函数 final(); /调用running()函数void mune() int m; system(cls); printf(nntt*ttn); printf(tttt作业调度演示n); printf(tt*ttn); printf(nnnttt1.先来先服务算法.); printf(nttt2.最短作业优先算法.); printf(nttt3.响应比高者优先算法); printf(nttt0.退出程序.); printf(nntttt选择所要操作:); scanf(%d,&m);switch(m) case 1: fcfs(m); getch

15、(); system(cls); mune(); break; case 2: sjf(m); getch(); system(cls); mune(); break; case 3: hrn(m); getch(); system(cls); mune(); break; case 0: system(cls); break; default: printf(选择错误,重新选择.); getch(); system(cls); mune(); main() /主函数 inize(); mune();5)调试结果: 1.选择操作的界面 2.输入操作初始信息: 3.先来先服务算法作业调度结果:

16、(调度顺序:a-b-c-d-e) 4.最短作业优先算法作业调度结果 (调度顺序: a-d-b-e-c) 5.高响应比算法作业调度结果: (调度顺序 a-b-d-c-e) 多道处理系统作业调度1)多道处理程序作业调度实验的源程序: duodao.c 执行程序: duodao.exe 2)实验分析:采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。作业调度从系统已接纳的暂存在输入井中的一批作业中挑选出若干个可运行的作业,并为这些被选中的作业分配所需的系统资源。对被选中运行的作业必须按照它们各自的作业说明书规定的步骤进行控制。采用先来先服务算法算法模拟设计作业调度程序

17、。(1)、作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。先来先服务算法是按照作业进入输入井的先后次序来挑选作业,先进入输入井的作业优先被挑选,当系统中现有的尚未分配的资源不能满足先进入输入井的作业时,那么顺序挑选后面的作业。(2) 假定某系统可供用户使用的主存空间共100k,并有5台磁带机。3)流程图: 4)源

18、程序: #include #include #include #define getpch(type) (type*)malloc(sizeof(type)#define NULL 0 int j=0;int n,i; /n为需要输入的作业数量float T1=0,T2=0; /初始化周转时间,带权周转时间.int times=0; /初始化开始运行时间int freesa=100,disksa=5; /预定内存的大小为100k,磁带数量为5个.struct jcb /作业控制块 char username10; /用户名 char name10; /作业名 int reachtime; /作

19、业到达时间 int starttime; /作业开始时间 int runtime; /已经运行了的时间 int needtime; /作业需要运行的时间 int frees; /作业要占用的内存 int disks; /作业所需磁带 int finishtime; /作业完成时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*ready=NULL,*start=NULL,*p,*q,*r,*s,*t;typedef struct jcb JCB;void i

20、nital() /建立作业控制块队列,先将其排成先来先服务的模式队列int i;printf(n输入作业数:);scanf(%d,&n);for(i=0;iusername); printf(输入作业名:); scanf(%s,p-name); getch(); p-reachtime=i; printf(作业默认到达时间:%d,i); printf(n输入作业要运行的时间:); scanf(%d,&p-needtime); printf(输入作业运行要占用的内存:); scanf(%d,&p-frees); printf(输入作业运行所需磁带:); scanf(%d,&p-disks); p

21、-runtime=0; p-state=W; p-next=NULL; if(ready=NULL) ready=q=p;/先将其按到达的先后顺序排成后备序列 else q-next=p; q=p; int space() /计算内存中作业的个数int l=0; JCB* pr=start;while(pr!=NULL)l+;pr=pr-next;return(l);void apply() /把符合条件的作业调用内存,并给他们分配资源, int len; p=ready; while(p!=NULL) if(p-freesdisksfrees; disksa-=p-disks; r=p; p

22、=p-next; if(r=ready) /先将符合条件的作业从队列中分离出来 ready=r-next; r-next=NULL; else q=ready; while(q-next!=r) q=q-next; q-next=r-next; if(start=NULL) start=s=r; / 将其插到start队列, else s-next=r; s=r; else p=p-next; len=space(); printf(nt此时有%d道作业在内存nn,len);void disp(JCB * pr) /*建立作业显示函数 */printf(|%st,pr-username);pr

23、intf(|%st,pr-name);printf(|%ct,pr-state);printf(|%dt,pr-reachtime);printf(|%dt,pr-needtime);printf(|%dt,pr-runtime); printf(|%dt,pr-frees); printf(|%dt,pr-disks);printf(n);void check() /显示作业状况 printf(n作业%s于完成%d个作业后运行完毕,其完成后的情况:,q-name,j); j+; printf(n用户名*作业名*状态*到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 n); disp(

24、q); s=start; printf(ntt*当前进入内存的作业状态*); printf(n用户名*作业名*状态*到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 n); while(s!=NULL) disp(s); s=s-next; r=ready; printf(*nntt*当前后备作业表中作业的状态*); printf(n用户名*作业名*状态*到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 n); while(r!=NULL) disp(r); r=r-next; void running() /运行作业 for(t=start;t!=NULL;) start=t

25、-next; q=t; q-next=NULL; q-state=R; q-runtime+; t=start; times+; if(q-runtime=q-needtime) q-finishtime=times; q-starttime=q-finishtime-q-needtime; q-cycletime=q-finishtime-q-reachtime; q-cltime=(q-cycletime)/(q-needtime); T1+=q-cycletime; T2+=q-cltime; freesa+=q-frees; disksa+=q-disks; check();/调用ch

26、eck()显示正在运行的,就绪的以及后备的作业信息 free(q); /释放作业 apply(); /分配作业 getch(); else for(s=start;s-next!=NULL;) s=s-next; s-next=q; main() /主函数 int m; printf(nntt*ttn); printf(tttt实验三(2) 多道作业调度n); printf(tt*ttn); printf(ntt1.多道作业调度演示.); printf(ntt0.退出程序); printf(nttt选择所要的操作:); printf(nnnttttt计算机学院软件四班n); printf(tt

27、ttt蓝小花n); printf(ttttt3204007102n); printf(ttttt完成日期:2006年12月); scanf(%d,&m); switch(m) case 1: system(cls); inital(); apply(); running(); getch(); system(cls); main(); break; case 0: system(cls); break; default: system(cls); main(); 5)调试结果: 1) 界面跟前面的其他几个实验的界面大同小异,这里就不在重复出现界面.下面输出的是作业的初始信息: 2)调度作业,此

28、时的作业情况如下:3)按回车键,相当于作业继续调度,如下: 4)重复3,直至作业运行结束;四.思考题:1.写出每种算法的调度策略,最后比较各种算法的优缺点。 答:FCFS算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。 优点:实现简单. 缺点:没考虑进程的优先级 SJF算法从就绪队列中选出“下一个CPU执行期”最短的进程,为之分配处理机。该算法虽可获得较好的调度性能,但难以准确地知道下一个CPU执行期,而只能根据每一个进行的执行历史来预测。 HRN算法既照顾了短作业,又照顾了作业顺序,不会使长作业长期得不到运行,但调度前,必须计算响应比,增加了系统的开销.2.选择调度算法的依据是什么?答:面向用户的准则:周转时间短;响应时间快;截止时间的保证;优先权准则面向系统的准则:系统吞吐量高;处理机利用率好;各类资源的平衡利用五.心得体会 每个人对作业调度的算法都存在着一定的理解,这也就是很多同学的算法实现不同的原因.可能是自己理解的不够透彻,我总觉得自己的实验不够完善,还有,可能是自己掌握c语言还不够深,总觉得自己的想法与实现的算法存在着很大差距.希望通过更多的实验,让自己有更大的提高.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!