进程调度模拟设计先来先服务非强占式短进程优先算法.docx
《进程调度模拟设计先来先服务非强占式短进程优先算法.docx》由会员分享,可在线阅读,更多相关《进程调度模拟设计先来先服务非强占式短进程优先算法.docx(15页珍藏版)》请在冰豆网上搜索。
进程调度模拟设计先来先服务非强占式短进程优先算法
目录
课程设计任务书2
进程调度模拟设计
——先来先服务、非强占式短进程优先算法3
1.设计题目3
2.设计要求3
3.理论知识3
3.1名词概念3
3.2算法评价5
4.主要程序........................6
5.运行结果11
6.心得小结12
本科生课程设计成绩评定表13
课程设计任务书
学生姓名:
专业班级:
指导教师:
罗芳工作单位:
计算机科学与技术学院
题目:
进程调度模拟设计——先来先服务、非强占式短进程优先算法
初始条件:
1.预备内容:
阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
进程调度模拟设计
——先来先服务、非强占式短进程优先算法
1.设计题目
进程调度模拟设计——先来先服务、非强占式短进程优先算法
2.设计要求
1.模拟进程调度,能够处理以下的情形:
⑴能够选择不同的调度算法(要求中给出的调度算法);
⑵能够输入进程的基本信息,如进程名、到达时间和运行时间等;
⑶根据选择的调度算法显示进程调度队列;
⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
3.理论知识
3.1名词概念
(1)进程
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:
第一,进程是一个实体。
每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。
文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。
程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
进程是操作系统中最基本、重要的概念。
是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
(2)进程调度
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。
另外,系统进程也同样需要使用处理机。
这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
(3)先来先服务法(FCFS)
先来先服务调度算法是以进程的到达时间为判断标准,按各个进程的到达时间先后顺序进行调度。
要实现此先来先服务调度算法以及考虑程序的简洁性,用一个数据结构如优先级队列,容器等来存储进程基本信息,并要对所有的进程按其到达时间先后顺序进行排序,实现依次取出的进程是所有未运行进程中到达时间最早的进程。
(4)非剥夺方式
分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。
(5)短进程优先法(SJF)
选择那些估计需要执行时间最短的作业投入执行,为它们创建进程和分配资源。
直观上来说,采用此调度算法,可使系统在同一时间内处理的作业个数最多,从而吞吐量也就大于其他调度方式。
但是,对于一个不断有作业进入的批处理系统来说,此法有可能使得那些长作业永远得不到调度执行的机会。
(6)周转时间
作业i的周转时间Ti为
Ti=Tei-Tsi(其中Tei为作业i的完成时间,Tsi为作业的提交时间。
)
对于被测定作业流所含的n(n>=1)个作业来说,其平均周转时间为:
T=1/n(T1+T2+T3......Tn)
一个作业的周转时间说明了该作业在系统内停留的时间,包含两部分:
一为等待时间;二为执行时间,即:
Ti=Twi+Tri
(这里,Twi主要指作业i由后备状态到执行状态的等待时间,它不包括作业进入执行状态后的等待时间。
(7)带权周转时间
作业的周转时间包含了两个部分,即等待时间和执行时间。
为了更进一步反映调度性能,使用带权周转时间的概念。
带权周转时间是作业周转时间与作业执行时间的比:
Wi=Ti/Tri
对于被测定作业流所含的几个作业来说,其平均带权周转时间为:
W=1/n(W1+W2+W3+......+Wn)
3.2算法评价
(1)先来先服务法(FCFS)
a.该算法原理简单,易于实现。
b.各进程平等竞争。
c.由于各进程执行的时间不一样,从而导致相对不公平现象的产生。
d.该算法有利于长进程,不利于短进程。
e.该算法很少用来作为主调度策略,常常用作辅助调度算法使用
(2)短进程优先法(SJF)
a.优点
(1)短作业(SJF)的调度算法可以照顾到实际上在所有作业中占很大比例的短作业,使它能比长作业优先执行。
采用SJF算法后,不论是平均周转时间还是平均带权周转时间都有较明显的改善。
(2)SJF调度算法能有效地降低作业的平均等待时间和提高系统的吞吐量。
b.缺点
(1)该算法对长作业非常不利,更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将致使长作业(进程)得不到调度。
(2)该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程),回得到及时处理;
(3)由于作业(进程)的长短只是根据用户所提供的估计执行时间而定,而用户又可能会有意或无意地缩短其作业的估计执行时间,致使该算法不一定能真正做到短作业优先调度。
4.主要程序
(1)类结构如下
structpro
{structprocess{
doublectime;
doubleutime;
doubletime;
stringname;};
(2)主程序
intmain(){
processp;
vectorps;
charch;
cout<<"*******************************************"<cout<<"**"<cout<<"*模拟进程调度的时间是以十进制方式实现的。
*"<cout<<"**"<cout<<"*******************************************"<cout<do{
cout<<"请输入进程的基本信息:
"<creat(ps,p);
cout<<"是否继续输入(是'Y'):
";
ch=_getch();
cout<}while(ch=='y'||ch=='Y');
cout<cout<<"输入的进程信息为:
"<print(ps);
do{
cout<cout<<"----=算法菜单=------"<cout<<"s-非抢占短进程优先算法"<cout<<"f-先来先服务算法"<cout<<"e-退出"<ch=_getch();
switch(ch)
{
case's':
sp_serve(ps);
break;
case'f':
fc_serve(ps);
break;
case'e':
break;
default:
cout<<"操作错误!
"<}
cout<}while(ch!
='e');
return0;
}
(3)FCFS算法程序
boolcompare(constprocess&x,constprocess&y){
returnx.ctime}
doubletime1(vector&ps){
doublex=0;
for(vector:
:
size_typei=0;i{
if(i==0){ps[0].time=ps[0].utime;x=x+ps[0].utime+ps[0].ctime;}
else
{
if(xelse{ps[i].time=x+ps[i].utime-ps[i].ctime;x=x+ps[i].utime;}
}
}
x=0;
for(vector:
:
size_typej=0;jx=x+ps[j].time;
return(x/ps.size());
}
doubletime2(vector&ps){
doublex=0;
for(vector:
:
size_typej=0;jx=x+ps[j].time/ps[j].utime;
return(x/ps.size());
}
voidprintf(vector&ps){
if(ps.size()==0){cout<<"无进程"<cout<for(vector:
:
size_typei=0;icout<cout<}
voidfc_serve(vector&ps){
sort(ps.begin(),ps.end(),compare);
cout<doublex,y;
x=time1(ps);
y=time2(ps);
cout<<"先来先服务算法进程执行顺序"<printf(ps);
cout<<"先来先服务算法评价:
"<cout<<"平均周转时间为:
"<cout<<"平均带权周转时间为:
"<}
(4)SJF算法程序
boolcompare0(constprocess&x,constprocess&y){
returnx.utime}
vectorselect(vector&ps,vector&p){
vector:
:
iteratoriter0=ps.begin();
vector:
:
iteratoriter1=iter0+1;
if(ps.size()==0||iter1==ps.end())
returnps;
while(iter1->ctime==iter0->ctime)
iter1=iter1+1;
if(iter1!
=iter0+1)
sort(iter0,iter1,compare0);
for(;iter0!
=iter1;++iter0)p.push_back(*iter0);
doublex=0;
for(vector:
:
size_typei=0;i
x=x+p[0].ctime+p[i].utime;
while(iter1!
=ps.end()){
for(;iter1!
=ps.end()&&iter1->ctime<=x;++iter1);
if(iter0==iter1){p.push_back(*iter0);x=x+iter0->utime;++iter0;++iter1;}
else{
sort(iter0,iter1,compare0);
if(iter1==ps.end()){
for(;iter0!
=iter1;++iter0)
p.push_back(*iter0);
returnp;
}
p.push_back(*iter0);
x=x+iter0->utime;
++iter0;
}
}
returnp;
}
voidsp_serve(vector&ps){
sort(ps.begin(),ps.end(),compare);
vectorp;
p=select(ps,p);
cout<doublex,y;
x=time1(p);
y=time2(p);
cout<<"非抢占短进程优先算法进程执行顺序"<printf(p);
cout<<"非抢占短进程优先算法评价:
"<cout<<"平均周转时间为:
"<cout<<"平均带权周转时间为:
"<}
(5)程序完善
a.进程名重复
voidcreat(vector&ps0,process&p0){
//cout<p1:
cout<<"进程名:
";
stringname0;
cin>>name0;
if(!
flag(ps0,name0)){cout<<"进程名已经存在!
重新输入:
"<p0.name=name0;
cout<<"到达时间(十进制数):
";
cin>>p0.ctime;
cout<<"估计运行时间(十进制数):
";
cin>>p0.utime;
p0.time=0;
ps0.push_back(p0);
}
b.无进程
voidprint(vector&ps){
if(ps.size()==0){cout<<"无进程"<cout<for(vector:
:
size_typei=0;icout<cout<}
c.操作错误
switch(ch)
{
case's':
sp_serve(ps);
break;
case'f':
fc_serve(ps);
break;
case'e':
break;
default:
cout<<"操作错误!
"<}
cout<5.运行结果
(1)输入信息
(2)先来先服务算法
(3)非抢占短进程优先算法
6.心得小结
(1)此次课程设计中,做得比较好的是直接把进程信息设定为一个结构体,如此以来对进程的操作比较方便,实现了基本信息的有效封装。
还有就是对SJF算法的实现,我充分运用了链表知识,实现了对数据的动态存储。
还有,利用了bool型的compare语句实现了将进程的到达时间从小到大排列,很不错。
(2)对于缺点也是显而易见,此程序过于重复,使结果太过冗长。
没有将重复部分进行整合。
(3)我还意识到理论学习与实际操作有很大差距。
在今后的课程学习中,我会认真对待每一次实践机会,努力提高自己的上机操作能力,让自己的编程能力更上一层楼。
我还会继续学习计算机操作系统,相信它会给我带来更大收获。
(4)对于我的缺点,我会通过继续对c++的学习来弥补,提高。
(5)对于操作系统的题目推荐,我没有太多想法,只觉得应与书本贴合。
过于难的题目不切实际,也没有必要。
本科生课程设计成绩评定表
班级:
计算机科学与技术 姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2012年 1月 日