作业调度算法模拟.docx
- 文档编号:9179185
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:13
- 大小:121.73KB
作业调度算法模拟.docx
《作业调度算法模拟.docx》由会员分享,可在线阅读,更多相关《作业调度算法模拟.docx(13页珍藏版)》请在冰豆网上搜索。
作业调度算法模拟
实验一作业调度算法模拟
姓名:
海日汗
学号:
**********
1概述
操作系统的作业调度算法主要有先来先服务(FIFO),短作业优先,最高响应比优先调度算法,基于优先数调度算法等等
2实验目的
模拟实现FIFO、短作业优先(sjf)和最高响应比优先作业调度算法
3实验要求
输入:
作业序列,即一系列要执行的作业,每个作业包括三个数据项:
作业号、作业进入系统的时间(用一整数表示,如10:
10,表示成1010)、估计执行时间(单位分)
参数用空格隔开,下面是示例:
180050
281530
383025
483520
584515
690010
79205
其中调度时刻为最后一个作业到达系统的时间。
4源代码
#include
usingnamespacestd;
structjob
{
charname[20];//作业名
intsubtime;//提交时间
intruntime;//运行时间
intstime;//开始时间
intftime;//完成时间
intztime;//周转时间
intwtime;//等待时间
doubledtime;//带权周转时间
doublerratio;//响应比
};
intflag=0;
doublesumztime,sumdtime;
doubleavgztime,avgdtime;
voidinput(job*p,intn);//输入
voidoutput(job*p,intn);//输出
voiddatahandle(job*p,intn);//数据处理
voidsort(job*p,intn);//按提交时间排序
voidfcfs(job*p,intn);//先来先服务
voidsjf(job*p,intn);//短作业优先
voidhrf(job*p,intn);//高响应比优先
intmain()
{
intn;
cout< cout<<"/**********操作系统实验一**************/"< cout<<"/**********作业调度算法***************/"< cout<<"/**********海日汗***********/"< cout<<"/**********2011年9月28日****/"< cout<<"输入作业数目: "; cin>>n; job*a=newjob[n]; input(a,n); fcfs(a,n); cout<<"\n"; sjf(a,n); cout<<"\n"; hrf(a,n); deletea; return0; } voidinput(job*p,intn) { cout<<"请输入作业信息: "< for(inti=0;i { cout<<"作业名: "; cin>>p[i].name; cout<<"提交时间: "; cin>>p[i].subtime; p[i].subtime=(p[i].subtime)/100*60+p[i].subtime%100; cout<<"运行时间: "; cin>>p[i].runtime; p[i].runtime=(p[i].runtime)/100*60+p[i].runtime%100; cout<<"\n"; } } voidoutput(job*p,intn) { cout<<"作业调度顺序: "; for(intk=0;k { cout< } cout<<"\n"; cout<<"name\t"<<"subtime\t"<<"runtime\t"<<"stime\t"<<"ftime\t"<<"ztime\t"<<"dtime\t"< for(inti=0;i { cout< cout< cout< cout< cout< cout<<(int)p[i].dtime/60*100+p[i].dtime-((int)p[i].dtime)/60*60< } cout<<"平均周转时间="< cout<<"平均带权周转时间="< } voidsort(job*p,intn) { for(inti=n-1;i>=1;i--) for(intj=0;j if(p[j].subtime>p[j+1].subtime) { jobtemp; temp=p[j]; p[j]=p[j+1]; p[j+1]=temp; } } voiddatahandle(job*p,intn) { sumztime=sumdtime=0; p[0].stime=p[0].subtime; p[0].ftime=p[0].subtime+p[0].runtime; for(inti=1;i { if(p[i-1].ftime>p[i].subtime) { p[i].stime=p[i-1].ftime; p[i].ftime=p[i-1].ftime+p[i].runtime;/*这里要特别小心,刚开始没考虑到下一个的开始时间可能大于上一个的结束时间*/ } else { p[i].stime=p[i].subtime; p[i].ftime=p[i].subtime+p[i].runtime; } } for(intj=0;j { p[j].ztime=p[j].ftime-p[j].subtime; p[j].dtime=p[j].ztime*1.0/p[j].runtime*1.0; sumztime+=p[j].ztime; sumdtime+=p[j].dtime; } avgztime=sumztime/n; avgdtime=sumdtime/n; } voidfcfs(job*p,intn) { sort(p,n); datahandle(p,n); cout<<"先来先服务算法"< output(p,n); } voidsjf(job*p,intn) { sort(p,n); for(inti=0;i { intk=0; if(i==0) p[i].ftime=p[i].subtime+p[i].runtime; else p[i].ftime=p[i].runtime+p[i-1].ftime; for(intj=i+1;j { if(p[j].subtime<=p[i].ftime) k++; } doubleminstime=p[i+1].runtime; intps=i+1; for(intm=i+1;m { if(p[m+1].runtime { minstime=p[m+1].runtime; ps=m+1; } } jobtemp; temp=p[i+1]; p[i+1]=p[ps]; p[ps]=temp; } datahandle(p,n); cout<<"短作业优先算法: "< output(p,n); } voidhrf(job*p,intn) { sort(p,n); for(inti=0;i { intk=0; if(i==0) p[i].ftime=p[i].subtime+p[i].runtime; else p[i].ftime=(p[i].runtime+p[i-1].ftime); for(intj=i+1;j { if(p[j].subtime<=p[i].ftime) k++; } doublemaxrratio=(p[i].ftime-p[i+1].subtime)/(1.0*p[i+1].runtime); intps=i+1; for(intm=i+1;m { if((p[i].ftime-p[m+1].subtime)/p[m+1].runtime>=maxrratio) { maxrratio=(p[i].ftime-p[m+1].subtime)/(1.0*p[m+1].runtime); ps=m+1; } } jobtemp; temp=p[i+1]; p[i+1]=p[ps]; p[ps]=temp; } datahandle(p,n); cout<<"高响应比优先算法: "< output(p,n); } 总结一下写代码时候遇到的问题和心得: 首先注意的是实验要求是用一整数表示时间,如10: 10,表示成1010。 但是这里特别要注意一小时是60分钟不是100分钟,所以我的思路是虽然你输入1010但是首先把这个时间转换成分钟,然后算出其他的时间(开始时间,结束时间,周转时间等等), 下面就是转换的方法。 p[i].subtime=(p[i].subtime)/100*60+p[i].subtime%100; p[i].runtime=(p[i].runtime)/100*60+p[i].runtime%100; 然后最后输出的时候再转换过来就行了! 但是我写的时候还是遇到了很多问题,比如第一个算法运行完了之后很多时间都变了,然后第二,三个算法的时候就错了! 少了初始化工作等! 写代码的时候没考虑到下一个作业开始的时间可能大于上一个作业结束时间的情况。 直接算出 p[i].ftime=p[i-1].ftime+p[i].runtime; 但是这是错误的,因为可能第一个结束的时候第二个还没开始的! 这是可能的! 最后运行很多例子后发现错误了,然后改成 if(p[i-1].ftime>p[i].subtime) { p[i].stime=p[i-1].ftime; p[i].ftime=p[i-1].ftime+p[i].runtime; } else { p[i].stime=p[i].subtime; p[i].ftime=p[i].subtime+p[i].runtime; } 所以写代码之前必须要考虑好各种情况。 最后说的是浮点数和整型数之间的问题! 比如计算带权周转时间的时候必须要(p[j].dtime=p[j].ztime*1.0/p[j].runtime*1.0)乘于1.0! 因为runtime,ztime是整型数! 其他的就没什么说的了! 代码加了一些注释的! 完完整整的写完这个代码后自己觉得还是蛮高兴地! 收获蛮多! 下面是代码的一些运行情况: (1)把书本是例子(80页)的运行结果,跟书本上的一样! (2)如果自己输入的顺序不是按时间顺序来输入的情况和第一个作业结束的时候第二个作业还没开始的情况!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 调度 算法 模拟