操作系统课程设计 进程调度模拟设计先来先服务优先级法Word文档格式.docx
《操作系统课程设计 进程调度模拟设计先来先服务优先级法Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计 进程调度模拟设计先来先服务优先级法Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结。
时间安排:
设计安排3周:
查阅、分析资料1天
系统软件的分析与建模4天
系统软件的设计5天
系统软件的实现3天
撰写文档1天
课程设计验收答辩1天
设计验收安排:
设计周的第三周的指定时间到实验室进行上机验收。
设计报告书收取时间:
课程设计验收答辩完结时。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
2013年12月10日
系主任(或责任教师)签名:
课程设计报告书
1.需求分析
1.1设计目的
(1)阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
(2)掌握一种计算机高级语言的使用。
1.2程序流程图
1.3设计要求
(1)能够选择不同的调度算法(要求中给出的调度算法);
(2)能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;
(3)根据选择的调度算法显示进程调度队列;
(4)根据选择的调度算法计算平均周转时间和平均带权周转时间。
2.功能设计
2.1数据结构
1.进程的结构定义:
structprocess
{
charname[10];
//进程名
intno;
//进程序号
doublearrivetime;
//进程达到时间
doubleneedtime;
//进程运行时间
doublestarttime;
//进程开始时间
doubleendtime;
//进程结束时间
intstate;
//进程状态,0表示未执行,1表示已执行
intpriority;
//进程优先级
process*next;
process*head=Null;
intcount;
};
2.使用链表存储进程并按照到达时间排序
、
voidinsert(process*current)
if(head!
=Null)
{
if(head->
next==Null)
//如果只有一个节点
{
if(current->
arrivetime<
head->
arrivetime)//如果比链头到达时间早,则插入链头
{
current->
next=head;
head=current;
}
else
next=Null;
head->
next=current;
}
else
//如果至少两个节点
process*p1=head;
if(head->
arrivetime>
current->
arrivetime)
{
current->
head=current;
intflag=1;
while(p1->
next!
=Null)//当head后面不为空时一直做
{
//如果在两个节点间
if(p1->
arrivetime<
arrivetime&
&
p1->
next->
arrivetime)
current->
next=p1->
next;
p1->
flag=0;
break;
}
elsep1=p1->
}
//如果到达时间最大,则插到链尾
if(flag=1)
p1->
current->
}
elsehead=current;
}
2.2先来先服务算法设计
1.FCFS算法说明
将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。
在该算法中,每个作业或进程按照它们在队列中等待时间长短来决定它们是否优先享受服务。
在没有特殊理由要优先调度某类作业或进程时,从处理的角度来看,FCFS方式是一种最合适的方法,因为无论是追加还是取出一个队列元素在操作上都是最简单的。
2.创建进程
voidcreateFCFS()
process*q1=newprocess;
cout<
<
"
请输入进程总数目"
;
cin>
>
count;
endl;
intnumber=1;
while(number<
=count)
{
q1=newprocess;
q1->
no=number;
进程序号"
number<
进程名称"
q1->
name;
进程到达时间"
arrivetime;
进程运行时间"
needtime;
next=NULL;
insert(q1);
number++;
endl<
}
3.进程调度及输出结果
voidprintFCFS()
{
process*p=newprocess;
doublesystime=0;
//记录系统时间
doubleturn=0;
//平均周转时间
doubleturnw=0;
//平均带权周转时间
if(head==NULL)
没有进程调度"
//处理第一个
elseif(head!
=NULL)
head->
starttime=head->
arriveTime;
endtime=head->
arrivetime+head->
systime=head->
endtime;
turn=turn+(head->
endtime-head->
arrivetime);
turnw=turnw+(head->
arrivetime)/head->
p=head->
while(p!
if(p->
arrivetime>
systime)//如果前一个结束后一个还没到达
{
p->
starttime=p->
endtime=p->
starttime+p->
systime=p->
endTime;
turn=turn+(p->
endtime-p->
turnw=turnw+(p->
arrivetime)/p->
p=p->
}
else//如果前一个未结束时后一个已经到达
starttime=systime;
cout.setf(ios:
:
left);
//设置对齐方式为left
setw(10)<
进程名"
到达时间"
开始时间"
执行时间"
结束时间"
process*temp=head;
while(temp!
=NULL)
temp->
no<
name<
arriveTime<
startTime<
needTime<
endTime<
temp=temp->
平均周转时间"
turn/count<
平均带权周转时间"
turnw/count<
//清空链表
while(head->
=NULL)//回收空间
process*t=newprocess;
t=head->
next=t->
deletet;
head=NULL;
}
2.3优先级算法的设计
1.PIRO算法及说明
优先级法可被用作作业或进程的调度策略。
首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。
该算法的核心是确定进程或作业的优先级。
确定优先级的方法可分为两类。
即动态法和静态法静态法根据作业或进程的静态特性,在作业或进程开始执行之前就确定它们的优先级,一旦开始执行之后就不能改变。
动态法则不然,它把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过程,其优先级不断变化。
静态优先级中,可以由用户自己根据作业的紧急程度输入一个适当的优先级,为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用;
也可以由系统或操作员根据作业类型指定优先级。
动态优先级中,基于静态优先级的调度算法实现简单,系统开销小,但由于静态优先级一旦确定之后,直到执行结束为止始终保持不变,从而系统效率较低,调度性能不高。
现在的操作系统中,如果使用优先级调度的话,则大多采用动态优先级的调度策略。
voidcreatePRIO()
process*q1=newprocess;
=count)
优先级"
priority;
needTime;
3.把最先达到的进程的排在链头,后面的进程按优先级大小重新排序
voidchangePRIO(doublesystime)
//把最先到达的放到链头然后后面的结点按照优先级来排序
//排序的前提是结点数至少是3个从第二个开始和后面的比较
if(count>
2)
process*n0=head;
process*n1=n0->
process*n2=n1->
for(inti=0;
i<
count-1;
i++)
while(n1!
=NULL&
n2!
n1->
=systime&
n2->
=systime)
{
//如果前面的优先级大于后面的优先级,则交换
if(n1->
priority<
priority)
{
next=n2->
n0->
next=n2;
next=n1;
n1=n0->
n2=n0->
}
n0=n1;
n1=n2;
n2=n2->
}
}
4.输出调度结果
voidprintPRIO()
doublesysTime=0;
//记录系统时间
if(head==NULL)
没有进程调度!
else
//先把最先到达的输出,然后再根据系统时间和优先级判断后续的进程
state=1;
//判断后面的
changePRIO(doublesystime);
//如果优先级最大的进程已经到达,则执行
state==0)
p->
arrivetime+p->
elsep=p->
priority<
cout<
平均周转时间:
平均带权周转时间:
3.源程序的主要部分
主程序主要完成调用各个函数完成相应的功能,以及选择调度算法的输出提示,根据提示并完成相应的算法实现过程。
//程序主要部分
intmain()
intchoice;
//选择服务
intgo=1;
while(go)
cout<
------------"
进程调度模拟设计"
1.先来先服务算法"
2.优先级法"
3.退出"
请选择:
cin>
choice;
switch(choice)
case1:
FCFS();
break;
//调用先来先服务算法
case2:
PRIO();
//调用优先计算法
case3:
退出"
go=0;
//退出,返回首页
default:
选择有误,请重新输入选择!
system("
pause"
);
return0;
voidFCFS()
createFCFS();
printFCFS();
voidPRIO()
createPRIO();
//changePRIO();
printPRIO();
4.程序测试
4.1先来先服务测试用例
进程序号
进程名称
到达时间
执行时间
1
a
4
2
b
3
c
d
4.2先来先服务运行结果
优先级
6
5
4.3先来先服务测试用例
4.4优先级算法运行结果
5.自我评价与总结
本次课程设计的内容基本上是老师在课堂上所讲的,所以我还是比较熟悉先来先服务算法和优先级算法。
看到这个题目时,我还是感觉相当轻松的,因为我还是比较熟悉该内容,比较熟悉算法思想。
设计过程中要注意流程的条理清晰,易于读懂和规划,程序编写完成以后,实现了预期的效果,达到了设计的要求。
界面设计比较清晰明了,易于阅读和理解。
本程序中,有些地方有重复,可以通过设计函数来简化程序,例如程序的创建,可以通过函数调用来实现,从而不必在两个算法中分别编写。
编写程序时要先画出程序的流程图是非常有必要的,根据流程图的顺序来实现程序,并要注意合理的使用函数调用来使程序得到简化,并且易读易懂。
编写程序的时候一定要先画流程图,对应流程图设计函数来简化程序。
这次课程设计中比较失败的地方就是优先级算法的输出开始时间和结束时间出了点问题。
这次课程设计使得我受益匪浅,尤其是对优先级调度分析方法有了更深的理解和掌握。
通过这次课程设计,我的编程能力又得到了进一步的提高,同时也培养了我的思维能力。
总的说来,这次课程设计不仅丰富了我的理论知识,也加强了我的动手能力,还锻炼了我的思维能力。
在实验程序编写和调试过程中我学会了很多,也认识到了自己的不足,我还需要进一步的努力,以致取得更大的进步。
我需要的就是要对自己有信心,脚踏实地,持之以恒,遇到困难时要冷静思考,勇敢面对,直到得出结果。
在实验设计过程中,我也养成了较好地习惯,先有框架,然后跟着框架发展,最后就是要注重细节,要做到严谨和缜密。
不可否认这种好习惯让我受益无限,我也必须拥有它,以致我获得更多。
6.源程序
#include<
iostream.h>
stdlb.h>
iomanip.h>
//进程达到时间
//进程运行时间
//进程开始时间
//进程结束时间
//进程状态
//进程优先级
voidFCFS();
voidPRIO();
voidcreateFCFS();
voidinsert(process*current);
voidprintFCFS();
voidcreatePRIO();
voidchangePRIO(doublesystime);
voidprintPRIO();