操作系统原理短作业优先算法报告附源代码.doc
《操作系统原理短作业优先算法报告附源代码.doc》由会员分享,可在线阅读,更多相关《操作系统原理短作业优先算法报告附源代码.doc(8页珍藏版)》请在冰豆网上搜索。
中国地质大学(北京)
操作系统原理
实习报告
实习题目:
1、
2、
实习人员:
学号姓名(组长)
学号姓名
中国地质大学(北京)
课程名称:
操作系统原理成绩:
一、题目分析
在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证。
于是我们想到了一种办法解决这个问题,就是引用动态优先权、并使作业的优先级随着等待时间的增加而以速率a提高,长作业在等待一定的时间后,必然有机会分配到处理机,这样长作业也得到了运行。
设计并实现一个采用高响应比算法的进程调度演示程序,响应比R定义如下:
RWT/T1W/T其中T为该作业估计需要的执行时间,为作业在后备状态队列中的等待时W间。
每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。
这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。
这种算法是介于FCFS和SJF之间的一种折中算法。
由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRRN方式时其吞吐量将小于采用SJF法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加。
二、数据结构
结构体数组path[k]实现对进程响应比的计算
Path[max]实现对进程响应比的排序
Path[ii]实现程序的各阶段运行状况的输出
三、算法流程图
程序设计流程图
开始
读取进程
判断进程是否进入内存
对响应比排序高的进程先运行
等待
结束
是
是
高响应比函数执行过程流程图
开始
当前作业为依编号找到的第一个还未执行的作业
当前作业是最后一个作业
当前作业和下一个还没执行的作业比较
当前作业在上次作业被执行完之前到达
同时到达
当前作业取较早达到且响应比较高的一个
当前作业取较早到达的一个
当前作业取相应比较高的一个
返回这一次要执行的作业
四、重难点分析
计算每一个进程的动态优先权,需要在每执行一个进程之后计算一遍未执行进程的优先权,从中选出优先权最高的一个执行。
五、运行测试(截图)
六、分工
编码:
实验报告:
七、总结
本次演算实验主要对最高响应比算法的理解和对进程调度的功能以及进程调度算法有了深入的理解。
在这次的课程设计中,计算每一个进程的动态优先权,需要在每执行一个进程之后计算一遍未执行进程的优先权,从中选出优先权最高的一个执行,因为疏忽导致了响应比的计算错误,从而加大了完成代码的时间量。
对于这次出现的这个问题,使我有了对程序设计的严谨性,课本基础知识的理解程度上有了更深刻的认识,也让我明白到了基础知识的重要性。
完成此次课程实际之后,我对进程调度模拟设计的各种算法有了更进一步的理解,在编写程序中所遇到的问题让我有了对操作系统有了迫切要更深层次的掌握,并且感受到操作系统这门课程实在是很重要的一门课程。
通过本次实验对用高响应比算法的优先调度算法有了更深入的理解和掌握,进一步巩固和复习操作系统的基础知识,更进一步的了解了结构化模块化程序设计的方法,提高了调试程序的技巧。
八、附件:
源代码
#include
#include
#include
#defineMAXN1500
usingnamespacestd;
structnode
{
boolvis;//是否已执行
charname;//进程名称
intcome;//到达时间
intser;//服务时间
intst;//开始时间
intend;//结束时间
intzhouzhuan;//周转时间
doubleright,youxianji;//带全周转时间,动态优先权,
}path[MAXN];
intmain()
{
intn;
intans[MAXN];
cout<<"请输入进程的数目:
";
cin>>n;
cout<<"请依次输入每个进程的名字、到达时间、服务时间:
"<for(inti=0;i{
cin>>path[i].name>>path[i].come>>path[i].ser;
path[i].vis=false;
}
doublesum=0;
intinde=0;
intnow=0;
for(inti=0;i{
intj;
for(j=0;j{
if(path[j].come>now&&path[j].vis==false)
{
break;
}
}
doubleMAX=-9999;
intmax;
for(intk=0;k{
if(path[k].vis==false)
{
path[k].youxianji=(now-path[k].come+path[k].ser)/(1.0*path[k].ser);
if(MAX{
MAX=path[k].youxianji;
max=k;
}
}
}
path[max].st=now;
now+=path[max].ser;
path[max].end=now;
path[max].zhouzhuan=(path[max].end-path[max].come);
path[max].right=(path[max].zhouzhuan*1.0/path[max].ser);
ans[inde++]=max;
path[max].vis=true;
}
cout<<"进程开始时间结束时间周转时间带权周转时间"<for(inti=0;i{
sum+=path[i].right;
cout<path[i].st<<""<}
cout<<"平均带权时间:
"<return0;
}
任课教师:
刘传平日期:
年月日