进程调度模拟设计先来先服务强占式短进程优先算法Word下载.docx
- 文档编号:19424607
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:19
- 大小:87.85KB
进程调度模拟设计先来先服务强占式短进程优先算法Word下载.docx
《进程调度模拟设计先来先服务强占式短进程优先算法Word下载.docx》由会员分享,可在线阅读,更多相关《进程调度模拟设计先来先服务强占式短进程优先算法Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
课程设计报告书
1.课程设计的题目
进程调度模拟设计——先来先服务、强占式短进程优先算法。
2.课程设计的目的
此次课程设计的预备内容是阅读操作系统的处理机管理章节内容,并对进程调度的功能以及进程调度算法有深入的理解和掌握。
完成此次模拟进程调度,需要处理一下的情形:
2能够选择不同的调度算法(先来先服务算法和强占式短进程优先算法);
⑵能够输入进程的基本信息(如进程名、到达时间和运行时间等);
3根据选择的调度算法显示进程调度队列;
4根据选择的调度算法计算平均周转时间和平均带权周转时间。
3.需求分析
进程调度模拟设计是本次课设的课题,根据其课程设计的目的和要求,对其需求分析如下所示:
3.1对进程信息的描述和实现
此次课程设计中,进程作为基本数据处理单元,需要对进程的基本信息进行相关的描述。
进程的基本信息包括进程进程名,到达的时间以及预计的进程运行时间。
设计一个模块,用以实现进程的基本信息的定义和封装,提高设计的简洁性,如使用类模块。
3.2对调度算法的描述和实现
进程基本信息所构成的模块作为基本单元,并且相关调度算法的侧重进程基本信息点不同,所以要根据其调度算法的特点来结合基本信息进行对应的设计。
此次课程设计要求的调度算法描述如下:
3.2.1先来先服务调度算法
先来先服务调度算法是以进程的到达时间为判断标准,按各个进程所的到达时间先后顺序进行调度。
要实现此先来先服务调度算法以及考虑程序的简洁性,用一个数据结构如优先级队列,容器等来存储进程基本信息,并要对所有的进程按其到达时间先后顺序进行排序,实现依次取出的进程是所有未运行进程中到达时间最早的进程。
3.2.2强占式短进程优先调度算法
此调度算法和先来先服务调度算法相区别,强占式短进程优先调度算法的实现相对而言较为复杂。
对强占式短进程优先调度算法而言,其本质特征便是按进程的预计运行时间长短进行排序,先执行短进程。
若内存中运行的进程优先级比就绪队列中的某进程优先级低(即运行的进程预计运行时间比就绪队列中的某进程长),此运行的进程让出内存并进入就绪队列,优先级更高的短进程强占内存资源并运行直到结束或者遇到优先级更高的进程强占为止。
3.3计算平均周转时间和平均带权周转时间
平均周转时间和平均带权周转时间是对调度算法进行评估的参考标准,在此次课设中要求计算出平均周转时间和平均带钱周转时间。
平均周转时间可由所有进程的周转时间之和除以进程数,同理平均带权周转时间也可如此求得。
3.4显示调度序列
按课程设计要求,要显示进程调度队列,并且还要求对平均周转时间和平均带权周转时间进行显示。
就先来先服务调度算法而言,要求显示的进程调度队列即是进程运行顺序(也就是进程到达时间先后顺序排序的队列);
而强占式短进程优先级调度算法中,为了简洁便利的因素以及直观性,所以就以进程完成运行的先后时间顺序进行显示。
4.功能设计
此次课设采用面向对象的方法进行对此进程调度系统的模拟。
以下分别就概要设计和详细设计先后进行功能设计的相关描述。
4.1概要设计
根据课设要求和需求分析的结果,设计了两个类模板,即process类和dispatch类。
process类用以描述进程的信息,其数据域有进程名(name),进程到达时间(start_time),进程预计运行时间(run_time)。
并设计了一个布尔变量bvisited标志进程是否运行结束,设计了一个变量end_time存储进程完全运行结束的时间点,用以辅助显示进程调度队列。
Process类声明如下:
classprocess{
friendstd:
:
istream&
operator>
>
(std:
input,process&
Process);
//友元函数process输入流
ostream&
operator<
<
output,process&
//友元函数process输出流
friendboolcompare_SF(process&
pro1,process&
pro2);
friendboolcompare_FSFC(process&
public:
process(){};
process(string_name,doublestime,doublertime);
boolSet_bvisited(boolvisited=true);
//设定或修改结束标志
boolGet_bvisited();
//取得结束标志
doubleGETstart_time();
//取得进程到达时间
doubleGETrun_time();
//取得进程预计运行时间
doubleSETend_time(doubletime);
//设置和修改end_time的值
doubleGETend_time();
//取得end_time的值
stringGETname();
//取得进程名
stringSETname(stringstr);
//设置或修改进程名
private:
stringname;
//进程名
doublestart_time,run_time,end_time;
//进程的到底时间,预计运行时间,完成时间
boolbvisited;
//标志进程状态是否已经执行结束
};
dispatch类用以描述调度算法的实现,其数据域有进程个数(count),总周转时间(Tse),总带权周转时间(Wi)。
在dispatch类中,还定义了一个优先级队列PQueue,一个普通队列Queue,以及一个vector容器。
dispatch类的声明如下:
classdispatch{
input,dispatch&
Dispatch);
//友元函数dispatch输入流
output,dispatch&
//友元函数dispatch输出流
intcount;
//定义变量表示进程process的个数
boolSF_FC;
//标志选择的调度算法类型
doubleTse,Wi;
//总周转时间和总带权周转时间
typedefbool(*compare_type)(process&
process&
);
//定义指向函数的指针,实现不同调度算法选择的实现
compare_typecompare_1,compare_2;
priority_queue<
process,vector<
process>
compare_type>
PQueue;
//定义按到达时间顺序的队列PQueue
queue<
Queue;
//定义此队列表示完成的进程
vector<
vec;
dispatch(boolsf_fc=true);
voidFCFS();
//先来先服务调度算法
voidShort_No1();
//强占式短进程优先调度算法
voidprint();
//显示调度队列的算法
dispatch类中PQueue队列用以存储所有输入的原有进程信息,并且其优先级是以到达时间的先后顺序而确定,即先到的进程排在前,后到的进程排在后。
Vector容器用以支持强占式短进程优先调度算法的实现,存储所有在当前时间点已经到达的进程信息,并每次存入新的进程信息时便对此vector中元素进行排序,其排序要求按预计运行的时间长短,即预计运行时间较短的进程排在预计运行时间较长的进程前面。
普通队列Queue用以存储完成运行的队列,其依旧按照队列的“先进先出”的属性,即把先运行完毕的进程排在前,后运行结束的进程排在后。
在此次设计中,设计了一个文本文档(lin.txt)用以存储进程信息,以文本的方式读入进程信息或写入进程信息,可以直接在lin.txt直接添加或删除进程信息。
设计了一个主函数,其中建立一个dispatch类对象,采用简单菜单模式。
4.2详细设计
界面设计不是本次课程设计的要求,所以就使用dos命令窗口。
而进程调度算法则是本次设计的核心部分,所以就此调度算法部分的逻辑进行阐释说明,进程调度算法的逻辑图如下所示:
4.2.1main函数以及进程信息的输入
用delete语句撤销dispatch对象
调用显示进程调度信息的算法print()
调用进程调度算法
根据满足要求的输入,调用dispatch的构造函数构生成相应的dispatch对象
输出选择进程调度算法的提示信息
关闭lin/.txt文档
从文本文档lin.txt读入进程信息
输入数据
满足要求
开始运行主函数
结束主函数的运行
否
是
图1
4.2.2先来先服务进程调度算法(FCFS)
调用FCFSS算法
输出错误提示
察看当前进程是否访问过?
取出第PQueue中的队首元素,即PQueue队列中到达时间最早的进程
按到达时间顺序排列的PQueue进程队列是否为空?
模拟运行该进程,对总周转时间,总带权周转时间进行赋值,对end_time(结束时间)点赋值。
并把当前进程插入Queue队列,并删除其在PQueue中的信息
队列PQueue
是否为空?
结束FCFS函数调用
图2
4.2.3强占式短进程优先进程调度算法(SF)
结束SF函数调用
调用SF算法
PQueue队列是空?
模拟当前进程运行结束,对总周转时间,总带权周转时间,以及运行结束时间点(end_time)赋值。
并把进程信息插入Queue队列,且删除其在vector中的进程信息
取PQueue队列第一个元素,即到达时间最早的进程进行模拟运行,并计算出不被强占情况下的结束时间点(atime)
取下一个运行进程的信息
在atime之前是否有进程到达?
PQueue队列为空?
Vector是否为空?
计算出当前系统时间点,并对运行中的进程进行的预计运行时间进行设置(此处以未标志bvisited时的end_time表示)。
并将此进程和所有其他新到达进程都插入vector之中进行排序(排序按预计运行时间短在前长居后),删除新到达的进程在PQeuee队列中的信息
取PQueue队列的队首元素
取vector第一个元素模拟运行
取出vector中的第一个元素进入模拟运行状态。
计算出此进程不被强占情况下的结束时间点(atime)
图3
5开发平台和源程序主要代码
5.1开发平台
本次课程设计编程部分采用MicrosoftVisualStudio2008。
5.2核心代码
5.2.1关于process类的部分函数
std:
Dispatch){//友元函数dispatch输入流
processPro1;
intcount1=0;
while(input>
(Pro1)){
Dispatch.PQueue.push(Pro1);
++count1;
}
Dispatch.count=count1;
cout<
"
共有进程数为"
Dispatch.count;
returninput;
}
Dispatch){//友元函数dispatch输出流
inti=1;
output<
共有的进程数目:
Dispatch.count<
endl;
进程名到达时间运行时间"
while(i<
=Dispatch.count){
cout<
...."
output<
Dispatch.PQueue.top()<
Dispatch.PQueue.pop();
++i;
....."
*******"
returnoutput;
boolcompare_SF(process&
pro2){
//比较进程预计运行时间长短
if(pro1.end_time!
=pro2.end_time)
returnpro1.end_time<
pro2.end_time;
else
returnpro1.start_time<
pro2.start_time;
boolcompare_FSFC(process&
pro2)
//比较进程到达时间早迟的函数实现{
returnpro1.start_time>
=pro2.start_time;
5.2.2dispatch类部分函数
//构造函数
dispatch(boolsf_fc=true):
count(0),SF_FC(sf_fc),Tse(0),Wi(0){
compare_1=&
compare_FSFC;
compare_2=&
compare_SF;
if(sf_fc==false){//当给定的标志为真时,表示FSFC调度算法
PQueue=priority_queue<
(compare_1);
cout<
选择的是最短进程优先(抢占式)调度算法"
}
else{
选择的是先来先服务调度算法"
//显示进程调度队列函数
voidprint(){
process*ptr;
inti=1;
//cout<
进程调度信息如下:
**运行顺序****进程名****到达时间****运行时间****结束时间****"
while(Queue.empty()==false){
ptr=&
Queue.front();
**"
i<
**********"
(*ptr).GETname();
(*ptr).GETstart_time();
(*ptr).GETrun_time();
(*ptr).GETend_time()<
*****"
++i;
Queue.pop();
平均周转时间:
(Tse/count)<
平均带权周转时间:
(Wi/count)<
Dispatch){
5.2.3先来先服务算法
voidFCFS(){//先来先服务的实现...
inti=0;
doubleatime;
//标志当前内存中进程结束的时间点
process*Pro1=&
PQueue.top();
//取队首元素
atime=(*Pro1).GETstart_time();
while(i<
count)
{
(*Pro1).Set_bvisited();
(*Pro1)<
"
atime=atime+(*Pro1).GETrun_time();
(*Pro1).SETend_time(atime);
if((*Pro1).Get_bvisited()){//如果当前进程已经完成服务功能
Tse=Tse+((*Pro1).GETend_time()-(*Pro1).GETstart_time());
Wi=Wi+((*Pro1).GETend_time()-(*Pro1).GETstart_time())/((*Pro1).GETrun_time());
Queue.push(*Pro1);
}
else{
cout<
error!
return;
PQueue.pop();
//删除队列中的队首元素
if(PQueue.empty()==false)
process*Pro1=&
5.2.4强占式短进程优先级算法
voidShort_No1(){
doubleatime;
//标志当前内存中进程结束的时间点
doublebtime;
//表示内存中进程剩余的运行时间
doublectime;
//表示执行顺序时间点
intcount1=count;
vector<
iteratoriter,iter1,iter2;
process*ptr=&
//对队首元素的end_time()进行初始化
(*ptr).SETend_time((*ptr).GETrun_time());
vec.push_back(PQueue.top());
//取出第一个到达的进程,放入vector
PQueue.pop();
iter=vec.begin();
ctime=(*iter).GETstart_time();
atime=(*iter).GETrun_time()+(*iter).GETstart_time();
while(count1>
0){
process*ptr;
if(PQueue.empty()==false){
ptr=&
(*ptr).SETend_time((*ptr).GETrun_time());
while(PQueue.empty()==false&
&
atime>
(*ptr).GETstart_time()){//如果在进程运行期间有进程到达
ctime=(*ptr).GETstart_time();
btime=atime-ctime;
(*iter).SETend_time(btime);
//设置运行进程的剩余时间
vec.push_back(*ptr);
//把到达的进程放进vector中
iter=vec.begin();
if((*iter).GETend_time()>
(*ptr).GETrun_time()){
atime=(*ptr).GETstart_time()+(*ptr).GETrun_time();
sort(vec.begin(),vec.end(),compare_2);
//若新进来的进程优先级高,则排序,令优先高的进程位置于vector第一个元素
iter=vec.begin();
if(PQueue.empty()==false){
PQueue.pop();
//删除在到达时间队列中的队首进程信息
if(PQueue.empty()==false)
ptr=&
//取得修改后的到达时间队列中的新队首进程
}
//找到优先级高的进程,则退出此循环,重新进行小进程运行并查找时候有更高优先级的进程到达
}
else{
if(PQu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 模拟 设计 先来先 服务 强占 优先 算法