进程调度模拟优先级和最高响应比完整代码在另一个文档里面可以运行的Word文档格式.docx
- 文档编号:22103896
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:35
- 大小:344.35KB
进程调度模拟优先级和最高响应比完整代码在另一个文档里面可以运行的Word文档格式.docx
《进程调度模拟优先级和最高响应比完整代码在另一个文档里面可以运行的Word文档格式.docx》由会员分享,可在线阅读,更多相关《进程调度模拟优先级和最高响应比完整代码在另一个文档里面可以运行的Word文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
6.自我评价与总结25
6.1自我评价25
6.2经验与收获25
6.3对算法改进的想法27
本科生课程设计成绩评定表28
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
计算机科学与技术学院
题目:
进程调度模拟设计——优先级法、最高响应比优先调度算法
初始条件:
1.预备内容:
阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
进程调度模拟设计
——优先级法、最高响应比优先调度算法
1.课程设计目的与功能描述
1.1目的描述
学习完《计算机操作系统》这门专业课后,对计算机操作系统的组成和功能有了一定的了解;
基于此,在掌握操作系统实现进程调度以及对进程调度算法了解的基础上,编写一个程序,来模拟计算机操作系统进程的调度过程,从而加深对计算机操作系统进程调度各算法的在认识和理解;
我抽到的题目为:
进程调度模拟设计——优先级法、最高响应比优先调度算法。
1.2功能描述
此次我编写程序为C++语言模拟进程调度的程序,主要功能有:
[1]选择不同的调度算法,主要为选择优先级法、最高响应比优先调度算法;
[2]输入进程的基本信息,如进程名、优先级、到达时间和运行时间;
[3]根据选择的调度算法显示进程调度队列;
[4]根据选择的调度算法计算平均周转时间和平均带权周转时间并显示。
[5]对基本的输入错误进行处理,如:
输入进程信息时要求进程名不能相同,到达时间、运行时间和优先级必须为正等输入错误。
2.需求分析
2.1基本原理
2.1.1优先级调度算法
优先级法可被用作作业或进程的调度策略。
首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。
该算法的核心是确定进程或作业的优先级,此次课程设计采用静态优先级。
作业调度中的静态优先级大多按以下原则确定:
[1]由用户自己根据作业的紧急程度输入一个适当的优先级。
为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用。
[2]由系统或操作员根据作业类型指定优先级。
作业类型一般由用户约定或由操作员指定。
可将作业分为:
I/O繁忙的作业、CPU繁忙的作业、I/O与CPU均衡的作业、一般作业等,系统或操作员可以给每类作业指定不同的优先级。
[3]系统根据作业要求资源情况确定优先级。
例如根据估计所需处理机时间、内存量大小、I/O设备类型及数量等,确定作业的优先级。
进程的静态优先级确定原则可以是:
Ø
按进程的类型给予不同的优先级。
例如,在有些系统中,进程被划分为系统进程和用户进程。
系统进程享有比用户进程高的优先级。
对于用户进程来说,则可以分为:
I/O繁忙的进程、CPU繁忙的进程、I/O与CPU均衡的进程、其他进程。
对系统进程,也可以根据其所要完成的功能划分为不同的类型,例如,调度进程、I/O进程、中断处理进程、存储管理进程等。
将作业的静态优先级作为它所属进程的优先级。
2.2.2最高响应比调度算法
最高响应比优先法(HRN)是对FCFS方式和SJF方式的一种综合平衡。
HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
响应比R定义:
R=(W+T)/T=1+W/T
其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。
每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。
这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。
2.2基本需求设计
程序实现模拟进程调度的优先级调度算法和最高响应比调度算法;
基本需求设计如下:
进程信息的输入、输出采用命令行界面;
程序执行过程如下:
首先输入进程信息,可连续添加;
其次选择调度算法:
优先级和最高响应比调度算法;
然后根据选择的调度算法,执行相关函数,显示进程调度序列,输出总进程周转时间、总带权周转时间、平均周转时间、平均带权周转时间;
最后可再次选择调度算法、重新创建进程链、销毁进程链,如果选择销毁进程队列,则退出程序。
3.程序设计
3.1数据结构
此次课程设计的存储结构采用链表的数据结构,用链表的各个接点保存进程的相关信息,可实现对进程链的排序、删除、比较查找等。
存储结构如下:
structProcess{
Process*pNext;
stringname;
//进程名
doublereadytime;
//进程提交时间
doubleruntime;
//运行时间
doublepriority;
//进程的优先级
};
3.2模块说明
3.2.1主要函数模块及功能
主要函数模块及功能如下:
Process*Add(Process*pHead)
功能:
主要完成要求用户输入进程的相关信息:
进程名、进程提交时间、进程运行时间、进程优先级;
按输入的提交时间的先后顺序组织进程链,同时对用户的一些简单的错误输入进行处理。
Process*Copy(Process*pHead)
实现对用户创建的进程链的深复制,由于要进行多次的进程调度,而每次的调度均会删除进程链中的各个接点,直至链表为空,因此要将原进程链保存,每次只是对复制链进行操作。
Process*Destroy(Process*pHead)
实现对进程各个接点的销毁回收。
voidHrn(Process*pHead,intn)
最高响应比调度算法执行函数,采用最高响应比的调度算法,实现对进程链的执行,并输出周转时间、带权周转时间、平均周转时间、平均带权周转时间。
voidHighpriority(Process*pHead,intn)
优先级调度算法执行函数,采用高优先级调度算法,实现对进程链的执行,并输出周转时间、带权周转时间、平均周转时间、平均带权周转时间。
intmain()
程序的入口,提供人机交互函数,提示用户创建进程序列,选择调度算法。
3.2.2模块框图
主函数模块
销毁进程链模块
最高响应比调度模块
优先级调度模块
输入进程模块
图3-1
3.2.4程序流程图
本次程序流程图如下
图3-2
优先级调度算法流程图:
图3-3
最高响应比调度算法流程图:
图3-4
4.开发平台及源程序的主要部分
4.1开发平台
开发环境:
Windows7平台
开发平台:
VC++6.0
4.2源程序的主要部分
输入进程信息源程序:
{
intmksure=1,i=1;
//用来判断是否继续输入的标志
cout<
<
"
*****************<
请输入进程队列!
>
***********************************\n"
;
while(mksure==1)
{Process*p,*q;
p=newProcess;
cout<
请输入第"
i<
个进程的信息:
endl;
进程名:
"
cin>
p->
name;
do{cout<
提交时间:
cin>
readytime;
if(p->
readytime<
0)
cout<
输入时间有误,重新输入!
}while(p->
0);
运行时间:
runtime;
runtime<
优先级:
priority;
priority<
输入优先级有误,重新输入!
p->
pNext=NULL;
if(pHead==NULL)//假如链表为空,加到链表头
{pHead=p;
}
else//其他情况
{q=pHead;
while(q)
{if(p->
name==q->
name)
{cout<
你输入的进程名字与已创建进程重名,请重新输入!
break;
}
elseq=q->
pNext;
}
if(q)
{continue;
i-}
else
{q=pHead;
while(q)
{if((q->
pNext!
=NULL)&
&
(p->
readytime>
=q->
pNext->
readytime))//当q节点的下一结点不为空,或提交时间小于要添加节点的提交时间
q=q->
elsebreak;
//如果要加入进程提交时间早于头结点,将该节点作为头结点
if(q==pHead&
q->
p->
readytime)
{pHead=p;
p->
pNext=q;
//如果加入的进程提交时间早于q节点进程,则将其插入q之前
else
{p->
pNext=q->
q->
pNext=p;
}}}
继续添加?
是-1,否-0\n"
你的选择:
mksure;
if(mksure==1){
i++;
---------------------------------\n"
}}
进程队列创建完毕!
*********************************\n"
returnpHead;
}
优先级调度算法源程序:
Process*p,*cpHead,*p1;
Process*flag=NULL;
Process*q=NULL;
doubletime=0,j=0,runTime=0,drunTime=0;
intxuhao=0;
stringpname[MAX_NUM];
for(intss=0;
ss<
MAX_NUM;
ss++)
pname[ss]="
cpHead=Copy(pHead);
if(cpHead==NULL)
return;
优先级调度算法,进程调度结果如下:
****************\n"
顺序进程名优先级开始时间结束时间周转时间带权周转时间\n"
p=cpHead;
while(cpHead)
{q=cpHead;
if(time<
readytime)//如果进程提交时间早于要比较的进程,则先执行
time=p->
flag=cpHead;
while(q&
readytime<
=time)
{if(q->
priority>
flag->
priority)//比较进程的优先级
flag=q;
q=q->
if(time<
readytime)//如果上一次结束时间比当前选中要执行进程的结束时间小
time=flag->
//则当前进程开始时间为提交时间
setw(4)<
xuhao+1;
setw(8)<
flag->
time;
setw(10)<
(time+flag->
runtime);
(time-flag->
readytime+flag->
setw(11)<
(double)((time-flag->
runtime)/flag->
runtime)<
j=(time-flag->
//当前执行进程的周转时间
runTime+=j;
//记录周转时间
time+=flag->
drunTime=drunTime+j/flag->
//带权周转时间
pname[xuhao]=flag->
xuhao++;
//将执行过的进程从链表中删除
if(flag==cpHead)//最先开始执行的进程就在链表头
cpHead=cpHead->
else{//最先开始执行的进程在链表中
p1=cpHead;
while(p1->
=flag)
p1=p1->
p1->
pNext=flag->
deleteflag;
//删除这个进程所占的节点
}}
进程执行顺序为:
n;
{cout<
pname[ss];
if(pname[ss+1]!
="
)
cout<
->
总周转时间为:
runTime<
总带权周转时间为:
drunTime<
平均周转时间为:
runTime/n<
平均带权周转时间为:
drunTime/n<
进程执行结束!
************************************\n"
最高响应比调度算法源程序:
voidHrn(Process*pHead,intn)
doubletime=0,j=0,runTime=0,drunTime=0;
最高响应比优先算法,进程调度结果如下:
***********\n"
readytime)//如果该进程提交时间早于其它进程,则先执行该进程
//用于暂存将要执行的进程
//计算当前链表中进程的响应比
while(q&
{
if((time-q->
readytime)/(q->
runtime)>
(time-flag->
readytime)/(flag->
runtime))
}
readytime)//如果上一次结束时间比当前选中要执行进程的结束时间小
j=(time-flag->
readytime+flag->
runTime+=j;
time+=flag->
drunTime+=j/flag->
//将执行过的进程从链表中删除
if(flag==cpHead)//在链表头
else
{//在链表中
{out<
主函数源程序如下:
{
\t\t*****************************************************"
\t\t*欢迎使用模拟进程调度程序!
*"
\t\t*当前没有可执行进程,进程请先创建进程!
\t\t*输入的提交时间、运行时间、优先级均需大于零!
Process*pHead=NULL;
pHead=Add(pHead);
Output(pHead);
charagain;
do{
*********************************************************************\n"
//输入选择的算法
intdecision;
\t\t*请选择进程调度算法!
\t\t*1.优先级调度算法!
\t\t*2.最高响应比优先算法!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 模拟 优先级 最高 响应 完整 代码 另一个 文档 里面 可以 运行