作业调度实验报告.doc

上传人:牧羊曲112 文档编号:2773309 上传时间:2023-02-24 格式:DOC 页数:29 大小:382KB
返回 下载 相关 举报
作业调度实验报告.doc_第1页
第1页 / 共29页
作业调度实验报告.doc_第2页
第2页 / 共29页
作业调度实验报告.doc_第3页
第3页 / 共29页
作业调度实验报告.doc_第4页
第4页 / 共29页
作业调度实验报告.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《作业调度实验报告.doc》由会员分享,可在线阅读,更多相关《作业调度实验报告.doc(29页珍藏版)》请在三一办公上搜索。

1、精选优质文档-倾情为你奉上一、实验名称作业调度算法实验。二、实验目标已知n个作业的进入时间和估计运行时间(以分钟计)(1)单道环境下,分别用先来先服务调度算法、短作业优先调度算法、响应比高者优先调度算法,求出批作业的平均周转时间和带权平均周转时间; 在多道环境(如2道)下,求出这些作业的平均周转时间和带权平均周转时间(2)就同一批次作业,分别讨论这些算法的优劣;(3)衡量同一调度算法对不同作业流的性能。三、实验环境要求1.PC机。2.Windows环境。3.CodeBlocks四、实验基本原理 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。(2)最短作业优先算

2、法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。( 3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 (4)两道批处理系统中最短作业优先调度算法:内存中可以进入两个作业,这两个作业按照最短作业优先调度算法调整作业执行的次序。五、数据结构设计使用一维数组来保存多个作业Job job20;,采用的是顺序存储。使用queue q保存调度队列里的作业指针。struct Date/时间结构体 int hour;/时间的小时 int minute;/时间的分钟; struct Jcb/作业结构体,用来描述作

3、业 int no;/作业编号 Date enter;/进入时间 int operation;/估计运行时间 Date start;/开始时间 Date over;/结束时间 int turnover;/周转时间 double weighted;/带权周转时间 int state=0;/标记改作业是否进入运行状态;六、流程图单道环境下算法流程图多道环境下的两道批处理系统中最短作业优先作业调度算法的流程图。七、源代码 #include#include#include#include#includeusing namespace std;struct Date/时间结构体 int hour;/时间的

4、小时 int minute;/时间的分钟;struct Jcb/作业结构体,用来描述作业 int no;/作业编号 Date enter;/进入时间 int operation;/估计运行时间 Date start;/开始时间 Date over;/结束时间 int turnover;/周转时间 double weighted;/带权周转时间 int state=0;/标记改作业是否进入运行状态;/函数声明void display(Jcb J,int n);/输出void runing( queue q,int n);/根据算法将就绪队列排好队后的单道作业的运行主体void fcfs( Jcb

5、 J,int n);/先来先服务作业调度void sfc(Jcb J,int n);/最短作业优先作业调度void hrfc(Jcb J,int n);/最高响应比作业调度void text(void (*dispatch)(Jcb J, int n),Jcb J,int n,Jcb J1,int n1, Jcb J2,int n2);/测试单道环境,不同批次作业,相同算法void mulfc(Jcb J,int n);/两道环境,内存中可以用两个作业,内存中的这两个作业按照作业长短调整作业执行的次序。/主函数,(1)同一批次作业,分别用先来先服务调度算法、短作业优先调度算法、响应比高者优先调

6、度算法,得到批作业的平均周转时间和带权平均周转时间;(2)同一调度算法对不同作业流的调度。int main() int n,n1,n2; Jcb job20,job120,job220; FILE*p=fopen(example1.txt, r); fscanf(p, %d, &n); /批次一作业 for(int i=0;in;i+) jobi.no=i+1; fscanf(p, %d%d%d, &jobi.enter.hour, &jobi.enter.minute, &jobi.operation); /批次二作业 fscanf(p, %d, &n1); for(int i=0;in1;

7、i+) job1i.no=i+1; fscanf(p, %d%d%d, &job1i.enter.hour, &job1i.enter.minute, &job1i.operation); /批次三作业 fscanf(p, %d, &n2); for(int i=0;in2;i+) job2i.no=i+1; fscanf(p, %d%d%d, &job2i.enter.hour, &job2i.enter.minute, &job2i.operation); fclose(p); printf(n-单道环境,同一批次作业,不同算法-n); cout先来先服务作业调度:endl; fcfs(j

8、ob,n); cout最短时间优先服务作业调度:endl; sfc(job,n); cout最高响应比优先作业调度算法endl;hrfc(job,n);printf(nn);printf(-单道环境,不同批次作业,同一算法-n);cout.先来先服务作业调度.endl;text(fcfs, job,n,job1,n1,job2,n2);cout.最短优先服务作业调度.endl;text(sfc, job,n,job1,n1,job2,n2);cout.最高响应比优先服务作业调度:.endl;text(hrfc, job,n,job1,n1,job2,n2);printf(-两道环境-n);mu

9、lfc(job1,n);printf(-n); return 0;/单道环境,不同批次作业,同一算法void text(void (*dispatch)(Jcb J, int n),Jcb J,int n,Jcb J1,int n1, Jcb J2,int n2)/单道环境,不同批次作业,同一算法 cout批次一作业:endl; dispatch(J,n); cout批次二作业:endl; dispatch(J1,n1); cout批次三作业:endl; dispatch(J2,n2);/输出void display(Jcb J,int n) double T=0,W=0; printf( 作

10、业 进入时间 估计运行时间(分钟) 开始时间 结束时间 周转时间(分钟) 带权周转时间n); for(int i=0;in;i+) Ji.turnover=(Ji.over.hour*60 + Ji.over.minute)-(Ji.enter.hour*60+Ji.enter.minute); T+=Ji.turnover; Ji.weighted=Ji.turnover/(double)Ji.operation; W+=Ji.weighted; printf(Job%2dt %2d:%02dt %-14dt %2d:%02dt %2d:%02dt %-6dt%-5.2ftn, Ji.no,

11、Ji.enter.hour, Ji.enter.minute,Ji.operation, Ji.start.hour, Ji.start.minute,Ji.over.hour, Ji.over.minute, Ji.turnover,Ji.weighted ); T/=n; W/=n; printf(作业平均周转时间 T=%.2lf 分钟n, T); printf(作业带权平均周转时间 W=%.3lfnnn,W);/根据算法将就绪队列排好队后的单道作业的运行主体void runing( queue q,int n) Jcb *j; int h,m; j=q.front(); h=j-ente

12、r.hour; m=j-enter.minute; while (!q.empty() j=q.front(); q.pop(); j-start.hour=h; j-start.minute=m; j-over.hour=j-start.hour+(j-start.minute+j-operation)/60; j-over.minute=(j-start.minute+j-operation)%60; j-turnover=(j-over.hour*60 + j-over.minute)-(j-enter.hour*60+j-enter.minute); j-weighted=j-turn

13、over/(double)j-operation; h=j-over.hour; m=j-over.minute; / display(J,t);/最高响应比优先作业调度算法void hrfc(Jcb J,int n)/最高响应比优先作业调度算法queue qjob; int flag20; for(int j=0;jn;j+) flagj=0; qjob.push(&J0); double wait=J0.operation+J0.enter.hour*60+J0.enter.minute;/记录作业流已经执行的时间 int t=n-1; flag0=1; while(t) int i=1;

14、 while(flagi) i+; for(int j=i; jwait) break;/如果这个作业还没来到,则停止继续比较,只考虑已经进入就绪队列的作业 if(flagj=0 ) double waiti=wait-Ji.enter.hour*60-Ji.enter.minute;/作业Ji的等待时间 double waitj=wait-Jj.enter.hour*60-Jj.enter.minute; if(waiti/Ji.operation)(waitj/Jj.operation) i=j; qjob.push(&Ji); flagi=1; wait+=Ji.operation; t

15、-; runing(qjob,n); display(J,n);void fcfs( Jcb J,int n)/先来先服务作业调度算法 queue qjob; for(int i=0;in;i+) qjob.push(&Ji); runing(qjob,n); display(J,n);/最短作业优先作业调度算法void sfc(Jcb J,int n)/最短作业优先作业调度算法 queue qjob; qjob.push(&J0); int time=J0.enter.hour*60+J0.enter.minute+J0.operation;/上一个作业的结束时间 J0.state=1; i

16、nt t=n-1; while(t) int i=1; while(Ji.state) i+; for(int j=i;jtime) break;/如果这个作业还没来到,则停止继续比较,只考虑已经进入就绪队列的作业 if(Jj.state=0 & (Ji.operationJj.operation) i=j; qjob.push(&Ji); Ji.state=1; time+=Ji.operation; t-; runing(qjob,n);display(J,n);/两道环境,内存中可以用两个作业,内存中的这两个作业按照作业void mulfc(Jcb J,int n)/两道环境,内存中可以

17、用两个作业,内存中的这两个作业按照作业长短调整作业执行的次序。/至少有两个作业。 cout两道批处理系统中最短作业优先作业调度算法endl; int op20; int i,work1=-1,work2=-1;/work1是先开始执行的作业,work2是后来进入内存的作业 for(i=0;in;i+) opi=Ji.operation; Ji.state=0; work1=0; J0.state=1; J0.start.hour=J0.enter.hour; J0.start.minute=J0.enter.minute; work2=1; int h=J0.enter.hour; int m

18、=J0.enter.minute; int work=work1; int time; int t=2; while(tJwork2.operation) /第二个work2进入内存的作业的执行时间短于work1,就暂停执行work1,转而执行work2. opwork1+=Jwork2.operation; if(t=2) /第二个进入内存的,且运行时间较已在内存中的短,则作业开始时间为进入的时间 Jwork2.start.hour=Jwork2.enter.hour; Jwork2.start.minute=Jwork2.enter.minute; else /从第三个进入内存的作业,且执

19、行时间比当前在内存中的执行时间短,则开始时间为上一个作业的结束时间 Jwork2.start.hour=h; Jwork2.start.minute=m; Jwork2.over.hour=Jwork2.start.hour+(Jwork2.start.minute+opwork2)/60; Jwork2.over.minute=(Jwork2.start.minute+opwork2)%60; h=Jwork2.over.hour; m=Jwork2.over.minute; time=h*60+m; work2=-1;/改作业执行完毕 else /第二个work2进入内存的作业的执行时间较

20、长,所以仍然执行开始就在内存的作业work1,知道work1执行完毕 Jwork1.over.hour=Jwork1.start.hour+(Jwork1.start.minute+opwork1)/60; Jwork1.over.minute=(Jwork1.start.minute+opwork1)%60; h=Jwork2.over.hour; m=Jwork2.over.minute; time=h*60+m; Jwork2.start.hour=h; Jwork2.start.minute=m; work1=work2; work2=-1; int w; int i=1; while

21、(Ji.state=1) i+; w=i;for(int j=w; jtime) break;/如果这个作业还没来到,则停止继续比较,只考虑已经进入就绪队列的作业if(Jj.state=0 & (Jw.operation Jj.operation)w=j; work2=w;/第二个进入内存的作业 t+; Jwork2.state=1; /最后剩下work1作业 Jwork1.over.hour=Jwork1.start.hour+(Jwork1.start.minute+opwork1)/60; Jwork1.over.minute=(Jwork1.start.minute+opwork1)%

22、60; display(J,n);八、实验结果 (1)在单道环境下,已知n个作业的进入时间和估计运行时间(以分钟计),得到的每一个作业的开始时间、结束时间、周转时间、带权周转时间,以及这些作业的平均周转时间和带权平均周转时间;(2)同一调度算法对不同作业流的性能,每个算法有三个测试作业流 先来先服务作业调度最短优先服务作业调度 最高响应比优先服务作业调度(3)在2道环境下,已知n个作业的进入时间和估计运行时间(以分钟计),得到的每一个作业的开始时间、结束时间、周转时间、带权周转时间,以及这些作业的平均周转时间和带权平均周转时间。九、结果分析(1)单道环境下,对于批次一作业流。先来先服务的作业调

23、度的作业平均周转时间T=112.5分钟最短作业优先服务作业调度的作业平均周转时间T=90分钟最高相应比优先服务作业调度的作业平均周转时间T=102.5分钟.可见对于批次一作业,最短作业优先作业调度算法效率最高。(2)单道环境下。2.1对于3个不同批次作业,先来先服务的作业调度批次一,作业带权平均周转时间 W=4.975批次二,作业带权平均周转时间 W=4.188批次三,作业带权平均周转时间 W=2.433可见,先来先服务的作业调度,对于批次三作业的效率最高。2.2对于3个不同批次作业,最短优先服务的作业调度批次一,作业带权平均周转时间 W=4.975批次二,作业带权平均周转时间 W=2.875

24、批次三,作业带权平均周转时间 W=2.317可见,最短优先服务的作业调度,对于批次三作业的效率最高。2.3对于3个不同批次作业,最高响应比优先服务的作业调度批次一,作业带权平均周转时间 W=3.775批次二,作业带权平均周转时间 W=3.250批次三,作业带权平均周转时间 W=2.317可见,最高响应比优先服务的作业调度,对于批次二作业的效率最高十、本次实验体会1. 先来先服务的作业调度,实现最简单。2. 对于同批次作业,最短作业的效率最高。3. 最高响应比优先作业调度,既照顾了短作业,又照顾了作业到来的顺序,不会使长作业长期得不到运行,但是每次调度下一个作业前要计算剩余到来作业的响应比,增加

25、了系统的开销。4. 两道批处理系统中最短作业优先作业调度算法,在实现时,我默认为作业之间没有时间空余,默认在处理一个作业流时处理器一直处于运行状态。所以代码有漏洞,考虑的也不是很全面。5.开始时对作业调度不是很那么地清晰,通过做这个实验,现在对操作系统的作业调度有了清晰的理解,感觉在这个过程中自己就是充当了调度员的角色。开始写好的代码比较繁杂,于是写了display 和running函数来简化代码。6. 最初忽略了作业的进入时间问题,和同学讨论了一下,意见不太一致,但我觉得这个问题是应该考虑的。7. 实验代码修改了好多次,一些细小的问题,如输入、输出和如何简化代码等比较耗费时间。通过这个实验,发现自己的CC+功底太差了,做实验时可谓是边做边翻书。通过这个实验,也回顾了一下CC+的一些基础知识。十一、参考资料 (1) 郭浩志 计算机软件实践教程 西安电子科技大学出版社 (2) 庞丽萍 计算机操作系统 华中科技大学出版社专心-专注-专业

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号