进程调度模拟设计——优先级法、最高响应比优先调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附件1:
课程设计
进程调度模拟设计——优先级
题目
法、最高响应比优先调度算法
学院计算机科学与技术
专业计算机科学与技术
班级计算机科学与技术
姓名
指导教师
2011 年01 月18 日
课程设计任务书
学生姓名:专业班级:计算机科学与技术
指导教师:工作单位:计算机科学与技术学院
题目: 进程调度模拟设计——优先级法、最高响应比优先调度算法初始条件:
1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写
等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:年月日
系主任(或责任教师)签名:年月日
进程调度模拟设计
(优先级法、最高响应比优先调度算法)
1设计目的与实现功能
模拟进程调度,使程序能够完成:选择不同的调度算法(优先级法或者最高响应比法),选毕算法,能够输入若干进程,包括进程的一些基本信息,如进程名、优先级、到达时间和运行时间等;根据选择的调度算法显示进程调度队列;根据选择的调度算法计算平均周转时间和平均带权周转时间。
2需求分析
2.1实验原理
最高响应比优先算法(HRN):最高响应比是对先来先服务和最短进程优先法德一种综合平衡。
HRN调度策略同时考虑每个进程的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的进程投入执行。
响应比R定义如下:
R=(W+T)/T=1+W/T
其中T为该进程的估计需要的执行时间,W为进程在后备状态队列的等待时间。
每当要进行进程调度是,系统计算每个进程的响应比,选择其中R最大者投入执行。
优先级法:系统和用户按某种原则为进程制定一个优先级来表示该进程所享有的调度优先权。
根据优先级的高低来对进程加以调度。
3. 数据结构
3.1主要结构及函数
struct elment
{
char name[10]; //进程的名称
prigle pri;
int hour; //进程提交的时间(小时)
int min; //进程提交(分钟)
int time; //进程运行需要的时间
int time1; //记录进程开始运行的时间
int test; // 进程是否在等待的判断位
};
struct prigle
{
float prii; //记录进程优先级或者响应比
int num; //作用一:定位进程,作用二,标记进程是否运行
};
void input() //输入进程信息
void Getpriorder() //按优先级从大小排列进程
void HRN() //最高响应比算法
void Getorder() //与void Getpriorder() 连用,完成优先级算法最高响应比算法思路:
参数自己按照提示输入;中断时机,某进程执行完成;
调度算法思路:系统时间取的第一个进程的提交时间,并执行第一个进程;当某进程执行完成时,系统时间加上该完成进程的运行时间,并删除该节点。
3.2流程图
4. 源程序的主要部分
4.1,输入函数
void input() //输入进程信息
{
while(1)
{
int d=0;
cout<<"请输入第"<<all+1<<"个进程的名称,";
if(or==1)cout<<"优先级,";
cout<<"到达时间,运行时间"<<endl;
scanf("%s",e[all].name);
if(or==1)cin>>e[all].pri.prii;
else e[all].pri.prii=0;
fflush(stdin);
char t[5];
scanf("%s",&t);
d=(t[0]-48)*10+(t[1]-48);
if(d>24||d<0)
{
cout<<"输入有误(24小时形式),请重新输入"<<endl;
continue;
}
e[all].pri.num=all;
e[all].hour=d;
d=(t[3]-48)*10+(t[4]-48);
e[all].min=d;
e[all].test=0;
cin>>e[all].time;
e[all].time1=e[all].hour*60+e[all].min;
all++;
int test1;
cout<<endl;
cout<<"是否继续输入,继续输入请按1,否则按其他键";
cin>>test1;
if(test1!=1)break;
}}
4.2,最高响应比
void HRN() //最高响应比算法
{
elment temp=e[0];
for(int i=1;i<all;i++)if(temp.time1>e[i].time1)temp=e[i];
a1[0]=temp.pri.num;
e[a1[0]].pri.num=-1;
for(int j=0;j<all-1;j++)
{
for(int k=0;k<all;k++)
{
if(e[k].pri.num==-1)continue;
if(e[k].time1<temp.time1+temp.time)e[k].time1=temp.time1+temp.time;
}
for(int t=0;t<all;t++)
{
if(e[t].pri.num==-1)continue;
e[t].pri.prii=(e[t].time1-e[t].hour*60-e[t].min)/e[t].time;
}
for(int h=0;h<all;h++)
{
if(e[h].pri.num==-1)continue;
if(temp.pri.prii<e[h].pri.prii)temp=e[h];
}
a1[j+1]=temp.pri.num;
e[a1[j+1]].pri.num=-1;
}
}
4.3优先级算法
void Getorder() //与void Getpriorder() 连用,完成优先级算法
{
elment temp=e[0];//temp1[9];
int n=0;
for(int i=0;i<all;i++)
{
// if(temp.time1==e[i].time1)temp1[n++]=e[i];
if(temp.time1>e[i].time1)
{
temp=e[i];
n=0;
}
}
a1[0]=temp.pri.num;
e[a1[0]].pri.num=-1;
for(int k=0;k<all;k++)
{
if(k==a1[0])continue;
if(e[k].time1<(e[a1[0]].time1+e[a1[0]].time))
{
e[k].test=1;
e[k].time1=e[a1[0]].time1+e[a1[0]].time;
}
}
n=0;
for(int h=0;h<all-1;h++)
{
for(int count=0;count<all;count++)
if((e[count].hour*60+e[count].min)<(temp.time1+temp.time))e[count].test=1;
for(int t=0;t<all;t++)
{
if(e[a[t]].pri.num==-1)continue;
if(e[a[t]].test==1)
{
temp=e[a[t]];
a1[++n]=temp.pri.num;
e[a[t]].pri.num=-1;
break;
}
}
for(int r=0;r<all;r++)
{
if(e[r].pri.num==-1)continue;
if(e[r].time1<(temp.time1+temp.time))
e[r].time1=temp.time1+temp.time;
}
}
int p=0;
for(int l=0;l<all-1;l++)p+=a1[l];
a1[++n]=all*(all-1)/2-p;
}
4.4输出函数
void output()
{
cout<<"*********************************"<<endl;
cout<<"进程调度详情如下所示"<<endl;
cout<<"进程名称";
if(or==1)cout<<"优先级";
cout<<"到达时间"<<"开始时间"<<"结束时间"<<"运行时间"<<"周转时间"<<"带周转时间"<<endl;
float etime=0.0;
float etime1=0.0;
for(int i=0;i<all;i++)
{
cout<<" "<<e[a1[i]].name<<'\t'<<" ";
if(or==1) cout<<e[a1[i]].pri.prii<<'\t'<<" ";
if(e[a1[i]].hour<10)cout<<"0"<<e[a1[i]].hour<<":"<<e[a1[i]].min<<"
else cout<<e[a1[i]].hour<<":"<<e[a1[i]].min<<" ";
if(e[a1[i]].time1/60<10)cout<<"0"<<e[a1[i]].time1/60<<":";
else cout<<e[a1[i]].time1/60<<":";
if(e[a1[i]].time1%60<10)cout<<"0"<<e[a1[i]].time1%60<<'\t';
else cout<<e[a1[i]].time1%60<<'\t';
if((e[a1[i]].time1/60+e[a1[i]].time)<10)cout<<"0"<<(e[a1[i]].time1+e[a1[i]].time )/60<<":";
else cout<<(e[a1[i]].time1+e[a1[i]].time)/60<<":";
if((e[a1[i]].time1+e[a1[i]].time)%60<10)cout<<"0"<<(e[a1[i]].time1+e[a1[i]].tim e)%60<<'\t'<<" ";
else cout<<(e[a1[i]].time1+e[a1[i]].time)%60<<'\t'<<" ";
cout<<e[a1[i]].time<<'\t'<<" ";
int zhou=e[a1[i]].time1-e[a1[i]].hour*60-e[a1[i]].min+e[a1[i]].time;
cout<<zhou<<" "<<'\t'<<" ";
float zhou1=float(zhou)/float(e[a1[i]].time);
etime1+=zhou1;
cout<<zhou1<<endl;
etime+=float(e[a1[i]].time1-e[a1[i]].hour*60-e[a1[i]].min+e[a1[i]].time);
}
cout<<"平均周转时间:"<<etime/all<<"(minute)"<<endl;
cout<<"平均带权周转时间:"<<etime1/all<<"(minute)"<<endl;
cout<<"*********************************"<<endl;
}
5测试
1.优先级算法
输入测试用例:
名称优先级到达时间运行时间(分)
Li 2 12:30 30
Ji 3 12:35 25
Ha 4 12:39 20
An 1 12:25 15
分析:输入了四个进程;首先找出最先到达的进程,虽然an进程优先级最低,但来的最早,进程an运行完毕后,找出就绪的进程,在就绪的进程中,选出优先级高的,经分析,进程运行的先后顺序为an ha ji li经计算,运算结果合乎程序的运行情况。
2.最高响应比
测试用例
名称到达时间运行时间(分)
Li 08:30 30
An 08:35 25
Ji 08:40 19
分析:
首先找出最先到达的进程,本例为:li
然后计算相应比:
R(ji)=1+20/19
R(an)=1+25/25
显然R(ji)>R(an),所以先运行ji,再运行an,尽管进程an到达的时间比进程ji到达的时间早。
6.自我评价与总结
6.1自我认为出色的地方
本次课程设计,我的题目是:进程的模拟调度,用优先级算法和最高响应比实现。
我的程序采用数组形式实现,并且定义了结构体,用结构体来记录存储进程的具体信息:
struct elment
{
char name[10]; //进程的名称
prigle pri;
int hour; //进程提交的时间(小时)
int min; //进程提交(分钟)
int time; //进程运行需要的时间
int time1; //记录进程开始运行的时间
int test; // 进程是否在等待的判断位
};
struct prigle
{
float prii; //记录进程优先级或者响应比
int num; //作用一:定位进程,作用二,标记进程
是否运行
};
自我感觉,在结构体中,对struct prigle中的num,prii的运用比较充分,满意,num开始时用作定位进程的标志,当使用过后将num的值置为-1以表示该进程已经运行过。
Prii在最高响应比算法中用于存储计算得来的响应比,在优先级算法中用于存储进程的优先级。
整个结构体的运用都很充分。
6.2不足与完成本题的其它方法
本题采用数组形式实现的,这也就决定了程序不能动态的实现,即,输入的进程的个数是有限的,本程序使用大量的for循环,如果输入的进程的数量较大的话,势必会影响程序的运行速度。
对此类问题,以后要仔细观察,进行代码优化。
另一种方法当时用链表实现进程的模拟调度,定义一个结构体,用该结构体的变量作为节点,其他方法类似于数组形式实现。
6.3总结
本次课程设计,收获不小,但暴露的问题也不少,首当其冲的是考虑问题不严谨,对程序的大体进程能做到熟练掌握,但是在小的地方容易疏忽,本次实验给我影响留下最深刻的是temp变量,只注意使用它,结果没注意用完之后对程序的影响,结果花了很大的力气才找到错误源头,类似的问题比较多。
不过本次课程设计收获还是很大的,以前编程序是很怕的,现在变得比较愉快了。
本科生课程设计成绩评定表班级:姓名:学号:
分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2010 年月日。